├── .eslintrc.json ├── .gitattributes ├── .github └── workflows │ └── node.yml ├── .gitignore ├── .mailmap ├── .npmignore ├── CONTRIBUTING.md ├── Gruntfile.js ├── LICENSE.txt ├── README.md ├── entries2html.xsl ├── fixture ├── entries │ └── addClass.xml ├── pages │ ├── Hello_World.html │ └── Mark.md └── resources │ └── x.txt ├── index.js ├── lib ├── highlight.js ├── lineNumberTemplate.jst └── util.js ├── package-lock.json ├── package.json ├── tasks ├── build-xml.js ├── build.js ├── jquery-xml │ ├── all-entries.xml │ ├── all-entries.xsl │ ├── cat2tax.xsl │ ├── entries2html-base.xsl │ └── xml2json.xsl ├── redirects.js └── wordpress.js └── test ├── build.test.js ├── expected └── wordpress │ ├── posts │ ├── page │ │ └── pages │ │ │ ├── Hello_World.html │ │ │ └── Mark.html │ └── post │ │ └── addClass.html │ └── resources │ └── resources │ └── x.txt └── lint.test.js /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | 4 | "extends": "jquery", 5 | 6 | "reportUnusedDisableDirectives": true, 7 | 8 | "env": { 9 | "es2023": true, 10 | "node": true 11 | }, 12 | 13 | "rules": { 14 | "strict": [ "error", "global" ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # JS files must always use LF for tools to work 5 | *.js eol=lf 6 | -------------------------------------------------------------------------------- /.github/workflows/node.yml: -------------------------------------------------------------------------------- 1 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs 2 | 3 | name: Node.js 4 | 5 | on: 6 | - push 7 | - pull_request 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | strategy: 15 | matrix: 16 | node-version: [18.x, 20.x] 17 | 18 | steps: 19 | - name: Install Debian packages 20 | run: sudo apt-get install -y libxml2-utils xsltproc 21 | - uses: actions/checkout@v3 22 | - name: Install Node.js ${{ matrix.node-version }} 23 | uses: actions/setup-node@v3 24 | with: 25 | node-version: ${{ matrix.node-version }} 26 | cache: 'npm' 27 | - run: npm ci 28 | - run: npm test 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /test/dist 3 | -------------------------------------------------------------------------------- /.mailmap: -------------------------------------------------------------------------------- 1 | Michał Gołębiowski-Owczarek 2 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /.* 2 | /fixture 3 | /test 4 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Welcome! Thanks for your interest in contributing to grunt-jquery-content. You're **almost** in the right place. More information on how to contribute to this and all other jQuery Foundation projects is over at [contribute.jquery.org](http://contribute.jquery.org). You'll definitely want to take a look at the articles on contributing [code](http://contribute.jquery.org/code). 2 | 3 | You may also want to take a look at our [commit & pull request guide](http://contribute.jquery.org/commits-and-pull-requests/) and [style guides](http://contribute.jquery.org/style-guide/) for instructions on how to maintain your fork and submit your code. Before we can merge any pull request, we'll also need you to sign our [contributor license agreement](http://contribute.jquery.org/cla). 4 | 5 | You can find us on [IRC](http://irc.jquery.org), specifically in #jquery-content should you have any questions. If you've never contributed to open source before, we've put together [a short guide with tips, tricks, and ideas on getting started](http://contribute.jquery.org/open-source/). 6 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports = function( grunt ) { 4 | grunt.initConfig( { 5 | xmllint: { 6 | all: [ 7 | "fixture/entries/**", 8 | "entries2html.xsl" 9 | ] 10 | }, 11 | "build-posts": { 12 | page: "fixture/pages/**" 13 | }, 14 | "build-resources": { 15 | all: "fixture/resources/**" 16 | }, 17 | "build-xml-entries": { 18 | all: "fixture/entries/**" 19 | }, 20 | wordpress: { 21 | url: "example.org", 22 | username: "admin", 23 | password: "admin", 24 | dir: "test/dist/wordpress" 25 | } 26 | } ); 27 | 28 | grunt.loadTasks( "tasks" ); 29 | 30 | grunt.registerTask( "lint", [ "xmllint" ] ); 31 | grunt.registerTask( "build", [ "build-posts", "build-resources", "build-xml-entries" ] ); 32 | }; 33 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright jQuery Foundation and other contributors, https://github.com/jquery/grunt-jquery-content 2 | Copyright Scott González, http://scottgonzalez.com 3 | 4 | The following license applies to all parts of this software except as 5 | documented below: 6 | 7 | ==== 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining 10 | a copy of this software and associated documentation files (the 11 | "Software"), to deal in the Software without restriction, including 12 | without limitation the rights to use, copy, modify, merge, publish, 13 | distribute, sublicense, and/or sell copies of the Software, and to 14 | permit persons to whom the Software is furnished to do so, subject to 15 | the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be 18 | included in all copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 24 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | 28 | ==== 29 | 30 | All files located in the node_modules directory and 31 | tasks/jquery-xml/xml2json.xsl are externally maintained libraries used 32 | by this software which have their own licenses; we recommend you read 33 | them, as their terms may differ from the terms above. 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Tested with QUnit](https://img.shields.io/badge/tested_with-qunit-9c3493.svg)](https://qunitjs.com/) 2 | 3 | # grunt-jquery-content 4 | 5 | A collection of Grunt tasks for deploying jQuery documentation sites. 6 | 7 | This module builds on top of [node-wordpress](https://github.com/scottgonzalez/node-wordpress) and the [Gilded WordPress](https://github.com/scottgonzalez/gilded-wordpress) plugin. See the Gilded WordPress documentation for details on the [directory structure and file formats](https://github.com/scottgonzalez/gilded-wordpress#directory-structure). 8 | 9 | ## Getting started 10 | 11 | Prerequisites: 12 | 13 | * Install the gilded-wordpress.php plugin on your WordPress site (copy from [Gilded WordPress](https://github.com/scottgonzalez/gilded-wordpress)). 14 | * Depending on what kind of files you want to upload as "resources", you may need to configure WordPress to allow more permissive uploads. See the [Gilded WordPress documentation](https://github.com/scottgonzalez/gilded-wordpress#permissive-uploads) for how to do this. 15 | 16 | Basic set up for your project: 17 | 18 | 1. add `wordpress` configuration to Gruntfile.js. 19 | 2. add `build-posts` task configuration to Gruntfile.js. 20 | 3. add `grunt.registerTask( "build", [ "build-posts" ] );` to Gruntfile.js 21 | 22 | You can now use `grunt wordpress-deploy` to build and deploy your project. 23 | 24 | The `wordpress-deploy` task is a tree of the following tasks: 25 | 26 | * `wordpress-deploy` 27 | * `build-wordpress` 28 | * `check-modules` 29 | * `lint` (empty placeholder by default) 30 | * `clean-dist` 31 | * `build` (undefined by default) 32 | * `wordpress-publish` 33 | * `wordpress-validate` 34 | * `wordpress-sync` 35 | 36 | The following optional tasks are made available to use via the `lint` or `build` phase: 37 | 38 | * lint: 39 | * `xmllint` 40 | * build: 41 | * `build-posts` 42 | * `build-resources` 43 | * `build-xml-entries` 44 | * `build-xml-categories` 45 | * `build-xml-full` 46 | 47 | ## Config 48 | 49 | ```javascript 50 | grunt.initConfig({ 51 | wordpress: { 52 | url: "wordpress.localhost", 53 | username: "admin", 54 | password: "admin", 55 | dir: "dist" 56 | } 57 | }); 58 | ``` 59 | 60 | * `url`: The URL for the WordPress install. 61 | Can be a full URL, e.g., `http://wordpress.localhost:1234/some/path` 62 | or as short as just the host name. 63 | If the protocol is `https`, then a secure connection will be used. 64 | * `host` (optional): The actual host to connect to if different from the URL, e.g., when deploying to a local server behind a firewall. 65 | * `username`: WordPress username. 66 | * `password`: WordPress password. 67 | * `dir`: Directory containing posts, taxonomies, and resources. 68 | * See the [Gilded WordPress documentation](https://github.com/scottgonzalez/gilded-wordpress#directory-structure) for details on the directory structure and file formats. 69 | 70 | ## Tasks 71 | 72 | ### clean-dist 73 | 74 | This task removes all files in the `dist/` directory. 75 | 76 | ### lint 77 | 78 | This is an empty task list by default. If the site contains any lint checks, they should be defined here. For example, API documentation sites should have the following task list: 79 | 80 | ```javascript 81 | grunt.registerTask( "lint", [ "xmllint" ] ); 82 | ``` 83 | 84 | ### build-posts 85 | 86 | ```javascript 87 | grunt.initConfig({ 88 | "build-posts": { 89 | page: "pages/**" 90 | }, 91 | }); 92 | ``` 93 | 94 | This multi-task takes a list of html or markdown files, copies them to `[wordpress.dir]/posts/[post-type]/`, processes `@partial` entries and highlights the syntax in each. The keys are the post types for each set of posts. 95 | 96 | See the [`postPreprocessors` export](#postpreprocessors) for a hook to implement custom processing. 97 | 98 | ### build-resources 99 | 100 | This mult-task copies all source files into `[wordpress.dir]/resources/`. 101 | 102 | ```javascript 103 | grunt.initConfig({ 104 | "build-resources": { 105 | all: "resources/**" 106 | }, 107 | }); 108 | ``` 109 | 110 | ### xmllint 111 | 112 | This multi-task lints XML files to ensure the files are valid. 113 | 114 | ### build-xml-entries 115 | 116 | This multi-task generates HTML files to be published to WordPress by parsing the source XML files and transforming them through `entries2html.xsl`. The generate files are copied to `[wordpress.dir]/posts/post/`. 117 | 118 | The content repo must create its own `entries2html.xsl` file which must import `node_modules/grunt-jquery-content/tasks/jquery-xml/entries2html-base.xsl`. 119 | 120 | ### build-xml-categories 121 | 122 | This task reads `categories.xml` from the root of the content repo and generates `[wordpress.dir]/taxonomies.json`. 123 | 124 | `categories.xml` should have the following format: 125 | 126 | ```xml 127 | 128 | 129 | A description of the category. 130 | 131 | HTML!]]> 132 | 133 | 134 | This category is boring. 135 | 136 | 137 | ``` 138 | 139 | Code examples in the descriptions will be syntax highlighted. 140 | 141 | ### build-xml-full 142 | 143 | This task generates a single XML file that contains all entries and stores the result in `[wordpress.dir]/resources/api.xml`. 144 | 145 | ### wordpress-validate 146 | 147 | Walks through the `wordpress.dir` directory and performs various validations, such as: 148 | 149 | * Verifying that XML-RPC is enabled for the WordPress site. 150 | * Verifying that the custom XML-RPC methods for gilded-wordpress are installed. 151 | * Verifying the taxonomies and terms in `taxonomies.json`. 152 | * Verifying that child-parent relationships for posts are valid. 153 | * Verifying data for each post. 154 | 155 | ### wordpress-sync 156 | 157 | Synchronizes everything in `wordpress.dir` to the WordPress site. 158 | This will create/edit/delete terms, posts, and resources. 159 | 160 | *Note: `wordpress-validate` must run prior to `wordpress-sync`.* 161 | 162 | ### wordpress-publish 163 | 164 | Alias task for `wordpress-validate` and `wordpress-sync`. 165 | This is useful if your original source content is already in the proper format, 166 | or if you want to manually verify generated content between your custom build and publishing. 167 | 168 | ### wordpress-deploy 169 | 170 | Alias task for `build-wordpress` and `wordpress-publish`. 171 | This is useful if you are generating content for use with `wordpress-sync`. 172 | Simply create a `build-wordpress` task that populates the `wordpress.dir` directory 173 | and your deployments will be as simple as `grunt wordpress-deploy`. 174 | 175 | ### deploy 176 | 177 | Alias task for `wordpress-deploy`. 178 | 179 | Since most projects that use grunt-jquery-content have one deploy target (WordPress), 180 | there is a built-in `deploy` task that just runs `wordpress-deploy`. 181 | 182 | If your project has other deploy targets, you can redefine `deploy` as an alias that runs both `wordpress-deploy` and your other deployment-related tasks. 183 | 184 | ## Page content 185 | 186 | The following features are available in pages built via the `build-posts` task. 187 | 188 | ### Markdown 189 | 190 | Using markdown files provides additional features over HTML files. By default, links for each header are automatically generated for markdown files. 191 | 192 | In addition to the [standard metadata](https://github.com/scottgonzalez/gilded-wordpress#post-files) for post files, the following properties can be set: 193 | 194 | * `noHeadingLinks`: When set to `false`, heading links won't be generated. 195 | * `toc`: When set to `true`, a table of contents will be inserted at the top of the post based on the headings within the post. 196 | 197 | ### `@partial` 198 | 199 | Usage: 200 | 201 | ```html 202 |
@partial(resources/code-sample.html)
203 | ``` 204 | 205 | Where `resources/code-sample.html` is a relative path in the current directory. That html file will be inserted, escaped and highlighted. 206 | 207 | ### `@placeholder` 208 | 209 | Inside markup included with `@partial`, you can mark sections of code as `@placeholder` code, to be excluded from the inserted code, replaced with an html comment. 210 | 211 | Usage: 212 | 213 | ```html 214 | regular markup will show up here 215 | 216 | this will be replaced 217 | 218 | other content 219 | ``` 220 | 221 | That will result in: 222 | 223 | ```html 224 | regular markup will show up here 225 | 226 | other content 227 | ``` 228 | 229 | ## Exports 230 | 231 | The grunt-jquery-content module primarily registers Grunt tasks, but it also exports some methods through the `require()` API. 232 | 233 | ### `syntaxHighlight( content )` 234 | 235 | Syntax highlights content. 236 | 237 | * `content` String: The string the highlight. 238 | 239 | ### `postPreprocessors` 240 | 241 | Hooks for modifying the posts before they're processed in the [`build-posts`](#build-posts) task. 242 | 243 | `postPreprocessors` is a hash of preprocessors, where the key is the post type and the value is a function which modifies the post. 244 | 245 | The functions must be in the form of: 246 | `function( post, fileName, callback )` 247 | 248 | * `post` Object: The post being processed. 249 | * `fileName` String: The name of the file used to generate the post object. 250 | * `callback` function( error, post ): Callback to invoke after modifying the post. 251 | * `error`: An `Error` instance, if there was an error while modifying the post. 252 | * `post` The modified post. 253 | 254 | By default, posts are placed in the `[wordpress.dir]/[post-type]` directory using the same relative path and file name as the source file. The relative path can be changed by setting the `fileName` property on the post. 255 | 256 | If a preprocessor is not defined for the given post type, then the `_default` preprocessor will be used. 257 | -------------------------------------------------------------------------------- /entries2html.xsl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <!doctype html> 7 | <style> </style> 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /fixture/entries/addClass.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | .addClass() 4 | 5 | 1.0 6 | 7 | One or more space-separated classes to be added. 8 | 9 | 10 | 11 | 1.4 12 | 13 | A function returning one or more space-separated class names. 14 | 15 | 16 | 17 | 18 | 19 | Adds the specified class(es) to each element in the set of matched elements. 20 | 21 |

This method does not replace a class. It simply adds the class.

22 |

23 | $( "p" ).addClass( "myClass yourClass" );
24 |     
25 |

The .addClass() method changes the className property on the selected elements.

26 |
27 | 28 | Add the class "selected" to the matched elements. 29 | 41 | Hello

43 |

and

44 |

Goodbye

45 | ]]> 46 |
47 | 48 | 49 | 50 |
51 | -------------------------------------------------------------------------------- /fixture/pages/Hello_World.html: -------------------------------------------------------------------------------- 1 | 6 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pellentesque placerat arcu, vel viverra augue posuere commodo. Aenean hendrerit quam sed commodo pellentesque.

7 |

Donec sed commodo velit, non molestie justo.

8 |

Phasellus

9 |

Cras vel justo molestie lorem auctor convallis. Donec ac lacus tincidunt, euismod lectus eu, pulvinar tortor.

10 |
 Hello.world({
11 |    // Handle the event
12 |    // ......
13 |  });
14 | 
15 |

Sed sed molestie purus

16 |

Aliquam venenatis sem elit, et aliquet libero ultrices vitae. Nullam rutrum convallis justo, sed suscipit leo facilisis et. 17 |

18 | -------------------------------------------------------------------------------- /fixture/pages/Mark.md: -------------------------------------------------------------------------------- 1 | 4 | 5 | **Conubia linguae** hydrae novissima recepto certe, clarus quod amictus tum ignota fluctibus *et quod*, est verba capitum, variusque. Sui saevam gentes propiora Cycladas, Hecate stamina nurus ramum! 6 | 7 | ## Oculi miserarum 8 | 9 | Lorem [markdownum](https://en.wikipedia.org/wiki/Markdown) silentia umerique, colla. Per felix innoxia pariterque capillos accessit, nec ad tempore in nubes detrahitur. 10 | 11 | Aures precantibus supplice Medusaeo, Lycormas est esse aestuat aut Pterelas. 12 | 13 | ## Domitos interea 14 | 15 | 1. Non torsi numine amor 16 | 2. Tamen vino hinc indignatus aquas iunguntur sacrifica 17 | 3. Solitum bacae tellure ille 18 | -------------------------------------------------------------------------------- /fixture/resources/x.txt: -------------------------------------------------------------------------------- 1 | x 2 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const syntaxHighlight = require( "./lib/highlight" ); 4 | 5 | exports.syntaxHighlight = syntaxHighlight; 6 | 7 | exports.postPreprocessors = { 8 | _default( post, _fileName, callback ) { 9 | callback( null, post ); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /lib/highlight.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const fs = require( "fs" ); 4 | const hljs = require( "highlight.js" ); 5 | const cheerio = require( "cheerio" ); 6 | const he = require( "he" ); 7 | const grunt = require( "grunt" ); 8 | const lineNumberTemplate = fs.readFileSync( __dirname + "/lineNumberTemplate.jst", "utf-8" ); 9 | 10 | // When parsing the class attribute, make sure a class matches an actually 11 | // highlightable language, instead of being presentational (e.g. 'example') 12 | function getLanguageFromClass( str ) { 13 | var classes = ( str || "" ).split( " " ), 14 | i = 0, 15 | length = classes.length; 16 | 17 | for ( ; i < length; i++ ) { 18 | if ( hljs.getLanguage( classes[ i ].replace( /^lang-/, "" ) ) ) { 19 | return classes[ i ].replace( /^lang-/, "" ); 20 | } 21 | } 22 | 23 | return ""; 24 | } 25 | 26 | function outdent( string ) { 27 | var rOutdent, 28 | adjustedLines = [], 29 | minTabs = Infinity, 30 | rLeadingTabs = /^\t+/; 31 | 32 | string.split( "\n" ).forEach( function( line, i, arr ) { 33 | 34 | // Don't include first or last line if it's nothing but whitespace 35 | if ( ( i === 0 || i === arr.length - 1 ) && !line.trim().length ) { 36 | return; 37 | } 38 | 39 | // For empty lines inside the snippet, push a space so the line renders properly 40 | if ( !line.trim().length ) { 41 | adjustedLines.push( " " ); 42 | return; 43 | } 44 | 45 | // Count how many leading tabs there are and update the global minimum 46 | var match = line.match( rLeadingTabs ), 47 | tabs = match ? match[ 0 ].length : 0; 48 | minTabs = Math.min( minTabs, tabs ); 49 | 50 | adjustedLines.push( line ); 51 | } ); 52 | 53 | if ( minTabs !== Infinity ) { 54 | 55 | // Outdent the lines as much as possible 56 | rOutdent = new RegExp( "^\t{" + minTabs + "}" ); 57 | adjustedLines = adjustedLines.map( function( line ) { 58 | return line.replace( rOutdent, "" ); 59 | } ); 60 | } 61 | 62 | return adjustedLines.join( "\n" ); 63 | } 64 | 65 | function syntaxHighlight( html ) { 66 | 67 | // The third parameter is `false` to disable wrapping contents 68 | // in `...`, etc. 69 | var $ = cheerio.load( html, null, false ); 70 | 71 | $( "pre > code" ).each( function() { 72 | var $t = $( this ), 73 | code = he.decode( outdent( $t.html() ) ), 74 | lang = $t.attr( "data-lang" ) || 75 | getLanguageFromClass( $t.attr( "class" ) ) || 76 | ( code.trim().charAt( 0 ) === "<" ? "xml" : "" ) || 77 | "javascript", 78 | linenumAttr = $t.attr( "data-linenum" ), 79 | linenum = parseInt( linenumAttr, 10 ) || 1, 80 | gutter = linenumAttr !== "false", 81 | highlighted = hljs.highlight( code, { language: lang } ), 82 | fixed = highlighted.value.replace( /\t/g, " " ); 83 | 84 | // Handle multi-line comments (#32) 85 | fixed = fixed.replace( 86 | /\/\*([^<]+)\*\/<\/span>/g, 87 | function( _full, comment ) { 88 | return "/*" + 89 | comment.split( "\n" ).join( "\n" ) + 90 | "*/"; 91 | } 92 | ); 93 | 94 | $t.parent().replaceWith( grunt.template.process( lineNumberTemplate, { 95 | data: { 96 | lines: fixed.split( "\n" ), 97 | startAt: linenum, 98 | gutter: gutter, 99 | lang: lang 100 | } 101 | } ) ); 102 | } ); 103 | 104 | return $.html(); 105 | } 106 | 107 | module.exports = syntaxHighlight; 108 | -------------------------------------------------------------------------------- /lib/lineNumberTemplate.jst: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | <% if (gutter) { %> 6 | 11 | <% } %> 12 | 15 | 16 | 17 |
7 | <% _.forEach(lines, function(line, i) { %> 8 |
<%= i + startAt %>
9 | <% }); %> 10 |
13 |
<% _.forEach(lines, function(line, i) { %>
<%= line %>
<% }); %>
14 |
18 |
19 | -------------------------------------------------------------------------------- /lib/util.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const fs = require( "fs" ); 4 | const marked = require( "marked" ); 5 | 6 | function htmlEscape( text ) { 7 | return text 8 | 9 | // Supports keeping markup in source file, but drop from inline sample 10 | .replace( 11 | /[\s\S]+@placeholder-end -->/g, 12 | ( _match, input ) => "" 13 | ) 14 | .replace( /&/g, "&" ) 15 | .replace( //g, ">" ) 17 | .replace( /"/g, """ ) 18 | .replace( /'/g, "'" ); 19 | } 20 | 21 | function parseMarkdown( src, options ) { 22 | var toc = "", 23 | tokens = marked.lexer( src ), 24 | links = tokens.links; 25 | 26 | if ( !options.generateLinks ) { 27 | return marked.parser( tokens ); 28 | } 29 | 30 | tokens.forEach( function( item ) { 31 | if ( item.type !== "heading" ) { 32 | return; 33 | } 34 | 35 | // Store original text and create an id for linking 36 | var parsedText = marked.marked( item.text ); 37 | parsedText = parsedText.substring( 3, parsedText.length - 5 ); 38 | item.tocText = parsedText.replace( /<[^>]+>/g, "" ); 39 | item.tocId = item.tocText 40 | .replace( /\W+/g, "-" ) 41 | .replace( /^-+|-+$/, "" ) 42 | .toLowerCase(); 43 | 44 | // Convert to HTML 45 | item.type = "html"; 46 | item.pre = false; 47 | 48 | // Insert the link 49 | item.text = "" + 50 | "" + 51 | "link" + 52 | " " + parsedText + ""; 53 | 54 | if ( options.generateToc ) { 55 | toc += new Array( ( item.depth - 1 ) * 2 + 1 ).join( " " ) + "* " + 56 | "[" + item.tocText + "](#" + item.tocId + ")\n"; 57 | } 58 | } ); 59 | 60 | if ( options.generateToc ) { 61 | tokens = marked.lexer( toc ).concat( tokens ); 62 | 63 | // The TOC never generates links, so we can just copy the links directly 64 | // from the original tokens. 65 | tokens.links = links; 66 | } 67 | 68 | return marked.parser( tokens ); 69 | } 70 | 71 | async function eachFile( files, stepFn ) { 72 | for ( const fileName of files ) { 73 | if ( !fs.statSync( fileName ).isFile() ) { 74 | continue; 75 | } 76 | await stepFn( fileName ); 77 | } 78 | } 79 | 80 | exports.htmlEscape = htmlEscape; 81 | exports.parseMarkdown = parseMarkdown; 82 | exports.eachFile = eachFile; 83 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grunt-jquery-content", 3 | "version": "3.3.2", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "grunt-jquery-content", 9 | "version": "3.3.2", 10 | "dependencies": { 11 | "cheerio": "^1.0.0-rc.12", 12 | "gilded-wordpress": "1.0.7", 13 | "grunt-check-modules": "^1.1.0", 14 | "he": "^1.2.0", 15 | "highlight.js": "^10.7.2", 16 | "marked": "^4.0.0", 17 | "which": "^4.0.0", 18 | "wordpress": "^1.4.1" 19 | }, 20 | "devDependencies": { 21 | "eslint": "^8.53.0", 22 | "eslint-config-jquery": "3.0.2", 23 | "grunt": "^1.6.1", 24 | "qunit": "^2.20.0" 25 | } 26 | }, 27 | "node_modules/@aashutoshrathi/word-wrap": { 28 | "version": "1.2.6", 29 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 30 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 31 | "dev": true, 32 | "engines": { 33 | "node": ">=0.10.0" 34 | } 35 | }, 36 | "node_modules/@eslint-community/eslint-utils": { 37 | "version": "4.4.0", 38 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 39 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 40 | "dev": true, 41 | "dependencies": { 42 | "eslint-visitor-keys": "^3.3.0" 43 | }, 44 | "engines": { 45 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 46 | }, 47 | "peerDependencies": { 48 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 49 | } 50 | }, 51 | "node_modules/@eslint-community/regexpp": { 52 | "version": "4.10.0", 53 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", 54 | "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", 55 | "dev": true, 56 | "engines": { 57 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 58 | } 59 | }, 60 | "node_modules/@eslint/eslintrc": { 61 | "version": "2.1.3", 62 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", 63 | "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", 64 | "dev": true, 65 | "dependencies": { 66 | "ajv": "^6.12.4", 67 | "debug": "^4.3.2", 68 | "espree": "^9.6.0", 69 | "globals": "^13.19.0", 70 | "ignore": "^5.2.0", 71 | "import-fresh": "^3.2.1", 72 | "js-yaml": "^4.1.0", 73 | "minimatch": "^3.1.2", 74 | "strip-json-comments": "^3.1.1" 75 | }, 76 | "engines": { 77 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 78 | }, 79 | "funding": { 80 | "url": "https://opencollective.com/eslint" 81 | } 82 | }, 83 | "node_modules/@eslint/eslintrc/node_modules/argparse": { 84 | "version": "2.0.1", 85 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 86 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 87 | "dev": true 88 | }, 89 | "node_modules/@eslint/eslintrc/node_modules/js-yaml": { 90 | "version": "4.1.0", 91 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 92 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 93 | "dev": true, 94 | "dependencies": { 95 | "argparse": "^2.0.1" 96 | }, 97 | "bin": { 98 | "js-yaml": "bin/js-yaml.js" 99 | } 100 | }, 101 | "node_modules/@eslint/js": { 102 | "version": "8.53.0", 103 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", 104 | "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", 105 | "dev": true, 106 | "engines": { 107 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 108 | } 109 | }, 110 | "node_modules/@humanwhocodes/config-array": { 111 | "version": "0.11.13", 112 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", 113 | "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", 114 | "dev": true, 115 | "dependencies": { 116 | "@humanwhocodes/object-schema": "^2.0.1", 117 | "debug": "^4.1.1", 118 | "minimatch": "^3.0.5" 119 | }, 120 | "engines": { 121 | "node": ">=10.10.0" 122 | } 123 | }, 124 | "node_modules/@humanwhocodes/module-importer": { 125 | "version": "1.0.1", 126 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 127 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 128 | "dev": true, 129 | "engines": { 130 | "node": ">=12.22" 131 | }, 132 | "funding": { 133 | "type": "github", 134 | "url": "https://github.com/sponsors/nzakas" 135 | } 136 | }, 137 | "node_modules/@humanwhocodes/object-schema": { 138 | "version": "2.0.1", 139 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", 140 | "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", 141 | "dev": true 142 | }, 143 | "node_modules/@nodelib/fs.scandir": { 144 | "version": "2.1.5", 145 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 146 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 147 | "dev": true, 148 | "dependencies": { 149 | "@nodelib/fs.stat": "2.0.5", 150 | "run-parallel": "^1.1.9" 151 | }, 152 | "engines": { 153 | "node": ">= 8" 154 | } 155 | }, 156 | "node_modules/@nodelib/fs.stat": { 157 | "version": "2.0.5", 158 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 159 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 160 | "dev": true, 161 | "engines": { 162 | "node": ">= 8" 163 | } 164 | }, 165 | "node_modules/@nodelib/fs.walk": { 166 | "version": "1.2.8", 167 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 168 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 169 | "dev": true, 170 | "dependencies": { 171 | "@nodelib/fs.scandir": "2.1.5", 172 | "fastq": "^1.6.0" 173 | }, 174 | "engines": { 175 | "node": ">= 8" 176 | } 177 | }, 178 | "node_modules/@ungap/structured-clone": { 179 | "version": "1.2.0", 180 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", 181 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", 182 | "dev": true 183 | }, 184 | "node_modules/abbrev": { 185 | "version": "1.1.1", 186 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 187 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 188 | }, 189 | "node_modules/acorn": { 190 | "version": "8.11.2", 191 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", 192 | "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", 193 | "dev": true, 194 | "bin": { 195 | "acorn": "bin/acorn" 196 | }, 197 | "engines": { 198 | "node": ">=0.4.0" 199 | } 200 | }, 201 | "node_modules/acorn-jsx": { 202 | "version": "5.3.2", 203 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 204 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 205 | "dev": true, 206 | "peerDependencies": { 207 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 208 | } 209 | }, 210 | "node_modules/ajv": { 211 | "version": "6.12.6", 212 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 213 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 214 | "dev": true, 215 | "dependencies": { 216 | "fast-deep-equal": "^3.1.1", 217 | "fast-json-stable-stringify": "^2.0.0", 218 | "json-schema-traverse": "^0.4.1", 219 | "uri-js": "^4.2.2" 220 | }, 221 | "funding": { 222 | "type": "github", 223 | "url": "https://github.com/sponsors/epoberezkin" 224 | } 225 | }, 226 | "node_modules/ansi-regex": { 227 | "version": "5.0.1", 228 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 229 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 230 | "dev": true, 231 | "engines": { 232 | "node": ">=8" 233 | } 234 | }, 235 | "node_modules/ansi-styles": { 236 | "version": "4.3.0", 237 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 238 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 239 | "dependencies": { 240 | "color-convert": "^2.0.1" 241 | }, 242 | "engines": { 243 | "node": ">=8" 244 | }, 245 | "funding": { 246 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 247 | } 248 | }, 249 | "node_modules/argparse": { 250 | "version": "1.0.10", 251 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 252 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 253 | "dependencies": { 254 | "sprintf-js": "~1.0.2" 255 | } 256 | }, 257 | "node_modules/argparse/node_modules/sprintf-js": { 258 | "version": "1.0.3", 259 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 260 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 261 | }, 262 | "node_modules/array-each": { 263 | "version": "1.0.1", 264 | "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", 265 | "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", 266 | "engines": { 267 | "node": ">=0.10.0" 268 | } 269 | }, 270 | "node_modules/array-slice": { 271 | "version": "1.1.0", 272 | "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", 273 | "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", 274 | "engines": { 275 | "node": ">=0.10.0" 276 | } 277 | }, 278 | "node_modules/async": { 279 | "version": "3.2.2", 280 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", 281 | "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" 282 | }, 283 | "node_modules/balanced-match": { 284 | "version": "1.0.2", 285 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 286 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 287 | }, 288 | "node_modules/boolbase": { 289 | "version": "1.0.0", 290 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 291 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" 292 | }, 293 | "node_modules/brace-expansion": { 294 | "version": "1.1.11", 295 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 296 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 297 | "dependencies": { 298 | "balanced-match": "^1.0.0", 299 | "concat-map": "0.0.1" 300 | } 301 | }, 302 | "node_modules/braces": { 303 | "version": "3.0.3", 304 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 305 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 306 | "dependencies": { 307 | "fill-range": "^7.1.1" 308 | }, 309 | "engines": { 310 | "node": ">=8" 311 | } 312 | }, 313 | "node_modules/callsites": { 314 | "version": "3.1.0", 315 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 316 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 317 | "dev": true, 318 | "engines": { 319 | "node": ">=6" 320 | } 321 | }, 322 | "node_modules/chalk": { 323 | "version": "4.1.1", 324 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", 325 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", 326 | "dependencies": { 327 | "ansi-styles": "^4.1.0", 328 | "supports-color": "^7.1.0" 329 | }, 330 | "engines": { 331 | "node": ">=10" 332 | }, 333 | "funding": { 334 | "url": "https://github.com/chalk/chalk?sponsor=1" 335 | } 336 | }, 337 | "node_modules/cheerio": { 338 | "version": "1.0.0-rc.12", 339 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", 340 | "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", 341 | "dependencies": { 342 | "cheerio-select": "^2.1.0", 343 | "dom-serializer": "^2.0.0", 344 | "domhandler": "^5.0.3", 345 | "domutils": "^3.0.1", 346 | "htmlparser2": "^8.0.1", 347 | "parse5": "^7.0.0", 348 | "parse5-htmlparser2-tree-adapter": "^7.0.0" 349 | }, 350 | "engines": { 351 | "node": ">= 6" 352 | }, 353 | "funding": { 354 | "url": "https://github.com/cheeriojs/cheerio?sponsor=1" 355 | } 356 | }, 357 | "node_modules/cheerio-select": { 358 | "version": "2.1.0", 359 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", 360 | "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", 361 | "dependencies": { 362 | "boolbase": "^1.0.0", 363 | "css-select": "^5.1.0", 364 | "css-what": "^6.1.0", 365 | "domelementtype": "^2.3.0", 366 | "domhandler": "^5.0.3", 367 | "domutils": "^3.0.1" 368 | }, 369 | "funding": { 370 | "url": "https://github.com/sponsors/fb55" 371 | } 372 | }, 373 | "node_modules/color-convert": { 374 | "version": "2.0.1", 375 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 376 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 377 | "dependencies": { 378 | "color-name": "~1.1.4" 379 | }, 380 | "engines": { 381 | "node": ">=7.0.0" 382 | } 383 | }, 384 | "node_modules/color-name": { 385 | "version": "1.1.4", 386 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 387 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 388 | }, 389 | "node_modules/colors": { 390 | "version": "1.1.2", 391 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 392 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", 393 | "engines": { 394 | "node": ">=0.1.90" 395 | } 396 | }, 397 | "node_modules/commander": { 398 | "version": "7.2.0", 399 | "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", 400 | "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", 401 | "dev": true, 402 | "engines": { 403 | "node": ">= 10" 404 | } 405 | }, 406 | "node_modules/concat-map": { 407 | "version": "0.0.1", 408 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 409 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 410 | }, 411 | "node_modules/cross-spawn": { 412 | "version": "7.0.3", 413 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 414 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 415 | "dev": true, 416 | "dependencies": { 417 | "path-key": "^3.1.0", 418 | "shebang-command": "^2.0.0", 419 | "which": "^2.0.1" 420 | }, 421 | "engines": { 422 | "node": ">= 8" 423 | } 424 | }, 425 | "node_modules/cross-spawn/node_modules/which": { 426 | "version": "2.0.2", 427 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 428 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 429 | "dev": true, 430 | "dependencies": { 431 | "isexe": "^2.0.0" 432 | }, 433 | "bin": { 434 | "node-which": "bin/node-which" 435 | }, 436 | "engines": { 437 | "node": ">= 8" 438 | } 439 | }, 440 | "node_modules/css-select": { 441 | "version": "5.1.0", 442 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", 443 | "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", 444 | "dependencies": { 445 | "boolbase": "^1.0.0", 446 | "css-what": "^6.1.0", 447 | "domhandler": "^5.0.2", 448 | "domutils": "^3.0.1", 449 | "nth-check": "^2.0.1" 450 | }, 451 | "funding": { 452 | "url": "https://github.com/sponsors/fb55" 453 | } 454 | }, 455 | "node_modules/css-what": { 456 | "version": "6.1.0", 457 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 458 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", 459 | "engines": { 460 | "node": ">= 6" 461 | }, 462 | "funding": { 463 | "url": "https://github.com/sponsors/fb55" 464 | } 465 | }, 466 | "node_modules/dateformat": { 467 | "version": "4.6.3", 468 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", 469 | "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", 470 | "engines": { 471 | "node": "*" 472 | } 473 | }, 474 | "node_modules/debug": { 475 | "version": "4.3.4", 476 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 477 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 478 | "dev": true, 479 | "dependencies": { 480 | "ms": "2.1.2" 481 | }, 482 | "engines": { 483 | "node": ">=6.0" 484 | }, 485 | "peerDependenciesMeta": { 486 | "supports-color": { 487 | "optional": true 488 | } 489 | } 490 | }, 491 | "node_modules/deep-is": { 492 | "version": "0.1.4", 493 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 494 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 495 | "dev": true 496 | }, 497 | "node_modules/detect-file": { 498 | "version": "1.0.0", 499 | "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", 500 | "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", 501 | "engines": { 502 | "node": ">=0.10.0" 503 | } 504 | }, 505 | "node_modules/doctrine": { 506 | "version": "3.0.0", 507 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 508 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 509 | "dev": true, 510 | "dependencies": { 511 | "esutils": "^2.0.2" 512 | }, 513 | "engines": { 514 | "node": ">=6.0.0" 515 | } 516 | }, 517 | "node_modules/dom-serializer": { 518 | "version": "2.0.0", 519 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 520 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 521 | "dependencies": { 522 | "domelementtype": "^2.3.0", 523 | "domhandler": "^5.0.2", 524 | "entities": "^4.2.0" 525 | }, 526 | "funding": { 527 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 528 | } 529 | }, 530 | "node_modules/domelementtype": { 531 | "version": "2.3.0", 532 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 533 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 534 | "funding": [ 535 | { 536 | "type": "github", 537 | "url": "https://github.com/sponsors/fb55" 538 | } 539 | ] 540 | }, 541 | "node_modules/domhandler": { 542 | "version": "5.0.3", 543 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 544 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 545 | "dependencies": { 546 | "domelementtype": "^2.3.0" 547 | }, 548 | "engines": { 549 | "node": ">= 4" 550 | }, 551 | "funding": { 552 | "url": "https://github.com/fb55/domhandler?sponsor=1" 553 | } 554 | }, 555 | "node_modules/domutils": { 556 | "version": "3.0.1", 557 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", 558 | "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", 559 | "dependencies": { 560 | "dom-serializer": "^2.0.0", 561 | "domelementtype": "^2.3.0", 562 | "domhandler": "^5.0.1" 563 | }, 564 | "funding": { 565 | "url": "https://github.com/fb55/domutils?sponsor=1" 566 | } 567 | }, 568 | "node_modules/entities": { 569 | "version": "4.5.0", 570 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 571 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 572 | "engines": { 573 | "node": ">=0.12" 574 | }, 575 | "funding": { 576 | "url": "https://github.com/fb55/entities?sponsor=1" 577 | } 578 | }, 579 | "node_modules/escape-string-regexp": { 580 | "version": "4.0.0", 581 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 582 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 583 | "dev": true, 584 | "engines": { 585 | "node": ">=10" 586 | }, 587 | "funding": { 588 | "url": "https://github.com/sponsors/sindresorhus" 589 | } 590 | }, 591 | "node_modules/eslint": { 592 | "version": "8.53.0", 593 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", 594 | "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", 595 | "dev": true, 596 | "dependencies": { 597 | "@eslint-community/eslint-utils": "^4.2.0", 598 | "@eslint-community/regexpp": "^4.6.1", 599 | "@eslint/eslintrc": "^2.1.3", 600 | "@eslint/js": "8.53.0", 601 | "@humanwhocodes/config-array": "^0.11.13", 602 | "@humanwhocodes/module-importer": "^1.0.1", 603 | "@nodelib/fs.walk": "^1.2.8", 604 | "@ungap/structured-clone": "^1.2.0", 605 | "ajv": "^6.12.4", 606 | "chalk": "^4.0.0", 607 | "cross-spawn": "^7.0.2", 608 | "debug": "^4.3.2", 609 | "doctrine": "^3.0.0", 610 | "escape-string-regexp": "^4.0.0", 611 | "eslint-scope": "^7.2.2", 612 | "eslint-visitor-keys": "^3.4.3", 613 | "espree": "^9.6.1", 614 | "esquery": "^1.4.2", 615 | "esutils": "^2.0.2", 616 | "fast-deep-equal": "^3.1.3", 617 | "file-entry-cache": "^6.0.1", 618 | "find-up": "^5.0.0", 619 | "glob-parent": "^6.0.2", 620 | "globals": "^13.19.0", 621 | "graphemer": "^1.4.0", 622 | "ignore": "^5.2.0", 623 | "imurmurhash": "^0.1.4", 624 | "is-glob": "^4.0.0", 625 | "is-path-inside": "^3.0.3", 626 | "js-yaml": "^4.1.0", 627 | "json-stable-stringify-without-jsonify": "^1.0.1", 628 | "levn": "^0.4.1", 629 | "lodash.merge": "^4.6.2", 630 | "minimatch": "^3.1.2", 631 | "natural-compare": "^1.4.0", 632 | "optionator": "^0.9.3", 633 | "strip-ansi": "^6.0.1", 634 | "text-table": "^0.2.0" 635 | }, 636 | "bin": { 637 | "eslint": "bin/eslint.js" 638 | }, 639 | "engines": { 640 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 641 | }, 642 | "funding": { 643 | "url": "https://opencollective.com/eslint" 644 | } 645 | }, 646 | "node_modules/eslint-config-jquery": { 647 | "version": "3.0.2", 648 | "resolved": "https://registry.npmjs.org/eslint-config-jquery/-/eslint-config-jquery-3.0.2.tgz", 649 | "integrity": "sha512-1CdP7AY5ZuhDGUXz+/b7FwhRnDoK0A1swz+2nZ+zpEYJ3EyV085AOAfpFJL2s+ioHDspNQEsGSsl9uUEm9/f/g==", 650 | "dev": true 651 | }, 652 | "node_modules/eslint-scope": { 653 | "version": "7.2.2", 654 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 655 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 656 | "dev": true, 657 | "dependencies": { 658 | "esrecurse": "^4.3.0", 659 | "estraverse": "^5.2.0" 660 | }, 661 | "engines": { 662 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 663 | }, 664 | "funding": { 665 | "url": "https://opencollective.com/eslint" 666 | } 667 | }, 668 | "node_modules/eslint-visitor-keys": { 669 | "version": "3.4.3", 670 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 671 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 672 | "dev": true, 673 | "engines": { 674 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 675 | }, 676 | "funding": { 677 | "url": "https://opencollective.com/eslint" 678 | } 679 | }, 680 | "node_modules/eslint/node_modules/argparse": { 681 | "version": "2.0.1", 682 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 683 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 684 | "dev": true 685 | }, 686 | "node_modules/eslint/node_modules/js-yaml": { 687 | "version": "4.1.0", 688 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 689 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 690 | "dev": true, 691 | "dependencies": { 692 | "argparse": "^2.0.1" 693 | }, 694 | "bin": { 695 | "js-yaml": "bin/js-yaml.js" 696 | } 697 | }, 698 | "node_modules/espree": { 699 | "version": "9.6.1", 700 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 701 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 702 | "dev": true, 703 | "dependencies": { 704 | "acorn": "^8.9.0", 705 | "acorn-jsx": "^5.3.2", 706 | "eslint-visitor-keys": "^3.4.1" 707 | }, 708 | "engines": { 709 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 710 | }, 711 | "funding": { 712 | "url": "https://opencollective.com/eslint" 713 | } 714 | }, 715 | "node_modules/esprima": { 716 | "version": "4.0.1", 717 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 718 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 719 | "bin": { 720 | "esparse": "bin/esparse.js", 721 | "esvalidate": "bin/esvalidate.js" 722 | }, 723 | "engines": { 724 | "node": ">=4" 725 | } 726 | }, 727 | "node_modules/esquery": { 728 | "version": "1.5.0", 729 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 730 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 731 | "dev": true, 732 | "dependencies": { 733 | "estraverse": "^5.1.0" 734 | }, 735 | "engines": { 736 | "node": ">=0.10" 737 | } 738 | }, 739 | "node_modules/esrecurse": { 740 | "version": "4.3.0", 741 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 742 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 743 | "dev": true, 744 | "dependencies": { 745 | "estraverse": "^5.2.0" 746 | }, 747 | "engines": { 748 | "node": ">=4.0" 749 | } 750 | }, 751 | "node_modules/estraverse": { 752 | "version": "5.3.0", 753 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 754 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 755 | "dev": true, 756 | "engines": { 757 | "node": ">=4.0" 758 | } 759 | }, 760 | "node_modules/esutils": { 761 | "version": "2.0.3", 762 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 763 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 764 | "dev": true, 765 | "engines": { 766 | "node": ">=0.10.0" 767 | } 768 | }, 769 | "node_modules/eventemitter2": { 770 | "version": "0.4.14", 771 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 772 | "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=" 773 | }, 774 | "node_modules/exit": { 775 | "version": "0.1.2", 776 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 777 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 778 | "engines": { 779 | "node": ">= 0.8.0" 780 | } 781 | }, 782 | "node_modules/expand-tilde": { 783 | "version": "2.0.2", 784 | "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", 785 | "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", 786 | "dependencies": { 787 | "homedir-polyfill": "^1.0.1" 788 | }, 789 | "engines": { 790 | "node": ">=0.10.0" 791 | } 792 | }, 793 | "node_modules/extend": { 794 | "version": "3.0.2", 795 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 796 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 797 | }, 798 | "node_modules/fast-deep-equal": { 799 | "version": "3.1.3", 800 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 801 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 802 | "dev": true 803 | }, 804 | "node_modules/fast-json-stable-stringify": { 805 | "version": "2.1.0", 806 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 807 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 808 | "dev": true 809 | }, 810 | "node_modules/fast-levenshtein": { 811 | "version": "2.0.6", 812 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 813 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 814 | "dev": true 815 | }, 816 | "node_modules/fastq": { 817 | "version": "1.15.0", 818 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 819 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 820 | "dev": true, 821 | "dependencies": { 822 | "reusify": "^1.0.4" 823 | } 824 | }, 825 | "node_modules/file-entry-cache": { 826 | "version": "6.0.1", 827 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 828 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 829 | "dev": true, 830 | "dependencies": { 831 | "flat-cache": "^3.0.4" 832 | }, 833 | "engines": { 834 | "node": "^10.12.0 || >=12.0.0" 835 | } 836 | }, 837 | "node_modules/fill-range": { 838 | "version": "7.1.1", 839 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 840 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 841 | "dependencies": { 842 | "to-regex-range": "^5.0.1" 843 | }, 844 | "engines": { 845 | "node": ">=8" 846 | } 847 | }, 848 | "node_modules/find-up": { 849 | "version": "5.0.0", 850 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 851 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 852 | "dev": true, 853 | "dependencies": { 854 | "locate-path": "^6.0.0", 855 | "path-exists": "^4.0.0" 856 | }, 857 | "engines": { 858 | "node": ">=10" 859 | }, 860 | "funding": { 861 | "url": "https://github.com/sponsors/sindresorhus" 862 | } 863 | }, 864 | "node_modules/findup-sync": { 865 | "version": "5.0.0", 866 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", 867 | "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", 868 | "dependencies": { 869 | "detect-file": "^1.0.0", 870 | "is-glob": "^4.0.3", 871 | "micromatch": "^4.0.4", 872 | "resolve-dir": "^1.0.1" 873 | }, 874 | "engines": { 875 | "node": ">= 10.13.0" 876 | } 877 | }, 878 | "node_modules/fined": { 879 | "version": "1.2.0", 880 | "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", 881 | "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", 882 | "dependencies": { 883 | "expand-tilde": "^2.0.2", 884 | "is-plain-object": "^2.0.3", 885 | "object.defaults": "^1.1.0", 886 | "object.pick": "^1.2.0", 887 | "parse-filepath": "^1.0.1" 888 | }, 889 | "engines": { 890 | "node": ">= 0.10" 891 | } 892 | }, 893 | "node_modules/flagged-respawn": { 894 | "version": "1.0.1", 895 | "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", 896 | "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", 897 | "engines": { 898 | "node": ">= 0.10" 899 | } 900 | }, 901 | "node_modules/flat-cache": { 902 | "version": "3.0.4", 903 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 904 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 905 | "dev": true, 906 | "dependencies": { 907 | "flatted": "^3.1.0", 908 | "rimraf": "^3.0.2" 909 | }, 910 | "engines": { 911 | "node": "^10.12.0 || >=12.0.0" 912 | } 913 | }, 914 | "node_modules/flatted": { 915 | "version": "3.1.1", 916 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", 917 | "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", 918 | "dev": true 919 | }, 920 | "node_modules/for-in": { 921 | "version": "1.0.2", 922 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 923 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 924 | "engines": { 925 | "node": ">=0.10.0" 926 | } 927 | }, 928 | "node_modules/for-own": { 929 | "version": "1.0.0", 930 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", 931 | "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", 932 | "dependencies": { 933 | "for-in": "^1.0.1" 934 | }, 935 | "engines": { 936 | "node": ">=0.10.0" 937 | } 938 | }, 939 | "node_modules/fs.realpath": { 940 | "version": "1.0.0", 941 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 942 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 943 | }, 944 | "node_modules/function-bind": { 945 | "version": "1.1.1", 946 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 947 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 948 | }, 949 | "node_modules/getobject": { 950 | "version": "1.0.2", 951 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", 952 | "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", 953 | "engines": { 954 | "node": ">=10" 955 | } 956 | }, 957 | "node_modules/gilded-wordpress": { 958 | "version": "1.0.7", 959 | "resolved": "https://registry.npmjs.org/gilded-wordpress/-/gilded-wordpress-1.0.7.tgz", 960 | "integrity": "sha512-w8g4jfs1TWywX2hZ4+LlzQoz2z/JRX/8S6OgelD3IUsNnGHxXQ1FgExoIqomwZVPAmxYs0vEu2BeA1Y4KciZlw==", 961 | "dependencies": { 962 | "async": "^0.9.0", 963 | "wordpress": "^1.4.2" 964 | } 965 | }, 966 | "node_modules/gilded-wordpress/node_modules/async": { 967 | "version": "0.9.2", 968 | "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", 969 | "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==" 970 | }, 971 | "node_modules/glob-parent": { 972 | "version": "6.0.2", 973 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 974 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 975 | "dev": true, 976 | "dependencies": { 977 | "is-glob": "^4.0.3" 978 | }, 979 | "engines": { 980 | "node": ">=10.13.0" 981 | } 982 | }, 983 | "node_modules/global-modules": { 984 | "version": "1.0.0", 985 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", 986 | "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", 987 | "dependencies": { 988 | "global-prefix": "^1.0.1", 989 | "is-windows": "^1.0.1", 990 | "resolve-dir": "^1.0.0" 991 | }, 992 | "engines": { 993 | "node": ">=0.10.0" 994 | } 995 | }, 996 | "node_modules/global-prefix": { 997 | "version": "1.0.2", 998 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", 999 | "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", 1000 | "dependencies": { 1001 | "expand-tilde": "^2.0.2", 1002 | "homedir-polyfill": "^1.0.1", 1003 | "ini": "^1.3.4", 1004 | "is-windows": "^1.0.1", 1005 | "which": "^1.2.14" 1006 | }, 1007 | "engines": { 1008 | "node": ">=0.10.0" 1009 | } 1010 | }, 1011 | "node_modules/global-prefix/node_modules/which": { 1012 | "version": "1.3.1", 1013 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1014 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1015 | "dependencies": { 1016 | "isexe": "^2.0.0" 1017 | }, 1018 | "bin": { 1019 | "which": "bin/which" 1020 | } 1021 | }, 1022 | "node_modules/globals": { 1023 | "version": "13.23.0", 1024 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", 1025 | "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", 1026 | "dev": true, 1027 | "dependencies": { 1028 | "type-fest": "^0.20.2" 1029 | }, 1030 | "engines": { 1031 | "node": ">=8" 1032 | }, 1033 | "funding": { 1034 | "url": "https://github.com/sponsors/sindresorhus" 1035 | } 1036 | }, 1037 | "node_modules/globalyzer": { 1038 | "version": "0.1.0", 1039 | "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", 1040 | "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", 1041 | "dev": true 1042 | }, 1043 | "node_modules/globrex": { 1044 | "version": "0.1.2", 1045 | "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", 1046 | "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", 1047 | "dev": true 1048 | }, 1049 | "node_modules/graphemer": { 1050 | "version": "1.4.0", 1051 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1052 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1053 | "dev": true 1054 | }, 1055 | "node_modules/grunt": { 1056 | "version": "1.6.1", 1057 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", 1058 | "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", 1059 | "dependencies": { 1060 | "dateformat": "~4.6.2", 1061 | "eventemitter2": "~0.4.13", 1062 | "exit": "~0.1.2", 1063 | "findup-sync": "~5.0.0", 1064 | "glob": "~7.1.6", 1065 | "grunt-cli": "~1.4.3", 1066 | "grunt-known-options": "~2.0.0", 1067 | "grunt-legacy-log": "~3.0.0", 1068 | "grunt-legacy-util": "~2.0.1", 1069 | "iconv-lite": "~0.6.3", 1070 | "js-yaml": "~3.14.0", 1071 | "minimatch": "~3.0.4", 1072 | "nopt": "~3.0.6" 1073 | }, 1074 | "bin": { 1075 | "grunt": "bin/grunt" 1076 | }, 1077 | "engines": { 1078 | "node": ">=16" 1079 | } 1080 | }, 1081 | "node_modules/grunt-check-modules": { 1082 | "version": "1.1.0", 1083 | "resolved": "https://registry.npmjs.org/grunt-check-modules/-/grunt-check-modules-1.1.0.tgz", 1084 | "integrity": "sha1-fBZB28ZlSGdqbVl5Ga35C3s11kQ=", 1085 | "engines": { 1086 | "node": ">=0.6.0" 1087 | }, 1088 | "peerDependencies": { 1089 | "grunt": ">=0.4.0" 1090 | } 1091 | }, 1092 | "node_modules/grunt-known-options": { 1093 | "version": "2.0.0", 1094 | "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", 1095 | "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", 1096 | "engines": { 1097 | "node": ">=0.10.0" 1098 | } 1099 | }, 1100 | "node_modules/grunt-legacy-log": { 1101 | "version": "3.0.0", 1102 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", 1103 | "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", 1104 | "dependencies": { 1105 | "colors": "~1.1.2", 1106 | "grunt-legacy-log-utils": "~2.1.0", 1107 | "hooker": "~0.2.3", 1108 | "lodash": "~4.17.19" 1109 | }, 1110 | "engines": { 1111 | "node": ">= 0.10.0" 1112 | } 1113 | }, 1114 | "node_modules/grunt-legacy-log-utils": { 1115 | "version": "2.1.0", 1116 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", 1117 | "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", 1118 | "dependencies": { 1119 | "chalk": "~4.1.0", 1120 | "lodash": "~4.17.19" 1121 | }, 1122 | "engines": { 1123 | "node": ">=10" 1124 | } 1125 | }, 1126 | "node_modules/grunt-legacy-util": { 1127 | "version": "2.0.1", 1128 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", 1129 | "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", 1130 | "dependencies": { 1131 | "async": "~3.2.0", 1132 | "exit": "~0.1.2", 1133 | "getobject": "~1.0.0", 1134 | "hooker": "~0.2.3", 1135 | "lodash": "~4.17.21", 1136 | "underscore.string": "~3.3.5", 1137 | "which": "~2.0.2" 1138 | }, 1139 | "engines": { 1140 | "node": ">=10" 1141 | } 1142 | }, 1143 | "node_modules/grunt-legacy-util/node_modules/which": { 1144 | "version": "2.0.2", 1145 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1146 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1147 | "dependencies": { 1148 | "isexe": "^2.0.0" 1149 | }, 1150 | "bin": { 1151 | "node-which": "bin/node-which" 1152 | }, 1153 | "engines": { 1154 | "node": ">= 8" 1155 | } 1156 | }, 1157 | "node_modules/grunt/node_modules/glob": { 1158 | "version": "7.1.7", 1159 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 1160 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 1161 | "dependencies": { 1162 | "fs.realpath": "^1.0.0", 1163 | "inflight": "^1.0.4", 1164 | "inherits": "2", 1165 | "minimatch": "^3.0.4", 1166 | "once": "^1.3.0", 1167 | "path-is-absolute": "^1.0.0" 1168 | }, 1169 | "engines": { 1170 | "node": "*" 1171 | }, 1172 | "funding": { 1173 | "url": "https://github.com/sponsors/isaacs" 1174 | } 1175 | }, 1176 | "node_modules/grunt/node_modules/grunt-cli": { 1177 | "version": "1.4.3", 1178 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", 1179 | "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", 1180 | "dependencies": { 1181 | "grunt-known-options": "~2.0.0", 1182 | "interpret": "~1.1.0", 1183 | "liftup": "~3.0.1", 1184 | "nopt": "~4.0.1", 1185 | "v8flags": "~3.2.0" 1186 | }, 1187 | "bin": { 1188 | "grunt": "bin/grunt" 1189 | }, 1190 | "engines": { 1191 | "node": ">=10" 1192 | } 1193 | }, 1194 | "node_modules/grunt/node_modules/grunt-cli/node_modules/nopt": { 1195 | "version": "4.0.3", 1196 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", 1197 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", 1198 | "dependencies": { 1199 | "abbrev": "1", 1200 | "osenv": "^0.1.4" 1201 | }, 1202 | "bin": { 1203 | "nopt": "bin/nopt.js" 1204 | } 1205 | }, 1206 | "node_modules/grunt/node_modules/minimatch": { 1207 | "version": "3.0.8", 1208 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", 1209 | "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", 1210 | "dependencies": { 1211 | "brace-expansion": "^1.1.7" 1212 | }, 1213 | "engines": { 1214 | "node": "*" 1215 | } 1216 | }, 1217 | "node_modules/has": { 1218 | "version": "1.0.3", 1219 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1220 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1221 | "dependencies": { 1222 | "function-bind": "^1.1.1" 1223 | }, 1224 | "engines": { 1225 | "node": ">= 0.4.0" 1226 | } 1227 | }, 1228 | "node_modules/has-flag": { 1229 | "version": "4.0.0", 1230 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1231 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1232 | "engines": { 1233 | "node": ">=8" 1234 | } 1235 | }, 1236 | "node_modules/he": { 1237 | "version": "1.2.0", 1238 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1239 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1240 | "bin": { 1241 | "he": "bin/he" 1242 | } 1243 | }, 1244 | "node_modules/highlight.js": { 1245 | "version": "10.7.2", 1246 | "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.2.tgz", 1247 | "integrity": "sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==", 1248 | "engines": { 1249 | "node": "*" 1250 | } 1251 | }, 1252 | "node_modules/homedir-polyfill": { 1253 | "version": "1.0.3", 1254 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", 1255 | "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", 1256 | "dependencies": { 1257 | "parse-passwd": "^1.0.0" 1258 | }, 1259 | "engines": { 1260 | "node": ">=0.10.0" 1261 | } 1262 | }, 1263 | "node_modules/hooker": { 1264 | "version": "0.2.3", 1265 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", 1266 | "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", 1267 | "engines": { 1268 | "node": "*" 1269 | } 1270 | }, 1271 | "node_modules/htmlparser2": { 1272 | "version": "8.0.2", 1273 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", 1274 | "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 1275 | "funding": [ 1276 | "https://github.com/fb55/htmlparser2?sponsor=1", 1277 | { 1278 | "type": "github", 1279 | "url": "https://github.com/sponsors/fb55" 1280 | } 1281 | ], 1282 | "dependencies": { 1283 | "domelementtype": "^2.3.0", 1284 | "domhandler": "^5.0.3", 1285 | "domutils": "^3.0.1", 1286 | "entities": "^4.4.0" 1287 | } 1288 | }, 1289 | "node_modules/iconv-lite": { 1290 | "version": "0.6.3", 1291 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1292 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1293 | "dependencies": { 1294 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1295 | }, 1296 | "engines": { 1297 | "node": ">=0.10.0" 1298 | } 1299 | }, 1300 | "node_modules/ignore": { 1301 | "version": "5.2.4", 1302 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 1303 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 1304 | "dev": true, 1305 | "engines": { 1306 | "node": ">= 4" 1307 | } 1308 | }, 1309 | "node_modules/import-fresh": { 1310 | "version": "3.3.0", 1311 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1312 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1313 | "dev": true, 1314 | "dependencies": { 1315 | "parent-module": "^1.0.0", 1316 | "resolve-from": "^4.0.0" 1317 | }, 1318 | "engines": { 1319 | "node": ">=6" 1320 | }, 1321 | "funding": { 1322 | "url": "https://github.com/sponsors/sindresorhus" 1323 | } 1324 | }, 1325 | "node_modules/imurmurhash": { 1326 | "version": "0.1.4", 1327 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1328 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1329 | "dev": true, 1330 | "engines": { 1331 | "node": ">=0.8.19" 1332 | } 1333 | }, 1334 | "node_modules/inflight": { 1335 | "version": "1.0.6", 1336 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1337 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1338 | "dependencies": { 1339 | "once": "^1.3.0", 1340 | "wrappy": "1" 1341 | } 1342 | }, 1343 | "node_modules/inherits": { 1344 | "version": "2.0.4", 1345 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1346 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1347 | }, 1348 | "node_modules/ini": { 1349 | "version": "1.3.8", 1350 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1351 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 1352 | }, 1353 | "node_modules/interpret": { 1354 | "version": "1.1.0", 1355 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", 1356 | "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" 1357 | }, 1358 | "node_modules/is-absolute": { 1359 | "version": "1.0.0", 1360 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 1361 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 1362 | "dependencies": { 1363 | "is-relative": "^1.0.0", 1364 | "is-windows": "^1.0.1" 1365 | }, 1366 | "engines": { 1367 | "node": ">=0.10.0" 1368 | } 1369 | }, 1370 | "node_modules/is-core-module": { 1371 | "version": "2.9.0", 1372 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 1373 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 1374 | "dependencies": { 1375 | "has": "^1.0.3" 1376 | }, 1377 | "funding": { 1378 | "url": "https://github.com/sponsors/ljharb" 1379 | } 1380 | }, 1381 | "node_modules/is-extglob": { 1382 | "version": "2.1.1", 1383 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1384 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1385 | "engines": { 1386 | "node": ">=0.10.0" 1387 | } 1388 | }, 1389 | "node_modules/is-glob": { 1390 | "version": "4.0.3", 1391 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1392 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1393 | "dependencies": { 1394 | "is-extglob": "^2.1.1" 1395 | }, 1396 | "engines": { 1397 | "node": ">=0.10.0" 1398 | } 1399 | }, 1400 | "node_modules/is-number": { 1401 | "version": "7.0.0", 1402 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1403 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1404 | "engines": { 1405 | "node": ">=0.12.0" 1406 | } 1407 | }, 1408 | "node_modules/is-path-inside": { 1409 | "version": "3.0.3", 1410 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1411 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1412 | "dev": true, 1413 | "engines": { 1414 | "node": ">=8" 1415 | } 1416 | }, 1417 | "node_modules/is-plain-object": { 1418 | "version": "2.0.4", 1419 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1420 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1421 | "dependencies": { 1422 | "isobject": "^3.0.1" 1423 | }, 1424 | "engines": { 1425 | "node": ">=0.10.0" 1426 | } 1427 | }, 1428 | "node_modules/is-relative": { 1429 | "version": "1.0.0", 1430 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 1431 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 1432 | "dependencies": { 1433 | "is-unc-path": "^1.0.0" 1434 | }, 1435 | "engines": { 1436 | "node": ">=0.10.0" 1437 | } 1438 | }, 1439 | "node_modules/is-unc-path": { 1440 | "version": "1.0.0", 1441 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 1442 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 1443 | "dependencies": { 1444 | "unc-path-regex": "^0.1.2" 1445 | }, 1446 | "engines": { 1447 | "node": ">=0.10.0" 1448 | } 1449 | }, 1450 | "node_modules/is-windows": { 1451 | "version": "1.0.2", 1452 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1453 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 1454 | "engines": { 1455 | "node": ">=0.10.0" 1456 | } 1457 | }, 1458 | "node_modules/isexe": { 1459 | "version": "2.0.0", 1460 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1461 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1462 | }, 1463 | "node_modules/isobject": { 1464 | "version": "3.0.1", 1465 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1466 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 1467 | "engines": { 1468 | "node": ">=0.10.0" 1469 | } 1470 | }, 1471 | "node_modules/js-yaml": { 1472 | "version": "3.14.1", 1473 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 1474 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 1475 | "dependencies": { 1476 | "argparse": "^1.0.7", 1477 | "esprima": "^4.0.0" 1478 | }, 1479 | "bin": { 1480 | "js-yaml": "bin/js-yaml.js" 1481 | } 1482 | }, 1483 | "node_modules/json-schema-traverse": { 1484 | "version": "0.4.1", 1485 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1486 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1487 | "dev": true 1488 | }, 1489 | "node_modules/json-stable-stringify-without-jsonify": { 1490 | "version": "1.0.1", 1491 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1492 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1493 | "dev": true 1494 | }, 1495 | "node_modules/kind-of": { 1496 | "version": "6.0.3", 1497 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 1498 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 1499 | "engines": { 1500 | "node": ">=0.10.0" 1501 | } 1502 | }, 1503 | "node_modules/levn": { 1504 | "version": "0.4.1", 1505 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1506 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1507 | "dev": true, 1508 | "dependencies": { 1509 | "prelude-ls": "^1.2.1", 1510 | "type-check": "~0.4.0" 1511 | }, 1512 | "engines": { 1513 | "node": ">= 0.8.0" 1514 | } 1515 | }, 1516 | "node_modules/liftup": { 1517 | "version": "3.0.1", 1518 | "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", 1519 | "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", 1520 | "dependencies": { 1521 | "extend": "^3.0.2", 1522 | "findup-sync": "^4.0.0", 1523 | "fined": "^1.2.0", 1524 | "flagged-respawn": "^1.0.1", 1525 | "is-plain-object": "^2.0.4", 1526 | "object.map": "^1.0.1", 1527 | "rechoir": "^0.7.0", 1528 | "resolve": "^1.19.0" 1529 | }, 1530 | "engines": { 1531 | "node": ">=10" 1532 | } 1533 | }, 1534 | "node_modules/liftup/node_modules/findup-sync": { 1535 | "version": "4.0.0", 1536 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", 1537 | "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", 1538 | "dependencies": { 1539 | "detect-file": "^1.0.0", 1540 | "is-glob": "^4.0.0", 1541 | "micromatch": "^4.0.2", 1542 | "resolve-dir": "^1.0.1" 1543 | }, 1544 | "engines": { 1545 | "node": ">= 8" 1546 | } 1547 | }, 1548 | "node_modules/locate-path": { 1549 | "version": "6.0.0", 1550 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1551 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1552 | "dev": true, 1553 | "dependencies": { 1554 | "p-locate": "^5.0.0" 1555 | }, 1556 | "engines": { 1557 | "node": ">=10" 1558 | }, 1559 | "funding": { 1560 | "url": "https://github.com/sponsors/sindresorhus" 1561 | } 1562 | }, 1563 | "node_modules/lodash": { 1564 | "version": "4.17.21", 1565 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1566 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1567 | }, 1568 | "node_modules/lodash.merge": { 1569 | "version": "4.6.2", 1570 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1571 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1572 | "dev": true 1573 | }, 1574 | "node_modules/make-iterator": { 1575 | "version": "1.0.1", 1576 | "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", 1577 | "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", 1578 | "dependencies": { 1579 | "kind-of": "^6.0.2" 1580 | }, 1581 | "engines": { 1582 | "node": ">=0.10.0" 1583 | } 1584 | }, 1585 | "node_modules/map-cache": { 1586 | "version": "0.2.2", 1587 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 1588 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", 1589 | "engines": { 1590 | "node": ">=0.10.0" 1591 | } 1592 | }, 1593 | "node_modules/marked": { 1594 | "version": "4.3.0", 1595 | "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", 1596 | "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", 1597 | "bin": { 1598 | "marked": "bin/marked.js" 1599 | }, 1600 | "engines": { 1601 | "node": ">= 12" 1602 | } 1603 | }, 1604 | "node_modules/micromatch": { 1605 | "version": "4.0.8", 1606 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1607 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1608 | "dependencies": { 1609 | "braces": "^3.0.3", 1610 | "picomatch": "^2.3.1" 1611 | }, 1612 | "engines": { 1613 | "node": ">=8.6" 1614 | } 1615 | }, 1616 | "node_modules/minimatch": { 1617 | "version": "3.1.2", 1618 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1619 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1620 | "dev": true, 1621 | "dependencies": { 1622 | "brace-expansion": "^1.1.7" 1623 | }, 1624 | "engines": { 1625 | "node": "*" 1626 | } 1627 | }, 1628 | "node_modules/ms": { 1629 | "version": "2.1.2", 1630 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1631 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1632 | "dev": true 1633 | }, 1634 | "node_modules/natural-compare": { 1635 | "version": "1.4.0", 1636 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1637 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1638 | "dev": true 1639 | }, 1640 | "node_modules/node-watch": { 1641 | "version": "0.7.3", 1642 | "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.3.tgz", 1643 | "integrity": "sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==", 1644 | "dev": true, 1645 | "engines": { 1646 | "node": ">=6" 1647 | } 1648 | }, 1649 | "node_modules/nopt": { 1650 | "version": "3.0.6", 1651 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1652 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1653 | "dependencies": { 1654 | "abbrev": "1" 1655 | }, 1656 | "bin": { 1657 | "nopt": "bin/nopt.js" 1658 | } 1659 | }, 1660 | "node_modules/nth-check": { 1661 | "version": "2.1.1", 1662 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 1663 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 1664 | "dependencies": { 1665 | "boolbase": "^1.0.0" 1666 | }, 1667 | "funding": { 1668 | "url": "https://github.com/fb55/nth-check?sponsor=1" 1669 | } 1670 | }, 1671 | "node_modules/object.defaults": { 1672 | "version": "1.1.0", 1673 | "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", 1674 | "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", 1675 | "dependencies": { 1676 | "array-each": "^1.0.1", 1677 | "array-slice": "^1.0.0", 1678 | "for-own": "^1.0.0", 1679 | "isobject": "^3.0.0" 1680 | }, 1681 | "engines": { 1682 | "node": ">=0.10.0" 1683 | } 1684 | }, 1685 | "node_modules/object.map": { 1686 | "version": "1.0.1", 1687 | "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", 1688 | "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", 1689 | "dependencies": { 1690 | "for-own": "^1.0.0", 1691 | "make-iterator": "^1.0.0" 1692 | }, 1693 | "engines": { 1694 | "node": ">=0.10.0" 1695 | } 1696 | }, 1697 | "node_modules/object.pick": { 1698 | "version": "1.3.0", 1699 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 1700 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 1701 | "dependencies": { 1702 | "isobject": "^3.0.1" 1703 | }, 1704 | "engines": { 1705 | "node": ">=0.10.0" 1706 | } 1707 | }, 1708 | "node_modules/once": { 1709 | "version": "1.4.0", 1710 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1711 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1712 | "dependencies": { 1713 | "wrappy": "1" 1714 | } 1715 | }, 1716 | "node_modules/optionator": { 1717 | "version": "0.9.3", 1718 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 1719 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 1720 | "dev": true, 1721 | "dependencies": { 1722 | "@aashutoshrathi/word-wrap": "^1.2.3", 1723 | "deep-is": "^0.1.3", 1724 | "fast-levenshtein": "^2.0.6", 1725 | "levn": "^0.4.1", 1726 | "prelude-ls": "^1.2.1", 1727 | "type-check": "^0.4.0" 1728 | }, 1729 | "engines": { 1730 | "node": ">= 0.8.0" 1731 | } 1732 | }, 1733 | "node_modules/os-homedir": { 1734 | "version": "1.0.2", 1735 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1736 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1737 | "engines": { 1738 | "node": ">=0.10.0" 1739 | } 1740 | }, 1741 | "node_modules/os-tmpdir": { 1742 | "version": "1.0.2", 1743 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1744 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1745 | "engines": { 1746 | "node": ">=0.10.0" 1747 | } 1748 | }, 1749 | "node_modules/osenv": { 1750 | "version": "0.1.5", 1751 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 1752 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 1753 | "dependencies": { 1754 | "os-homedir": "^1.0.0", 1755 | "os-tmpdir": "^1.0.0" 1756 | } 1757 | }, 1758 | "node_modules/p-limit": { 1759 | "version": "3.1.0", 1760 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1761 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1762 | "dev": true, 1763 | "dependencies": { 1764 | "yocto-queue": "^0.1.0" 1765 | }, 1766 | "engines": { 1767 | "node": ">=10" 1768 | }, 1769 | "funding": { 1770 | "url": "https://github.com/sponsors/sindresorhus" 1771 | } 1772 | }, 1773 | "node_modules/p-locate": { 1774 | "version": "5.0.0", 1775 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1776 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1777 | "dev": true, 1778 | "dependencies": { 1779 | "p-limit": "^3.0.2" 1780 | }, 1781 | "engines": { 1782 | "node": ">=10" 1783 | }, 1784 | "funding": { 1785 | "url": "https://github.com/sponsors/sindresorhus" 1786 | } 1787 | }, 1788 | "node_modules/parent-module": { 1789 | "version": "1.0.1", 1790 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1791 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1792 | "dev": true, 1793 | "dependencies": { 1794 | "callsites": "^3.0.0" 1795 | }, 1796 | "engines": { 1797 | "node": ">=6" 1798 | } 1799 | }, 1800 | "node_modules/parse-filepath": { 1801 | "version": "1.0.2", 1802 | "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", 1803 | "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", 1804 | "dependencies": { 1805 | "is-absolute": "^1.0.0", 1806 | "map-cache": "^0.2.0", 1807 | "path-root": "^0.1.1" 1808 | }, 1809 | "engines": { 1810 | "node": ">=0.8" 1811 | } 1812 | }, 1813 | "node_modules/parse-passwd": { 1814 | "version": "1.0.0", 1815 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 1816 | "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", 1817 | "engines": { 1818 | "node": ">=0.10.0" 1819 | } 1820 | }, 1821 | "node_modules/parse5": { 1822 | "version": "7.1.2", 1823 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", 1824 | "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", 1825 | "dependencies": { 1826 | "entities": "^4.4.0" 1827 | }, 1828 | "funding": { 1829 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1830 | } 1831 | }, 1832 | "node_modules/parse5-htmlparser2-tree-adapter": { 1833 | "version": "7.0.0", 1834 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", 1835 | "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", 1836 | "dependencies": { 1837 | "domhandler": "^5.0.2", 1838 | "parse5": "^7.0.0" 1839 | }, 1840 | "funding": { 1841 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1842 | } 1843 | }, 1844 | "node_modules/path-exists": { 1845 | "version": "4.0.0", 1846 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1847 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1848 | "dev": true, 1849 | "engines": { 1850 | "node": ">=8" 1851 | } 1852 | }, 1853 | "node_modules/path-is-absolute": { 1854 | "version": "1.0.1", 1855 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1856 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1857 | "engines": { 1858 | "node": ">=0.10.0" 1859 | } 1860 | }, 1861 | "node_modules/path-key": { 1862 | "version": "3.1.1", 1863 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1864 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1865 | "dev": true, 1866 | "engines": { 1867 | "node": ">=8" 1868 | } 1869 | }, 1870 | "node_modules/path-parse": { 1871 | "version": "1.0.7", 1872 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1873 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 1874 | }, 1875 | "node_modules/path-root": { 1876 | "version": "0.1.1", 1877 | "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", 1878 | "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", 1879 | "dependencies": { 1880 | "path-root-regex": "^0.1.0" 1881 | }, 1882 | "engines": { 1883 | "node": ">=0.10.0" 1884 | } 1885 | }, 1886 | "node_modules/path-root-regex": { 1887 | "version": "0.1.2", 1888 | "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", 1889 | "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", 1890 | "engines": { 1891 | "node": ">=0.10.0" 1892 | } 1893 | }, 1894 | "node_modules/picomatch": { 1895 | "version": "2.3.1", 1896 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1897 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1898 | "engines": { 1899 | "node": ">=8.6" 1900 | }, 1901 | "funding": { 1902 | "url": "https://github.com/sponsors/jonschlinkert" 1903 | } 1904 | }, 1905 | "node_modules/prelude-ls": { 1906 | "version": "1.2.1", 1907 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1908 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1909 | "dev": true, 1910 | "engines": { 1911 | "node": ">= 0.8.0" 1912 | } 1913 | }, 1914 | "node_modules/punycode": { 1915 | "version": "2.3.1", 1916 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1917 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1918 | "dev": true, 1919 | "engines": { 1920 | "node": ">=6" 1921 | } 1922 | }, 1923 | "node_modules/queue-microtask": { 1924 | "version": "1.2.3", 1925 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1926 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1927 | "dev": true, 1928 | "funding": [ 1929 | { 1930 | "type": "github", 1931 | "url": "https://github.com/sponsors/feross" 1932 | }, 1933 | { 1934 | "type": "patreon", 1935 | "url": "https://www.patreon.com/feross" 1936 | }, 1937 | { 1938 | "type": "consulting", 1939 | "url": "https://feross.org/support" 1940 | } 1941 | ] 1942 | }, 1943 | "node_modules/qunit": { 1944 | "version": "2.20.0", 1945 | "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.20.0.tgz", 1946 | "integrity": "sha512-N8Fp1J55waE+QG1KwX2LOyqulZUToRrrPBqDOfYfuAMkEglFL15uwvmH1P4Tq/omQ/mGbBI8PEB3PhIfvUb+jg==", 1947 | "dev": true, 1948 | "dependencies": { 1949 | "commander": "7.2.0", 1950 | "node-watch": "0.7.3", 1951 | "tiny-glob": "0.2.9" 1952 | }, 1953 | "bin": { 1954 | "qunit": "bin/qunit.js" 1955 | }, 1956 | "engines": { 1957 | "node": ">=10" 1958 | } 1959 | }, 1960 | "node_modules/rechoir": { 1961 | "version": "0.7.1", 1962 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", 1963 | "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", 1964 | "dependencies": { 1965 | "resolve": "^1.9.0" 1966 | }, 1967 | "engines": { 1968 | "node": ">= 0.10" 1969 | } 1970 | }, 1971 | "node_modules/resolve": { 1972 | "version": "1.22.0", 1973 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 1974 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 1975 | "dependencies": { 1976 | "is-core-module": "^2.8.1", 1977 | "path-parse": "^1.0.7", 1978 | "supports-preserve-symlinks-flag": "^1.0.0" 1979 | }, 1980 | "bin": { 1981 | "resolve": "bin/resolve" 1982 | }, 1983 | "funding": { 1984 | "url": "https://github.com/sponsors/ljharb" 1985 | } 1986 | }, 1987 | "node_modules/resolve-dir": { 1988 | "version": "1.0.1", 1989 | "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", 1990 | "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", 1991 | "dependencies": { 1992 | "expand-tilde": "^2.0.0", 1993 | "global-modules": "^1.0.0" 1994 | }, 1995 | "engines": { 1996 | "node": ">=0.10.0" 1997 | } 1998 | }, 1999 | "node_modules/resolve-from": { 2000 | "version": "4.0.0", 2001 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2002 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2003 | "dev": true, 2004 | "engines": { 2005 | "node": ">=4" 2006 | } 2007 | }, 2008 | "node_modules/reusify": { 2009 | "version": "1.0.4", 2010 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2011 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2012 | "dev": true, 2013 | "engines": { 2014 | "iojs": ">=1.0.0", 2015 | "node": ">=0.10.0" 2016 | } 2017 | }, 2018 | "node_modules/rimraf": { 2019 | "version": "3.0.2", 2020 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2021 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2022 | "dev": true, 2023 | "dependencies": { 2024 | "glob": "^7.1.3" 2025 | }, 2026 | "bin": { 2027 | "rimraf": "bin.js" 2028 | }, 2029 | "funding": { 2030 | "url": "https://github.com/sponsors/isaacs" 2031 | } 2032 | }, 2033 | "node_modules/rimraf/node_modules/glob": { 2034 | "version": "7.1.7", 2035 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 2036 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 2037 | "dev": true, 2038 | "dependencies": { 2039 | "fs.realpath": "^1.0.0", 2040 | "inflight": "^1.0.4", 2041 | "inherits": "2", 2042 | "minimatch": "^3.0.4", 2043 | "once": "^1.3.0", 2044 | "path-is-absolute": "^1.0.0" 2045 | }, 2046 | "engines": { 2047 | "node": "*" 2048 | }, 2049 | "funding": { 2050 | "url": "https://github.com/sponsors/isaacs" 2051 | } 2052 | }, 2053 | "node_modules/run-parallel": { 2054 | "version": "1.2.0", 2055 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2056 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2057 | "dev": true, 2058 | "funding": [ 2059 | { 2060 | "type": "github", 2061 | "url": "https://github.com/sponsors/feross" 2062 | }, 2063 | { 2064 | "type": "patreon", 2065 | "url": "https://www.patreon.com/feross" 2066 | }, 2067 | { 2068 | "type": "consulting", 2069 | "url": "https://feross.org/support" 2070 | } 2071 | ], 2072 | "dependencies": { 2073 | "queue-microtask": "^1.2.2" 2074 | } 2075 | }, 2076 | "node_modules/safer-buffer": { 2077 | "version": "2.1.2", 2078 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2079 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2080 | }, 2081 | "node_modules/sax": { 2082 | "version": "1.2.4", 2083 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 2084 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 2085 | }, 2086 | "node_modules/shebang-command": { 2087 | "version": "2.0.0", 2088 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2089 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2090 | "dev": true, 2091 | "dependencies": { 2092 | "shebang-regex": "^3.0.0" 2093 | }, 2094 | "engines": { 2095 | "node": ">=8" 2096 | } 2097 | }, 2098 | "node_modules/shebang-regex": { 2099 | "version": "3.0.0", 2100 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2101 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2102 | "dev": true, 2103 | "engines": { 2104 | "node": ">=8" 2105 | } 2106 | }, 2107 | "node_modules/sprintf-js": { 2108 | "version": "1.1.2", 2109 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 2110 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" 2111 | }, 2112 | "node_modules/strip-ansi": { 2113 | "version": "6.0.1", 2114 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2115 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2116 | "dev": true, 2117 | "dependencies": { 2118 | "ansi-regex": "^5.0.1" 2119 | }, 2120 | "engines": { 2121 | "node": ">=8" 2122 | } 2123 | }, 2124 | "node_modules/strip-json-comments": { 2125 | "version": "3.1.1", 2126 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2127 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2128 | "dev": true, 2129 | "engines": { 2130 | "node": ">=8" 2131 | }, 2132 | "funding": { 2133 | "url": "https://github.com/sponsors/sindresorhus" 2134 | } 2135 | }, 2136 | "node_modules/supports-color": { 2137 | "version": "7.2.0", 2138 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2139 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2140 | "dependencies": { 2141 | "has-flag": "^4.0.0" 2142 | }, 2143 | "engines": { 2144 | "node": ">=8" 2145 | } 2146 | }, 2147 | "node_modules/supports-preserve-symlinks-flag": { 2148 | "version": "1.0.0", 2149 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2150 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2151 | "engines": { 2152 | "node": ">= 0.4" 2153 | }, 2154 | "funding": { 2155 | "url": "https://github.com/sponsors/ljharb" 2156 | } 2157 | }, 2158 | "node_modules/text-table": { 2159 | "version": "0.2.0", 2160 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2161 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2162 | "dev": true 2163 | }, 2164 | "node_modules/tiny-glob": { 2165 | "version": "0.2.9", 2166 | "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", 2167 | "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", 2168 | "dev": true, 2169 | "dependencies": { 2170 | "globalyzer": "0.1.0", 2171 | "globrex": "^0.1.2" 2172 | } 2173 | }, 2174 | "node_modules/to-regex-range": { 2175 | "version": "5.0.1", 2176 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2177 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2178 | "dependencies": { 2179 | "is-number": "^7.0.0" 2180 | }, 2181 | "engines": { 2182 | "node": ">=8.0" 2183 | } 2184 | }, 2185 | "node_modules/type-check": { 2186 | "version": "0.4.0", 2187 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2188 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2189 | "dev": true, 2190 | "dependencies": { 2191 | "prelude-ls": "^1.2.1" 2192 | }, 2193 | "engines": { 2194 | "node": ">= 0.8.0" 2195 | } 2196 | }, 2197 | "node_modules/type-fest": { 2198 | "version": "0.20.2", 2199 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2200 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2201 | "dev": true, 2202 | "engines": { 2203 | "node": ">=10" 2204 | }, 2205 | "funding": { 2206 | "url": "https://github.com/sponsors/sindresorhus" 2207 | } 2208 | }, 2209 | "node_modules/unc-path-regex": { 2210 | "version": "0.1.2", 2211 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 2212 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", 2213 | "engines": { 2214 | "node": ">=0.10.0" 2215 | } 2216 | }, 2217 | "node_modules/underscore.string": { 2218 | "version": "3.3.6", 2219 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", 2220 | "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", 2221 | "dependencies": { 2222 | "sprintf-js": "^1.1.1", 2223 | "util-deprecate": "^1.0.2" 2224 | }, 2225 | "engines": { 2226 | "node": "*" 2227 | } 2228 | }, 2229 | "node_modules/uri-js": { 2230 | "version": "4.4.1", 2231 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2232 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2233 | "dev": true, 2234 | "dependencies": { 2235 | "punycode": "^2.1.0" 2236 | } 2237 | }, 2238 | "node_modules/util-deprecate": { 2239 | "version": "1.0.2", 2240 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2241 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2242 | }, 2243 | "node_modules/v8flags": { 2244 | "version": "3.2.0", 2245 | "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", 2246 | "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", 2247 | "dependencies": { 2248 | "homedir-polyfill": "^1.0.1" 2249 | }, 2250 | "engines": { 2251 | "node": ">= 0.10" 2252 | } 2253 | }, 2254 | "node_modules/which": { 2255 | "version": "4.0.0", 2256 | "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", 2257 | "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", 2258 | "dependencies": { 2259 | "isexe": "^3.1.1" 2260 | }, 2261 | "bin": { 2262 | "node-which": "bin/which.js" 2263 | }, 2264 | "engines": { 2265 | "node": "^16.13.0 || >=18.0.0" 2266 | } 2267 | }, 2268 | "node_modules/which/node_modules/isexe": { 2269 | "version": "3.1.1", 2270 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", 2271 | "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", 2272 | "engines": { 2273 | "node": ">=16" 2274 | } 2275 | }, 2276 | "node_modules/wordpress": { 2277 | "version": "1.4.2", 2278 | "resolved": "https://registry.npmjs.org/wordpress/-/wordpress-1.4.2.tgz", 2279 | "integrity": "sha512-T+o+Af6pK7mhTz/rJEZk4PpSIyRMVhx6vZm6UsmrnlL8pVudhu1gWzn1n3wZXlcEZQz7I0AOkEvPQ5hu++L+qg==", 2280 | "dependencies": { 2281 | "xmlrpc": "1.3.2" 2282 | } 2283 | }, 2284 | "node_modules/wrappy": { 2285 | "version": "1.0.2", 2286 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2287 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2288 | }, 2289 | "node_modules/xmlbuilder": { 2290 | "version": "8.2.2", 2291 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", 2292 | "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=", 2293 | "engines": { 2294 | "node": ">=4.0" 2295 | } 2296 | }, 2297 | "node_modules/xmlrpc": { 2298 | "version": "1.3.2", 2299 | "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz", 2300 | "integrity": "sha1-JrLqNHhI0Ciqx+dRS1NRl23j6D0=", 2301 | "dependencies": { 2302 | "sax": "1.2.x", 2303 | "xmlbuilder": "8.2.x" 2304 | }, 2305 | "engines": { 2306 | "node": ">=0.8", 2307 | "npm": ">=1.0.0" 2308 | } 2309 | }, 2310 | "node_modules/yocto-queue": { 2311 | "version": "0.1.0", 2312 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2313 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2314 | "dev": true, 2315 | "engines": { 2316 | "node": ">=10" 2317 | }, 2318 | "funding": { 2319 | "url": "https://github.com/sponsors/sindresorhus" 2320 | } 2321 | } 2322 | } 2323 | } 2324 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grunt-jquery-content", 3 | "description": "A collection of tasks for building the jQuery websites", 4 | "version": "3.3.2", 5 | "homepage": "https://github.com/jquery/grunt-jquery-content", 6 | "author": { 7 | "name": "jQuery Foundation and other contributors" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/jquery/grunt-jquery-content.git" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/jquery/grunt-jquery-content/issues" 15 | }, 16 | "licenses": [ 17 | { 18 | "type": "MIT", 19 | "url": "https://github.com/jquery/grunt-jquery-content/blob/main/LICENSE.txt" 20 | } 21 | ], 22 | "dependencies": { 23 | "cheerio": "^1.0.0-rc.12", 24 | "grunt-check-modules": "^1.1.0", 25 | "gilded-wordpress": "1.0.7", 26 | "he": "^1.2.0", 27 | "highlight.js": "^10.7.2", 28 | "marked": "^4.0.0", 29 | "which": "^4.0.0", 30 | "wordpress": "^1.4.1" 31 | }, 32 | "scripts": { 33 | "test": "eslint . && qunit test/*.js", 34 | "lint-example": "grunt lint", 35 | "build-example": "grunt build" 36 | }, 37 | "devDependencies": { 38 | "eslint": "^8.53.0", 39 | "eslint-config-jquery": "3.0.2", 40 | "grunt": "^1.6.1", 41 | "qunit": "^2.20.0" 42 | }, 43 | "keywords": [ 44 | "gruntplugin" 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /tasks/build-xml.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports = function( grunt ) { 4 | 5 | const fs = require( "fs" ); 6 | const path = require( "path" ); 7 | const which = require( "which" ); 8 | const cp = require( "child_process" ); 9 | const util = require( "../lib/util" ); 10 | const syntaxHighlight = require( "../lib/highlight" ); 11 | 12 | function checkLibxml2( executable ) { 13 | try { 14 | which.sync( executable ); 15 | } catch ( error ) { 16 | grunt.log.error( "Missing executable: " + executable + "." ); 17 | grunt.log.error( "You must install libxml2." ); 18 | grunt.log.error( "Downloads are available from http://www.xmlsoft.org/downloads.html" ); 19 | return false; 20 | } 21 | 22 | return true; 23 | } 24 | 25 | function checkXmllint() { 26 | return checkLibxml2( "xmllint" ); 27 | } 28 | 29 | function checkXsltproc() { 30 | return checkLibxml2( "xsltproc" ); 31 | } 32 | 33 | grunt.registerMultiTask( "xmllint", "Lint xml files", async function() { 34 | var task = this, 35 | taskDone = task.async(); 36 | 37 | if ( !checkXmllint() ) { 38 | return taskDone( false ); 39 | } 40 | 41 | var count = 0; 42 | async function lintFile( fileName ) { 43 | count++; 44 | grunt.verbose.write( "Linting " + fileName + "..." ); 45 | cp.spawnSync( "xmllint", [ "--noout", fileName ] ); 46 | grunt.verbose.ok(); 47 | } 48 | 49 | try { 50 | await util.eachFile( this.filesSrc, lintFile ); 51 | } catch ( e ) { 52 | grunt.verbose.error(); 53 | grunt.log.error( e ); 54 | grunt.warn( "Task \"" + task.name + "\" failed." ); 55 | taskDone(); 56 | return; 57 | } 58 | 59 | grunt.log.writeln( "Lint free files: " + count ); 60 | taskDone(); 61 | } ); 62 | 63 | grunt.registerMultiTask( "build-xml-entries", 64 | "Process API xml files with xsl and syntax highlight", async function() { 65 | var task = this, 66 | taskDone = task.async(), 67 | targetDir = grunt.config( "wordpress.dir" ) + "/posts/post/"; 68 | 69 | if ( !checkXsltproc() ) { 70 | return taskDone( false ); 71 | } 72 | 73 | grunt.file.mkdir( targetDir ); 74 | 75 | var count = 0; 76 | async function transformFile( fileName ) { 77 | count++; 78 | grunt.verbose.write( "Transforming " + fileName + "..." ); 79 | const result = cp.spawnSync( "xsltproc", 80 | [ "--xinclude", "entries2html.xsl", fileName ] 81 | ); 82 | 83 | // Certain errors won't cause the tranform to fail. For example, a 84 | // broken include will write to stderr, but still exit cleanly. 85 | const error = result.stderr && result.stderr.toString(); 86 | if ( error ) { 87 | throw new Error( error ); 88 | } 89 | 90 | let content = result.stdout.toString(); 91 | 92 | // Syntax highlight code blocks 93 | if ( !grunt.option( "nohighlight" ) ) { 94 | content = syntaxHighlight( content ); 95 | } 96 | 97 | const targetFileName = targetDir + path.basename( fileName, ".xml" ) + ".html"; 98 | grunt.file.write( targetFileName, content ); 99 | grunt.verbose.ok(); 100 | } 101 | 102 | try { 103 | await util.eachFile( this.filesSrc, transformFile ); 104 | } catch ( e ) { 105 | grunt.verbose.error(); 106 | grunt.log.error( e ); 107 | grunt.warn( "Task \"" + task.name + "\" failed." ); 108 | taskDone(); 109 | return; 110 | } 111 | 112 | grunt.log.writeln( "Built " + count + " entries." ); 113 | taskDone(); 114 | } ); 115 | 116 | grunt.registerTask( "build-xml-categories", function() { 117 | var taskDone = this.async(), 118 | targetPath = grunt.config( "wordpress.dir" ) + "/taxonomies.json"; 119 | 120 | if ( !checkXsltproc() ) { 121 | return taskDone( false ); 122 | } 123 | 124 | try { 125 | cp.spawnSync( "xsltproc", [ 126 | "--output", "taxonomies.xml", 127 | path.join( __dirname, "jquery-xml/cat2tax.xsl" ), 128 | "categories.xml" 129 | ] ); 130 | } catch ( error ) { 131 | grunt.verbose.error(); 132 | grunt.log.error( error ); 133 | return taskDone(); 134 | } 135 | 136 | try { 137 | cp.spawnSync( "xsltproc", [ 138 | "--output", targetPath, 139 | path.join( __dirname, "jquery-xml/xml2json.xsl" ), 140 | "taxonomies.xml" 141 | ] ); 142 | } catch ( error ) { 143 | grunt.verbose.error(); 144 | grunt.log.error( error ); 145 | return taskDone(); 146 | } 147 | 148 | // xml2json can't determine when to use an array if there is only one child, 149 | // so we need to ensure all child terms are stored in an array 150 | var taxonomies = grunt.file.readJSON( targetPath ); 151 | function normalize( term ) { 152 | if ( term.children && term.children.item ) { 153 | term.children = [ term.children.item ]; 154 | } 155 | 156 | if ( term.children ) { 157 | term.children.forEach( normalize ); 158 | } 159 | } 160 | taxonomies.category.forEach( normalize ); 161 | grunt.file.write( targetPath, JSON.stringify( taxonomies ) ); 162 | 163 | // Syntax highlight code blocks 164 | function highlightDescription( category ) { 165 | if ( category.description ) { 166 | category.description = syntaxHighlight( category.description ); 167 | } 168 | } 169 | 170 | function highlightCategories( categories ) { 171 | categories.forEach( function( category ) { 172 | highlightDescription( category ); 173 | if ( category.children ) { 174 | highlightCategories( category.children ); 175 | } 176 | } ); 177 | } 178 | 179 | if ( !grunt.option( "nohighlight" ) ) { 180 | taxonomies = grunt.file.readJSON( targetPath ); 181 | highlightCategories( taxonomies.category ); 182 | grunt.file.write( targetPath, JSON.stringify( taxonomies ) ); 183 | } 184 | 185 | fs.unlinkSync( "taxonomies.xml" ); 186 | grunt.verbose.ok(); 187 | taskDone(); 188 | } ); 189 | 190 | grunt.registerTask( "build-xml-full", function() { 191 | var taskDone = this.async(); 192 | 193 | if ( !checkXsltproc() ) { 194 | return taskDone( false ); 195 | } 196 | 197 | grunt.file.copy( path.join( __dirname, "jquery-xml/all-entries.xml" ), "all-entries.xml", { 198 | process: function( content ) { 199 | return content.replace( "", 200 | grunt.file.expand( "entries/*.xml" ).map( function( entry ) { 201 | return ""; 202 | } ).join( "\n" ) ); 203 | } 204 | } ); 205 | 206 | let result; 207 | let error; 208 | try { 209 | result = cp.spawnSync( "xsltproc", [ 210 | "--xinclude", 211 | "--path", process.cwd(), 212 | path.join( __dirname, "jquery-xml/all-entries.xsl" ), 213 | "all-entries.xml" 214 | ] ); 215 | } catch ( e ) { 216 | error = e; 217 | } 218 | 219 | // For some reason using --output with xsltproc kills the --xinclude option, 220 | // so we let it write to stdout, then save it to a file 221 | const content = result.stdout.toString(); 222 | grunt.file.write( grunt.config( "wordpress.dir" ) + "/resources/api.xml", content ); 223 | fs.unlinkSync( "all-entries.xml" ); 224 | 225 | if ( error ) { 226 | grunt.verbose.error(); 227 | grunt.log.error( error ); 228 | return taskDone( false ); 229 | } 230 | 231 | taskDone(); 232 | } ); 233 | 234 | }; 235 | -------------------------------------------------------------------------------- /tasks/build.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports = function( grunt ) { 4 | 5 | const fs = require( "fs" ); 6 | const wordpress = require( "gilded-wordpress" ); 7 | const util = require( "../lib/util" ); 8 | const syntaxHighlight = require( "../lib/highlight" ); 9 | const mainExports = require( "../" ); 10 | 11 | // Load external tasks as local tasks 12 | // Grunt doesn't provide an API to pass thru tasks from dependent grunt plugins 13 | require( "grunt-check-modules/tasks/check-modules" )( grunt ); 14 | 15 | grunt.registerTask( "clean-dist", function() { 16 | fs.rmSync( "dist", { recursive: true, force: true } ); 17 | } ); 18 | 19 | // Define an empty lint task, to be redefined by each site with relevant lint tasks 20 | grunt.registerTask( "lint", [] ); 21 | 22 | grunt.registerTask( "build-wordpress", [ "check-modules", "lint", "clean-dist", "build" ] ); 23 | 24 | grunt.registerMultiTask( "build-posts", 25 | "Process html and markdown files as posts", async function() { 26 | var task = this, 27 | taskDone = task.async(), 28 | wordpressClient = wordpress.createClient( grunt.config( "wordpress" ) ), 29 | postType = this.target, 30 | preprocessor = mainExports.postPreprocessors[ postType ] || 31 | mainExports.postPreprocessors._default, 32 | targetDir = grunt.config( "wordpress.dir" ) + "/posts/" + postType + "/"; 33 | 34 | grunt.file.mkdir( targetDir ); 35 | 36 | async function parsePost( fileName ) { 37 | return new Promise( function( resolve, reject ) { 38 | wordpressClient.parsePost( fileName, function( error, post ) { 39 | if ( error ) { 40 | return reject( error ); 41 | } 42 | 43 | preprocessor( post, fileName, function( err, res ) { 44 | if ( error ) { 45 | return reject( err ); 46 | } 47 | resolve( res ); 48 | } ); 49 | } ); 50 | } ); 51 | } 52 | 53 | var count = 0; 54 | async function processFile( fileName ) { 55 | count++; 56 | grunt.verbose.write( "Processing " + fileName + "..." ); 57 | 58 | const post = await parsePost( fileName ); 59 | 60 | var content = post.content, 61 | fileType = /\.(\w+)$/.exec( fileName )[ 1 ], 62 | targetFileName = targetDir + 63 | ( post.fileName || fileName.replace( /^.+?\/(.+)\.\w+$/, "$1" ) + ".html" ); 64 | 65 | delete post.content; 66 | delete post.fileName; 67 | 68 | // Convert markdown to HTML 69 | if ( fileType === "md" ) { 70 | content = util.parseMarkdown( content, { 71 | generateLinks: post.toc || !post.noHeadingLinks, 72 | generateToc: post.toc 73 | } ); 74 | delete post.noHeadingLinks; 75 | delete post.toc; 76 | } 77 | 78 | // Replace partials 79 | content = content.replace( /@partial\((.+)\)/g, function( _match, input ) { 80 | return util.htmlEscape( grunt.file.read( input ) ); 81 | } ); 82 | 83 | // Syntax highlight code blocks 84 | if ( !grunt.option( "nohighlight" ) ) { 85 | content = syntaxHighlight( content ); 86 | } 87 | 88 | post.customFields = post.customFields || []; 89 | post.customFields.push( { 90 | key: "source_path", 91 | value: fileName 92 | } ); 93 | 94 | // Write file 95 | grunt.file.write( targetFileName, 96 | "\n" + content ); 97 | } 98 | 99 | try { 100 | await util.eachFile( this.filesSrc, processFile ); 101 | } catch ( e ) { 102 | grunt.warn( "Task \"" + task.name + "\" failed." ); 103 | return taskDone(); 104 | } 105 | 106 | grunt.log.writeln( "Built " + count + " pages." ); 107 | taskDone(); 108 | } ); 109 | 110 | grunt.registerMultiTask( "build-resources", "Copy resources", function() { 111 | var task = this, 112 | taskDone = task.async(), 113 | targetDir = grunt.config( "wordpress.dir" ) + "/resources/"; 114 | 115 | grunt.file.mkdir( targetDir ); 116 | 117 | var count = 0; 118 | try { 119 | for ( const fileName of this.filesSrc ) { 120 | if ( grunt.file.isFile( fileName ) ) { 121 | grunt.file.copy( fileName, targetDir + fileName.replace( /^.+?\//, "" ) ); 122 | count++; 123 | } 124 | } 125 | } catch ( e ) { 126 | grunt.warn( "Task \"" + task.name + "\" failed." ); 127 | return taskDone(); 128 | } 129 | 130 | grunt.log.writeln( "Built " + count + " resources." ); 131 | taskDone(); 132 | } ); 133 | 134 | }; 135 | -------------------------------------------------------------------------------- /tasks/jquery-xml/all-entries.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /tasks/jquery-xml/all-entries.xsl: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /tasks/jquery-xml/cat2tax.xsl: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /tasks/jquery-xml/entries2html-base.xsl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 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 | entry-longdesc 73 | 74 | - 75 | 76 | 77 | 78 | 79 |
80 |
81 | 82 | 83 |

Additional Notes:

84 |
85 |
    86 | 87 |
  • 88 |
    89 |
90 |
91 |
92 | 93 | 94 | 95 | 96 |
97 | 98 | entry-examples 99 | 100 | - 101 | 102 | 103 | 104 |
105 |

Examples:

106 |
107 | 108 | 109 | 110 | 111 | 112 |
113 |
114 |
115 |
116 |
117 |
118 | 119 | 120 | 121 |
122 |

Contents:

123 |
    124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 |
135 |
136 |
137 | 138 | 139 | 140 | 141 |
  • 142 |
    143 | 144 | 145 | 146 | 147 | 148 | 149 |
  • 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 178 |
  • 179 |
    180 | 181 | 182 | 183 | 184 | 185 |

    186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | selector 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | event 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 |

    222 |
    223 | 224 | 225 | 226 | 227 |

    Description:

    228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 |
    251 | 252 | 253 |
      254 | 255 |
    • 256 |

      257 | 258 | jQuery( "" ) 259 |

      260 | 261 | 262 |

      263 | : 264 | 265 |

      266 |
      267 |
    • 268 |
      269 |
    270 |
    271 | 272 | 273 |
      274 | 276 | 277 |
    • 278 |

      279 | 280 | 281 |

      282 | 283 | 284 | 285 | 286 |
    • 287 |
      288 |
    289 |
    290 | 291 | 292 |
      293 | 295 | 296 |
    • 297 |

      298 | 299 | jQuery( 300 | 301 | 302 | 303 | 304 | 305 | ".selector" 306 | 307 | 308 | ).on( " 309 | 310 | ", function( event ) { ... } ) 311 |

      312 | 313 | 314 |

      Additional properties on the event object:

      315 | 316 |
      317 |
    • 318 |
      319 |
    320 |
    321 | 322 | 323 | 324 | 325 | 326 | 354 | 355 | 356 | 357 |
      358 | 359 |
    • 360 |

      361 | 362 | 363 |

      364 | 365 | 366 |
        367 | 368 |
      369 |
      370 |
    • 371 |
    372 |
    373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 |
    398 |
    399 |

    Options

    400 |
    401 | 402 | 403 |
    404 | 405 | api-item 406 | 407 | first-item 408 | 409 | 410 | 411 |

    412 |   413 |

    414 |
    415 | Type: 416 | 417 |
    418 |
    419 | Default: 420 | 421 | 422 | 423 | 424 |
    425 |
    426 |
    427 |
    428 | 429 | 430 | 431 | 432 | 433 | 434 |
    435 | 436 | Multiple types supported: 437 |
      438 | 439 |
    • 440 | 441 | : 442 | 443 |
    • 444 |
      445 |
    446 |
    447 | 448 | Code examples: 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 |
    460 |
    461 |
    462 |
    463 | 464 |
    465 |
    466 |

    Methods

    467 |
    468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 |
    480 |
    481 | 482 |
    483 |
    484 |

    Extension Points

    485 |
    486 |

    487 | The widget is built with the 488 | widget factory and can be 489 | extended. When extending widgets, you have the ability to override or add to the 490 | behavior of existing methods. The following methods are provided as extension points 491 | with the same API stability as the plugin methods listed 492 | above. For more information on widget extensions, see 493 | Extending 494 | Widgets with the Widget Factory. 495 |

    496 |
    497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 |
    509 |
    510 | 511 |
    512 |
    513 |

    Events

    514 |
    515 | 516 | 517 |
    518 | 519 | api-item 520 | 521 | first-item 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 |
    531 |
    532 |
    533 |
    534 |
    535 | 536 | 537 | 538 |
    539 |
    540 |

    541 | QuickNav 542 | 543 | 544 | 545 | #entry-examples 546 | 547 | - 548 | 549 | 550 | Examples 551 | 552 | 553 |

    554 |
    555 | 556 |
    557 |

    Options

    558 | 559 | 560 | 561 |
    562 |
    563 |
    564 | 565 |
    566 |

    Methods

    567 | 568 | 569 | 570 |
    571 |
    572 | 573 |
    574 |

    Extension Points

    575 | 576 | 577 | 578 |
    579 |
    580 |
    581 |
    582 | 583 |
    584 |

    Events

    585 | 586 | 587 | 588 |
    589 |
    590 |
    591 |
    592 |
    593 | 594 | 595 | 596 | 597 |

    Initialize the with the option specified:

    598 |
    
     599 | 		$( ".selector" ).
     600 | 		
     601 | 		({
    	
     602 | 		
     603 | 		: 
     604 | 		
     605 | 		
    });
     606 | 	
    607 | 608 |

    609 | 610 | 611 | Get 612 | 613 | 614 | Get or set 615 | 616 | 617 | the 618 | 619 | option, after initialization: 620 |

    621 |
    
     622 | 		// Getter
    
     623 | 		var 
     624 | 		
     625 | 		 = $( ".selector" ).
     626 | 		
     627 | 		( "option", "
     628 | 		
     629 | 		" );
     630 | 
     631 | 		
     632 | 			
    
    
     633 | 			// Setter
    
     634 | 			$( ".selector" ).
     635 | 			
     636 | 			( "option", "
     637 | 			
     638 | 			", 
     639 | 			
     640 | 				
     641 | 					
     642 | 					 
     643 | 				
     644 | 				
     645 | 					
    	
     646 | 					
     647 | 					
    
     648 | 				
     649 | 			
     650 | 			);
     651 | 		
     652 | 	
    653 |
    654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 |
    662 | 663 | 664 | example- 665 | 666 | 667 | - 668 | 669 | 670 | 671 | 672 | 673 |

    674 | Example 675 |

    676 |
    677 |

    678 | 679 |

    680 |
    
     681 | 			
     682 | 				
     683 | 					
     684 | 				
     685 | 				
     686 | 					
     687 | 				
     688 | 			
     689 | 		
    690 | 691 | 692 |

    Demo:

    693 |
    694 | 695 | 696 | 697 | 698 | 699 |
    700 |
    701 | 702 | 703 |

    Result:

    704 |
    
     705 | 				
     706 | 			
    707 |
    708 |
    709 |
    710 | 711 | 712 | 713 | 714 | 715 | ERROR: Use either @type or type elements 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | or 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 750 | 751 | 752 | 753 | 754 | 755 | => 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | ( 768 | 769 | 770 | 771 | [ 772 | , 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | ] 782 | [, ... ] 783 | 784 | 785 | 786 | ) 787 | 788 | 789 | 790 | 791 | ERROR: Use either @return or return element 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | Returns: 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | or 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | ( 844 | plugin only 845 | ) 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | . 858 | 859 | ( 860 | 861 | 862 | 863 | [ 864 | , 865 | 866 | ] 867 | [, ... ] 868 | 869 | 870 | 871 | ) 872 | 873 | 874 | 875 | 876 | 877 |
      878 | 879 | 880 | 881 |
    882 |
    883 | 884 |
      885 |
    • 886 |
      887 | 888 | 889 | This signature does not accept any arguments. 890 | 891 | 892 | This method does not accept any arguments. 893 | 894 | 895 |
      896 |
    • 897 |
    898 |
    899 |
    900 | 901 | 902 | 903 | 904 |
      905 | 906 | 907 | 908 |
    909 |
    910 |
    911 | 912 | 913 | 914 | 915 |
  • 916 | 917 | 918 | 919 | 920 | 921 |
    922 | 923 | (default: ) 924 |
    925 |
    Type:
    926 |
    927 | 928 | 929 | 930 | 931 |
    932 | 933 |
      934 | 935 |
    936 |
    937 |
  • 938 |
    939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | ( 950 | 951 | version 952 | 953 | added: 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | , 968 | 969 | deprecated: 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | , 984 | 985 | removed: 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | ) 999 | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | 1011 | 1012 |
    1013 | 1014 |
    1015 | 1016 | api-item 1017 | 1018 | first-item 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 1027 | 1028 | 1029 | 1030 |
    1031 | Code examples: 1032 | 1033 | 1034 |

    Invoke the method:

    1035 |
    
    1036 | 								
    1037 | 									var 
    1038 | 									
    1039 | 									 = 
    1040 | 								
    1041 | 								$( ".selector" ).
    1042 | 								
    1043 | 								( "
    1044 | 								
    1045 | 								"
    1046 | 								
    1047 | 									, 
    1048 | 									
    1049 | 								
    1050 | 								 );
    1051 | 							
    1052 |
    1053 | 1054 | 1055 |

    1056 |
    
    1057 | 									
    1058 | 								
    1059 |
    1060 |
    1061 |
    1062 |
    1063 |
    1064 |
    1065 |
    1066 |
    1067 | 1068 | 1069 | 1070 | 1071 | 1072 |

    1073 | 1074 | 1075 | 1076 | 1077 | 1078 | 1079 |

    1080 |
    1081 | 1082 | 1083 | 1084 | 1085 | 1086 | 1087 |
    1088 | 1089 |
    1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 1097 | 1098 | 1099 | 1100 | 1101 | 1102 | 1103 | 1104 | 1105 | 1106 | 1107 | 1108 | 1109 | 1110 | 1111 | 1112 | 1113 | 1114 | 1115 | 1116 | 1117 |

    1118 | 1119 | 1120 | 1121 | Type: 1122 |

    1123 |
    1124 | 1125 | 1126 | 1127 | 1128 | 1129 | 1130 |
    1131 | 1132 | 1133 |

    Note: The ui object is empty but included for consistency with other events.

    1134 |
    1135 | 1136 |
    1137 | Code examples: 1138 | 1139 |

    Initialize the with the callback specified:

    1140 |
    
    1141 | 			$( ".selector" ).
    1142 | 			
    1143 | 			({
    	
    1144 | 			
    1145 | 			: function( event, ui ) {}
    });
    1146 | 		
    1147 | 1148 |

    Bind an event listener to the event:

    1149 |
    
    1150 | 			$( ".selector" ).on( "", function( event, ui ) {} );
    1151 | 		
    1152 | 1153 | 1154 | 1155 |

    1156 |
    
    1157 | 					
    1158 | 				
    1159 |
    1160 |
    1161 |
    1162 |
    1163 | 1164 | 1166 | 1167 | 1168 | 1169 | 1170 | 1171 | 1172 | 1173 | 1174 | 1175 | 1176 | 1177 | 1178 | 1179 | 1180 | 1181 | 1182 | 1183 | 1184 | 1185 | 1186 | 1187 | 1188 | 1189 | 1190 | 1191 | 1192 | 1193 | 1194 | 1195 | 1196 | 1197 | 1198 | 1199 | 1200 | 1206 | 1207 | 1208 | 1209 | 1210 | 1211 | 1212 | 1213 | 1214 | 1215 | 1216 | 1217 | 1218 | 1219 | 1220 | 1221 | "" 1222 | 1223 |
    1224 | -------------------------------------------------------------------------------- /tasks/jquery-xml/xml2json.xsl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 32 | 33 | 34 | 35 | 36 | 0123456789 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 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 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | true 130 | false 131 | 132 | 133 | 134 | { 135 | 136 | 137 | 138 | : 139 | 140 | 141 | 142 | null 143 | 144 | 145 | 146 | 147 | 148 | 149 | , 150 | } 151 | 152 | 153 | 154 | 155 | [ 156 | 157 | 158 | null 159 | 160 | 161 | 162 | 163 | 164 | , 165 | ] 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /tasks/redirects.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports = function( grunt ) { 4 | 5 | const wp = require( "wordpress" ); 6 | 7 | grunt.registerTask( "deploy-redirects", function() { 8 | const config = grunt.config( "wordpress" ); 9 | const redirects = grunt.file.exists( "redirects.json" ) ? 10 | grunt.file.readJSON( "redirects.json" ) : 11 | {}; 12 | const client = wp.createClient( config ); 13 | 14 | client.authenticatedCall( "jq.setRedirects", JSON.stringify( redirects ), this.async() ); 15 | } ); 16 | 17 | grunt.registerTask( "deploy", [ "wordpress-deploy", "deploy-redirects" ] ); 18 | 19 | }; 20 | -------------------------------------------------------------------------------- /tasks/wordpress.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const wordpress = require( "gilded-wordpress" ); 4 | 5 | module.exports = function( grunt ) { 6 | 7 | var client = ( function() { 8 | var _client; 9 | 10 | return function() { 11 | if ( !_client ) { 12 | var config = grunt.config( "wordpress" ); 13 | config.verbose = grunt.option( "verbose" ) || false; 14 | 15 | _client = wordpress.createClient( config ); 16 | _client.log = function() { 17 | grunt.log.writeln.apply( grunt.log, arguments ); 18 | }; 19 | _client.logError = function() { 20 | grunt.log.error.apply( grunt.log, arguments ); 21 | }; 22 | } 23 | 24 | return _client; 25 | }; 26 | } )(); 27 | 28 | grunt.registerTask( "wordpress-validate", function() { 29 | client().validate( this.async() ); 30 | } ); 31 | 32 | grunt.registerTask( "wordpress-sync", function() { 33 | this.requires( "wordpress-validate" ); 34 | client().sync( this.async() ); 35 | } ); 36 | 37 | grunt.registerTask( "wordpress-publish", [ "wordpress-validate", "wordpress-sync" ] ); 38 | grunt.registerTask( "wordpress-deploy", [ "build-wordpress", "wordpress-publish" ] ); 39 | grunt.registerTask( "deploy", [ "wordpress-deploy" ] ); 40 | 41 | }; 42 | -------------------------------------------------------------------------------- /test/build.test.js: -------------------------------------------------------------------------------- 1 | /* eslint-env qunit */ 2 | "use strict"; 3 | 4 | const cp = require( "child_process" ); 5 | const path = require( "path" ); 6 | const fs = require( "fs" ); 7 | const ROOT = path.join( __dirname, ".." ); 8 | const DIST = path.join( __dirname, "dist" ); 9 | const EXPECTED = path.join( __dirname, "expected" ); 10 | 11 | QUnit.module( "build", function() { 12 | QUnit.test( "dist", function( assert ) { 13 | fs.rmSync( DIST, { recursive: true, force: true } ); 14 | try { 15 | cp.execSync( "npm run build-example", { 16 | cwd: ROOT, 17 | env: { PATH: process.env.PATH, NPM_CONFIG_UPDATE_NOTIFIER: "false" }, 18 | encoding: "utf8" 19 | } ); 20 | } catch ( e ) { 21 | assert.equal( e.stdout || e.toString(), "", "error" ); 22 | return; 23 | } 24 | 25 | const actualFiles = fs.readdirSync( DIST, { recursive: true } ).sort(); 26 | const expectedFiles = fs.readdirSync( EXPECTED, { recursive: true } ).sort(); 27 | assert.deepEqual( actualFiles, expectedFiles, "file names" ); 28 | 29 | for ( const file of expectedFiles ) { 30 | if ( fs.statSync( path.join( EXPECTED, file ) ).isDirectory() ) { 31 | continue; 32 | } 33 | const actualContent = fs.readFileSync( path.join( DIST, file ), "utf8" ); 34 | const expectedContent = fs.readFileSync( path.join( EXPECTED, file ), "utf8" ); 35 | assert.strictEqual( actualContent, expectedContent, file ); 36 | } 37 | } ); 38 | } ); 39 | -------------------------------------------------------------------------------- /test/expected/wordpress/posts/page/pages/Hello_World.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pellentesque placerat arcu, vel viverra augue posuere commodo. Aenean hendrerit quam sed commodo pellentesque.

    4 |

    Donec sed commodo velit, non molestie justo.

    5 |

    Phasellus

    6 |

    Cras vel justo molestie lorem auctor convallis. Donec ac lacus tincidunt, euismod lectus eu, pulvinar tortor.

    7 |
    8 | 9 | 10 | 11 | 12 | 23 | 24 | 27 | 28 | 29 |
    13 | 14 |
    1
    15 | 16 |
    2
    17 | 18 |
    3
    19 | 20 |
    4
    21 | 22 |
    25 |
    Hello.world({
    // Handle the event
    // ......
    });
    26 |
    30 |
    31 | 32 |

    Sed sed molestie purus

    33 |

    Aliquam venenatis sem elit, et aliquet libero ultrices vitae. Nullam rutrum convallis justo, sed suscipit leo facilisis et. 34 |

    35 | -------------------------------------------------------------------------------- /test/expected/wordpress/posts/page/pages/Mark.html: -------------------------------------------------------------------------------- 1 | 2 |

    Conubia linguae hydrae novissima recepto certe, clarus quod amictus tum ignota fluctibus et quod, est verba capitum, variusque. Sui saevam gentes propiora Cycladas, Hecate stamina nurus ramum!

    3 |

    link Oculi miserarum

    Lorem markdownum silentia umerique, colla. Per felix innoxia pariterque capillos accessit, nec ad tempore in nubes detrahitur.

    4 |

    Aures precantibus supplice Medusaeo, Lycormas est esse aestuat aut Pterelas.

    5 |

    link Domitos interea

      6 |
    1. Non torsi numine amor
    2. 7 |
    3. Tamen vino hinc indignatus aquas iunguntur sacrifica
    4. 8 |
    5. Solitum bacae tellure ille
    6. 9 |
    10 | -------------------------------------------------------------------------------- /test/expected/wordpress/posts/post/addClass.html: -------------------------------------------------------------------------------- 1 |

    12 | .addClass( className )Returns: jQuery 13 |

    14 |
    15 |

    Description: Adds the specified class(es) to each element in the set of matched elements.

    16 |
      17 |
    • 18 |

      19 | version added: 1.0.addClass( className ) 20 |

      21 |
      • 22 |
        className
        23 |
        Type: String 24 |
        25 |
        One or more space-separated classes to be added.
        26 |
      27 |
    • 28 |
    • 29 |

      30 | version added: 1.4.addClass( function ) 31 |

      32 |
      • 33 |
        function
        34 |
        Type: Function( Integer index, String currentClassName ) 35 | => 36 | String 37 |
        38 |
        A function returning one or more space-separated class names.
        39 |
      40 |
    • 41 |
    42 |
    43 |

    This method does not replace a class. It simply adds the class.

    44 |
    45 | 46 | 47 | 48 | 49 | 54 | 55 | 58 | 59 | 60 |
    50 | 51 |
    1
    52 | 53 |
    56 |
    $( "p" ).addClass( "myClass yourClass" );
    57 |
    61 |
    62 | 63 |

    The .addClass() method changes the className property on the selected elements.

    64 |
    65 |

    Example:

    66 |

    Add the class "selected" to the matched elements.

    67 |
    68 | 69 | 70 | 71 | 72 | 107 | 108 | 111 | 112 | 113 |
    73 | 74 |
    1
    75 | 76 |
    2
    77 | 78 |
    3
    79 | 80 |
    4
    81 | 82 |
    5
    83 | 84 |
    6
    85 | 86 |
    7
    87 | 88 |
    8
    89 | 90 |
    9
    91 | 92 |
    10
    93 | 94 |
    11
    95 | 96 |
    12
    97 | 98 |
    13
    99 | 100 |
    14
    101 | 102 |
    15
    103 | 104 |
    16
    105 | 106 |
    109 |
    <!doctype html>
    <style>
    p {
    margin: 8px;
    font-size: 16px;
    }
    .selected {
    color: blue;
    }
    .highlight {
    background: yellow;
    }
    </style>
    <p>Hello</p>
    <p>and</p>
    <p>Goodbye</p>
    110 |
    114 |
    115 | 116 |

    Demo:

    117 |
    118 |
    119 |
    120 | -------------------------------------------------------------------------------- /test/expected/wordpress/resources/resources/x.txt: -------------------------------------------------------------------------------- 1 | x 2 | -------------------------------------------------------------------------------- /test/lint.test.js: -------------------------------------------------------------------------------- 1 | /* eslint-env qunit */ 2 | "use strict"; 3 | 4 | const cp = require( "child_process" ); 5 | const path = require( "path" ); 6 | const ROOT = path.join( __dirname, ".." ); 7 | 8 | QUnit.module( "lint", function() { 9 | QUnit.test( "fixture", function( assert ) { 10 | let stdout; 11 | try { 12 | const result = cp.execSync( "npm run -s lint-example", { 13 | cwd: ROOT, 14 | env: { PATH: process.env.PATH, NPM_CONFIG_UPDATE_NOTIFIER: "false" }, 15 | encoding: "utf8" 16 | } ); 17 | stdout = result.toString().trim(); 18 | } catch ( e ) { 19 | assert.equal( e.stdout || e.toString(), "", "error" ); 20 | return; 21 | } 22 | 23 | const expect = 24 | `Running "xmllint:all" (xmllint) task 25 | Lint free files: 2 26 | 27 | Done.`; 28 | assert.strictEqual( stdout, expect, "stdout" ); 29 | } ); 30 | } ); 31 | --------------------------------------------------------------------------------