diff --git a/Gruntfile.js b/Gruntfile.js index 670c1bcd6a..a96789fdad 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,58 +1,56 @@ module.exports = function( grunt ) { - if ( ! grunt.option( 'wp' ) ) { - grunt.option( 'wp', 'master' ); - } - grunt.initConfig({ - connect: { - server: { - options: { - base: '.' - } - } - }, - qunit: { + 'use strict'; + + // Project configuration + grunt.initConfig( { + + pkg: grunt.file.readJSON( 'package.json' ), + + addtextdomain: { options: { - timeout: 7000 - }, - latest: { - options: { - urls: ['http://localhost:8000/tests/js/index.html'] - } + textdomain: 'fieldmanager', }, - recent: { + update_all_domains: { options: { - urls: [ - 'http://localhost:8000/tests/js/index.html', - 'http://localhost:8000/tests/js/index.html?wp=4.9', - 'http://localhost:8000/tests/js/index.html?wp=4.8' - ] + updateDomains: true + }, + src: [ '*.php', '**/*.php', '!\.git/**/*', '!bin/**/*', '!node_modules/**/*', '!tests/**/*' ] + } + }, + + wp_readme_to_markdown: { + your_target: { + files: { + 'README.md': 'readme.txt' } }, - specific: { + }, + + makepot: { + target: { options: { - urls: [ 'http://localhost:8000/tests/js/index.html?wp=' + grunt.option( 'wp' ) ] + domainPath: '/languages', + exclude: [ '\.git/*', 'bin/*', 'node_modules/*', 'tests/*' ], + mainFile: 'fieldmanager.php', + potFilename: 'fieldmanager.pot', + potHeaders: { + poedit: true, + 'x-poedit-keywordslist': true + }, + type: 'wp-plugin', + updateTimestamp: true } } }, - phpcs: { - plugin: {}, - options: { - bin: "vendor/bin/phpcs", - showSniffCodes: true, - standard: "phpcs.ruleset.xml", - verbose: true, - warningSeverity: 0, - } - }, - }); - + } ); - grunt.loadNpmTasks( 'grunt-contrib-connect' ); - grunt.loadNpmTasks( 'grunt-contrib-qunit' ); - grunt.loadNpmTasks( 'grunt-phpcs' ); + grunt.loadNpmTasks( 'grunt-wp-i18n' ); + grunt.loadNpmTasks( 'grunt-wp-readme-to-markdown' ); + grunt.registerTask( 'default', [ 'i18n','readme' ] ); + grunt.registerTask( 'i18n', ['addtextdomain', 'makepot'] ); + grunt.registerTask( 'readme', ['wp_readme_to_markdown'] ); - grunt.task.run( 'connect' ); + grunt.util.linefeed = '\n'; - grunt.registerTask( 'default', ['qunit:latest'] ); }; diff --git a/fieldmanager.php b/fieldmanager.php index 20fa2faa79..63d076fcdb 100644 --- a/fieldmanager.php +++ b/fieldmanager.php @@ -13,6 +13,8 @@ Author: Alley Version: 1.3.0 Author URI: https://www.alley.co/ +Text Domain: fieldmanager +Domain Path: /languages */ /** @@ -139,6 +141,16 @@ function fieldmanager_get_template( $tpl_slug ) { return plugin_dir_path( __FILE__ ) . 'templates/' . $tpl_slug . '.php'; } +/** + * Load Fieldmanager's translated strings. + * + * @return bool @see load_plugin_textdomain(). + */ +function fm_load_textdomain() { + return load_plugin_textdomain( 'fieldmanager', false, plugin_basename( FM_BASE_DIR ) . '/languages/' ); +} +add_action( 'init', 'fm_load_textdomain' ); + /** * Enqueue a script, optionally localizing data to it. * @@ -473,7 +485,7 @@ function fm_register_submenu_page( $group_name, $parent_slug, $page_title, $menu } if ( isset( $submenus[ $group_name ] ) ) { /* translators: %s: group name */ - throw new FM_Duplicate_Submenu_Name_Exception( sprintf( esc_html__( '%s is already in use as a submenu name', 'fieldmanager' ), $group_name ) ); + throw new FM_Duplicate_Submenu_Name_Exception( sprintf( esc_html__( '%s is already in use as a submenu name.', 'fieldmanager' ), $group_name ) ); } if ( ! $menu_title ) { @@ -501,7 +513,7 @@ function fm_register_submenu_page( $group_name, $parent_slug, $page_title, $menu function _fm_submenu_render() { $context = _fieldmanager_registry( 'active_submenu' ); if ( ! is_object( $context ) ) { - throw new FM_Submenu_Not_Initialized_Exception( esc_html__( 'The Fieldmanger context for this submenu was not initialized', 'fieldmanager' ) ); + throw new FM_Submenu_Not_Initialized_Exception( esc_html__( 'The Fieldmanger context for this submenu was not initialized.', 'fieldmanager' ) ); } $context->render_submenu_page(); } diff --git a/languages/fieldmanager.pot b/languages/fieldmanager.pot new file mode 100644 index 0000000000..cec175f0df --- /dev/null +++ b/languages/fieldmanager.pot @@ -0,0 +1,331 @@ +# Copyright (C) 2021 Alley +# This file is distributed under the same license as the Fieldmanager package. +msgid "" +msgstr "" +"Project-Id-Version: Fieldmanager 1.3.0\n" +"Report-Msgid-Bugs-To: " +"https://wordpress.org/support/plugin/wordpress-fieldmanager\n" +"POT-Creation-Date: 2021-02-11 16:43:08+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2021-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Country: United States\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: " +"__;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c;esc_" +"attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;esc_html_x:1,2c;\n" +"X-Poedit-Basepath: ../\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-Bookmarks: \n" +"X-Textdomain-Support: yes\n" +"X-Generator: grunt-wp-i18n 1.0.3\n" + +#: fieldmanager.php:488 +#. translators: %s: group name +msgid "%s is already in use as a submenu name." +msgstr "" + +#: fieldmanager.php:516 +msgid "The Fieldmanger context for this submenu was not initialized." +msgstr "" + +#: php/class-fieldmanager-autocomplete.php:90 +msgid "You must supply a datasource for the autocomplete field." +msgstr "" + +#: php/class-fieldmanager-autocomplete.php:94 +msgid "No datasource." +msgstr "" + +#: php/class-fieldmanager-checkbox.php:82 +msgid "Saved a checkbox with a value that was not one of the options." +msgstr "" + +#: php/class-fieldmanager-draggablepost.php:142 +msgid "drop posts here" +msgstr "" + +#: php/class-fieldmanager-draggablepost.php:185 +msgid "(no authors)" +msgstr "" + +#: php/class-fieldmanager-field.php:406 php/class-fieldmanager-group.php:188 +#. translators: %s: `post_parent` +msgid "" +"A post can only have one parent, therefore you cannot store to %s in " +"repeatable fields." +msgstr "" + +#: php/class-fieldmanager-field.php:444 +#: php/datasource/class-fieldmanager-datasource.php:87 +#. translators: 1: property name, 2: class name, 3: field name +msgid "" +"You attempted to set a property %1$s that is nonexistant or invalid for an " +"instance of %2$s named %3$s." +msgstr "" + +#: php/class-fieldmanager-field.php:462 php/class-fieldmanager-group.php:178 +#: php/class-fieldmanager-group.php:350 +#. translators: 1: `'serialize_data' => false`, 2: `'index' => true` +msgid "You cannot use %1$s with %2$s." +msgstr "" + +#: php/class-fieldmanager-field.php:903 +#. translators: 1: `$values`, 2: `$limit`, 3: `limit` property value +msgid "%1$s should be an array because %2$s is %3$d." +msgstr "" + +#: php/class-fieldmanager-field.php:923 +#. translators: 1: count of submitted values, 2: `limit` property value +msgid "Submitted %1$d values against a limit of %2$d." +msgstr "" + +#: php/class-fieldmanager-field.php:931 +msgid "Use of a non-numeric key suggests that something is wrong with this group." +msgstr "" + +#: php/class-fieldmanager-field.php:1066 +#. translators: %s: `presave()` +msgid "%s in the base class should not get arrays, but did." +msgstr "" + +#: php/class-fieldmanager-field.php:1073 +#. translators: 1: field value, 2: field label +msgid "Input \"%1$s\" is not valid for field \"%2$s\" " +msgstr "" + +#: php/class-fieldmanager-field.php:1135 +msgid "Add group" +msgstr "" + +#: php/class-fieldmanager-field.php:1135 +msgid "Add field" +msgstr "" + +#: php/class-fieldmanager-field.php:1158 +msgid "Move" +msgstr "" + +#: php/class-fieldmanager-field.php:1167 php/class-fieldmanager-media.php:107 +msgid "Remove" +msgstr "" + +#: php/class-fieldmanager-field.php:1255 +msgid "This method requires WordPress 4.4 or above." +msgstr "" + +#: php/class-fieldmanager-field.php:1348 +msgid "You cannot use this method on a subgroup." +msgstr "" + +#: php/class-fieldmanager-field.php:1363 +msgid "Sorry, you're not supposed to do that..." +msgstr "" + +#: php/class-fieldmanager-field.php:1381 +msgid "You may be able to use your browser's back button to resolve this error." +msgstr "" + +#: php/class-fieldmanager-field.php:1398 +msgid "" +"Sorry, you've created an invalid field definition. Please check your code " +"and try again." +msgstr "" + +#: php/class-fieldmanager-grid.php:84 +msgid "Show Data Grid" +msgstr "" + +#: php/class-fieldmanager-grid.php:85 +msgid "Hide Data Grid" +msgstr "" + +#: php/class-fieldmanager-group.php:154 php/class-fieldmanager-group.php:206 +#. translators: %s: `'serialize_data' => false` +msgid "You cannot use %s with repeating groups." +msgstr "" + +#: php/class-fieldmanager-group.php:169 +#. translators: 1: group child name, 2: group child name +msgid "Group child name conflict: %1$s / %2$s." +msgstr "" + +#: php/class-fieldmanager-group.php:273 +msgid "More..." +msgstr "" + +#: php/class-fieldmanager-group.php:372 +#. translators: %s: key attempting to be saved +msgid "Found %s in data but not in children." +msgstr "" + +#: php/class-fieldmanager-media.php:102 +msgid "Attach a File" +msgstr "" + +#: php/class-fieldmanager-media.php:103 +msgid "Select Attachment" +msgstr "" + +#: php/class-fieldmanager-media.php:104 +msgid "Choose an Attachment" +msgstr "" + +#: php/class-fieldmanager-media.php:105 +msgid "Uploaded Image:" +msgstr "" + +#: php/class-fieldmanager-media.php:106 +msgid "Uploaded File:" +msgstr "" + +#: php/class-fieldmanager-options.php:252 +#. translators: 1: Invalid value, 2: field label +msgid "Input \"%1$s\" is not valid for field \"%2$s\"." +msgstr "" + +#: php/context/class-fieldmanager-context-menuitem.php:131 +msgid "User cannot edit this menu item" +msgstr "" + +#: php/context/class-fieldmanager-context-page.php:58 +#: php/context/class-fieldmanager-context.php:49 +msgid "Nonce validation failed." +msgstr "" + +#: php/context/class-fieldmanager-context-page.php:89 +msgid "Save Options" +msgstr "" + +#: php/context/class-fieldmanager-context-post.php:215 +#: php/context/class-fieldmanager-context-quickedit.php:224 +msgid "Current user cannot edit this post." +msgstr "" + +#: php/context/class-fieldmanager-context-quickedit.php:68 +msgid "You must set a valid column display callback." +msgstr "" + +#: php/context/class-fieldmanager-context-storable.php:81 +#. translators: %s: element key for the field +msgid "You have two fields in this group saving to the same key: %s." +msgstr "" + +#: php/context/class-fieldmanager-context-submenu.php:89 +msgid "Options updated." +msgstr "" + +#: php/context/class-fieldmanager-context-submenu.php:154 +msgid "Current user cannot edit this page." +msgstr "" + +#: php/context/class-fieldmanager-context-term.php:132 +#: php/context/class-fieldmanager-context-term.php:149 +#. translators: 1: `title`, 2: `taxonomies`, 3: `Fieldmanager_Context_Term` +msgid "%1$s and %2$s are required values for %3$s." +msgstr "" + +#: php/context/class-fieldmanager-context-term.php:254 +#. translators: %s: field name +msgid "The field name %s is reserved for WordPress on the term form." +msgstr "" + +#: php/context/class-fieldmanager-context-term.php:310 +msgid "Current user cannot edit this term." +msgstr "" + +#: php/context/class-fieldmanager-context-user.php:81 +msgid "Current user cannot edit this user." +msgstr "" + +#: php/datasource/class-fieldmanager-datasource-post.php:250 +#. translators: 1: post type name, 2: post ID, 3: field name +msgid "Tried to alter %1$s %2$d through field %3$s, which current user cannot edit." +msgstr "" + +#: php/datasource/class-fieldmanager-datasource-post.php:325 +#: php/datasource/class-fieldmanager-datasource-term.php:470 +msgid "View" +msgstr "" + +#: php/datasource/class-fieldmanager-datasource-post.php:340 +#: php/datasource/class-fieldmanager-datasource-term.php:488 +#: php/datasource/class-fieldmanager-datasource-user.php:326 +msgid "Edit" +msgstr "" + +#: php/datasource/class-fieldmanager-datasource-user.php:99 +#. translators: 1: invalid property name, 2: list of valid property names +msgid "Store property %1$s is invalid. Must be one of %2$s." +msgstr "" + +#: php/datasource/class-fieldmanager-datasource-user.php:102 +#: php/datasource/class-fieldmanager-datasource-user.php:128 +#. translators: used between list items, there is a space after the comma +msgid ", " +msgstr "" + +#: php/datasource/class-fieldmanager-datasource-user.php:114 +#. translators: 1: `Fieldmanager_Datasource_User`, 2: `store_property`, 3: `ID` +msgid "" +"You cannot use reciprocal relationships with %1$s if %2$s is not set to " +"%3$s." +msgstr "" + +#: php/datasource/class-fieldmanager-datasource-user.php:125 +#. translators: 1: invalid property name, 2: list of valid property names +msgid "Display property %1$s is invalid. Must be one of %2$s." +msgstr "" + +#: php/datasource/class-fieldmanager-datasource-user.php:275 +#. translators: %s: user id +msgid "Tried to refer to user \"%s\" which current user cannot edit." +msgstr "" + +#: php/datasource/class-fieldmanager-datasource.php:93 +msgid "Nonexistant or invalid option." +msgstr "" + +#: php/datasource/class-fieldmanager-datasource.php:103 +#. translators: %s: `$options` +msgid "Invalid datasource options; must use the %s parameter to supply an array." +msgstr "" + +#: php/datasource/class-fieldmanager-datasource.php:109 +msgid "Invalid datasource options." +msgstr "" + +#: php/util/class-fieldmanager-util-term-meta.php:66 +msgid "Fieldmanager Term Metadata" +msgstr "" + +#: php/util/class-fieldmanager-util-validation.php:150 +#: php/util/class-fieldmanager-util-validation.php:168 +#. translators: %s: validation rule name +msgid "The validation rule %s does not exist." +msgstr "" + +#. Plugin Name of the plugin/theme +msgid "Fieldmanager" +msgstr "" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/alleyinteractive/wordpress-fieldmanager" +msgstr "" + +#. Description of the plugin/theme +msgid "Add fields to WordPress programatically." +msgstr "" + +#. Author of the plugin/theme +msgid "Alley" +msgstr "" + +#. Author URI of the plugin/theme +msgid "https://www.alley.co/" +msgstr "" \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..f0f71377ff --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1908 @@ +{ + "name": "Fieldmanager", + "version": "1.3.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "~5.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "dev": true + }, + "gettext-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz", + "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "readable-stream": "^3.2.0", + "safe-buffer": "^5.1.2" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "grunt": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz", + "integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==", + "dev": true, + "requires": { + "dateformat": "~3.0.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~0.3.0", + "glob": "~7.1.6", + "grunt-cli": "~1.3.2", + "grunt-known-options": "~1.1.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.0", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "mkdirp": "~1.0.4", + "nopt": "~3.0.6", + "rimraf": "~3.0.2" + }, + "dependencies": { + "grunt-cli": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz", + "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==", + "dev": true, + "requires": { + "grunt-known-options": "~1.1.0", + "interpret": "~1.1.0", + "liftoff": "~2.5.0", + "nopt": "~4.0.1", + "v8flags": "~3.1.1" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + } + } + } + } + }, + "grunt-known-options": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", + "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", + "dev": true + }, + "grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "requires": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + } + }, + "grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "requires": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + } + }, + "grunt-legacy-util": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.0.tgz", + "integrity": "sha512-ZEmYFB44bblwPE2oz3q3ygfF6hseQja9tx8I3UZIwbUik32FMWewA+d1qSFicMFB+8dNXDkh35HcDCWlpRsGlA==", + "dev": true, + "requires": { + "async": "~1.5.2", + "exit": "~0.1.1", + "getobject": "~0.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.20", + "underscore.string": "~3.3.5", + "which": "~1.3.0" + } + }, + "grunt-wp-i18n": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/grunt-wp-i18n/-/grunt-wp-i18n-1.0.3.tgz", + "integrity": "sha512-CJNbEKeBeOSAPeaJ9B8iCgSwtaG63UR9/uT46a4OsIqnFhOJpeAi138JTlvjfIbnDVoBrzvdrKJe1svveLjUtA==", + "dev": true, + "requires": { + "grunt": "^1.0.3", + "node-wp-i18n": "^1.2.2" + } + }, + "grunt-wp-readme-to-markdown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-wp-readme-to-markdown/-/grunt-wp-readme-to-markdown-1.0.0.tgz", + "integrity": "sha1-dJ/9gDtYTVC9ZOc6ehqRhz6djPs=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + } + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "node-wp-i18n": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.5.tgz", + "integrity": "sha512-XX6GanJ+Ta5Wc/oNkhVrV+lGrhLe0zFx2pNb2diHF/DwDnwCVRHn6NSSyoU/mgTcVf4B/jtdoQ2CzWN/Q63MhA==", + "dev": true, + "requires": { + "bluebird": "^3.4.1", + "gettext-parser": "^3.1.0", + "glob": "^7.0.5", + "lodash": "^4.14.2", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "tmp": "^0.2.1" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore.string": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", + "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", + "dev": true, + "requires": { + "sprintf-js": "^1.0.3", + "util-deprecate": "^1.0.2" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 04a998dec1..4687107aec 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,24 @@ { - "name": "Fieldmanager", - "description": "Fieldmanager is a comprehensive toolkit for building forms, metaboxes, and custom admin screens for WordPress.", - "version": "1.3.0", - "repository": { - "type": "git", - "url": "https://github.com/alleyinteractive/wordpress-fieldmanager" - }, - "license": "GPL-2.0", - "devDependencies": { - "grunt": "^0.4.5", - "grunt-contrib-connect": "~0.11.0", - "grunt-contrib-qunit": "~0.7.0", - "grunt-phpcs": "^0.4.0" - } + "name": "Fieldmanager", + "description": "Fieldmanager is a comprehensive toolkit for building forms, metaboxes, and custom admin screens for WordPress.", + "version": "1.3.0", + "repository": { + "type": "git", + "url": "https://github.com/alleyinteractive/wordpress-fieldmanager" + }, + "scripts": { + "start": "grunt default", + "readme": "grunt readme", + "i18n": "grunt i18n" + }, + "license": "GPL-2.0", + "devDependencies": { + "grunt": "^1.3.0", + "grunt-wp-i18n": "^1.0.3", + "grunt-wp-readme-to-markdown": "~1.0.0" + }, + "engines": { + "node": "^12.19.0", + "npm": "^6.14.11" + } } diff --git a/php/class-fieldmanager-autocomplete.php b/php/class-fieldmanager-autocomplete.php index c0551b7983..4d009487f0 100644 --- a/php/class-fieldmanager-autocomplete.php +++ b/php/class-fieldmanager-autocomplete.php @@ -87,11 +87,11 @@ public function __construct( $label = '', $options = array() ) { ); if ( empty( $this->datasource ) ) { - $message = esc_html__( 'You must supply a datasource for the autocomplete field', 'fieldmanager' ); + $message = esc_html__( 'You must supply a datasource for the autocomplete field.', 'fieldmanager' ); if ( Fieldmanager_Field::$debug ) { throw new FM_Developer_Exception( $message ); } else { - wp_die( esc_html( $message ), esc_html__( 'No Datasource', 'fieldmanager' ) ); + wp_die( esc_html( $message ), esc_html__( 'No datasource.', 'fieldmanager' ) ); } } $this->datasource->allow_optgroups = false; diff --git a/php/class-fieldmanager-checkbox.php b/php/class-fieldmanager-checkbox.php index 682ec6e168..e9da00eb7c 100644 --- a/php/class-fieldmanager-checkbox.php +++ b/php/class-fieldmanager-checkbox.php @@ -79,7 +79,7 @@ public function presave( $value = null, $current_value = array() ) { } elseif ( empty( $value ) ) { return $this->unchecked_value; } else { - $this->_unauthorized_access( __( 'Saved a checkbox with a value that was not one of the options', 'fieldmanager' ) ); + $this->_unauthorized_access( __( 'Saved a checkbox with a value that was not one of the options.', 'fieldmanager' ) ); } } } diff --git a/php/class-fieldmanager-field.php b/php/class-fieldmanager-field.php index 6c8bf55dcc..6f4116ed47 100644 --- a/php/class-fieldmanager-field.php +++ b/php/class-fieldmanager-field.php @@ -402,8 +402,9 @@ public function __construct( $label = '', $options = array() ) { // A post can only have one parent, so if this saves to post_parent and // it's repeatable, we're doing it wrong. if ( $this->datasource && ! empty( $this->datasource->save_to_post_parent ) && $this->is_repeatable() ) { - _doing_it_wrong( 'Fieldmanager_Datasource_Post::$save_to_post_parent', esc_html__( 'A post can only have one parent, therefore you cannot store to post_parent in repeatable fields.', 'fieldmanager' ), '1.0.0' ); - $this->datasource->save_to_post_parent = false; + /* translators: %s: `post_parent` */ + _doing_it_wrong( 'Fieldmanager_Datasource_Post::$save_to_post_parent', sprintf( esc_html__( 'A post can only have one parent, therefore you cannot store to %s in repeatable fields.', 'fieldmanager' ), '`post_parent`' ), '1.0.0' ); + $this->datasource->save_to_post_parent = false; $this->datasource->only_save_to_post_parent = false; } @@ -439,11 +440,11 @@ public function set_options( $label, $options ) { $this->$key = $value; } elseif ( self::$debug ) { $message = sprintf( - /* translators: 1: option key, 2: field class, 3: field name */ - __( 'You attempted to set a property "%1$s" that is nonexistant or invalid for an instance of "%2$s" named "%3$s".', 'fieldmanager' ), - $key, - get_class( $this ), - ! empty( $options['name'] ) ? $options['name'] : 'NULL' + /* translators: 1: property name, 2: class name, 3: field name */ + __( 'You attempted to set a property %1$s that is nonexistant or invalid for an instance of %2$s named %3$s.', 'fieldmanager' ), + "`{$key}`", + '`' . get_class( $this ) . '`', + ! empty( $options['name'] ) ? "`{$options['name']}`" : '`NULL`' ); throw new FM_Developer_Exception( esc_html( $message ) ); } @@ -456,7 +457,12 @@ public function set_options( $label, $options ) { // Cannot use serialize_data => false with index => true. if ( ! $this->serialize_data && $this->index ) { - throw new FM_Developer_Exception( esc_html__( 'You cannot use `"serialize_data" => false` with `"index" => true`', 'fieldmanager' ) ); + throw new FM_Developer_Exception( esc_html( sprintf( + /* translators: 1: `'serialize_data' => false`, 2: `'index' => true` */ + __( 'You cannot use %1$s with %2$s.', 'fieldmanager' ), + "`'serialize_data' => false`", + "`'index' => true`" + ) ) ); } } @@ -892,8 +898,13 @@ public function presave_all( $values, $current_values ) { return; } - /* translators: %d: field limit */ - $this->_unauthorized_access( sprintf( __( '$values should be an array because $limit is %d', 'fieldmanager' ), $this->limit ) ); + $this->_unauthorized_access( sprintf( + /* translators: 1: `$values`, 2: `$limit`, 3: `limit` property value */ + __( '%1$s should be an array because %2$s is %3$d.', 'fieldmanager' ), + '`$values`', + '`$limit`', + $this->limit + ) ); } if ( empty( $values ) ) { @@ -908,8 +919,8 @@ public function presave_all( $values, $current_values ) { // If $this->limit is not 0 or 1, and $values has more than $limit, that could also be an attack... if ( $this->limit > 1 && count( $values ) > $this->limit ) { $this->_unauthorized_access( - /* translators: 1: value count, 2: field limit */ - sprintf( __( 'submitted %1$d values against a limit of %2$d', 'fieldmanager' ), count( $values ), $this->limit ) + /* translators: 1: count of submitted values, 2: `limit` property value */ + sprintf( __( 'Submitted %1$d values against a limit of %2$d.', 'fieldmanager' ), count( $values ), $this->limit ) ); } @@ -1051,7 +1062,8 @@ public function presave( $value, $current_value = array() ) { // this point, but those elements must override this function. Let's // make sure we're dealing with one value here. if ( is_array( $value ) ) { - $this->_unauthorized_access( __( 'presave() in the base class should not get arrays, but did.', 'fieldmanager' ) ); + /* translators: %s: `presave()` */ + $this->_unauthorized_access( sprintf( __( '%s in the base class should not get arrays, but did.', 'fieldmanager' ), '`presave()`' ) ); } foreach ( $this->validate as $func ) { if ( ! call_user_func( $func, $value ) ) { @@ -1240,7 +1252,7 @@ public function add_term_form( $title, $taxonomies, $show_on_add = true, $show_o public function add_term_meta_box( $title, $taxonomies, $show_on_add = true, $show_on_edit = true, $parent = '' ) { // Bail if term meta table is not installed. if ( get_option( 'db_version' ) < 34370 ) { - _doing_it_wrong( __METHOD__, esc_html__( 'This method requires WordPress 4.4 or above', 'fieldmanager' ), 'Fieldmanager-1.0.0-beta.3' ); + _doing_it_wrong( __METHOD__, esc_html__( 'This method requires WordPress 4.4 or above.', 'fieldmanager' ), 'Fieldmanager-1.0.0-beta.3' ); return false; } @@ -1333,7 +1345,7 @@ public function activate_submenu_page() { */ private function require_base() { if ( ! empty( $this->parent ) ) { - throw new FM_Developer_Exception( esc_html__( 'You cannot use this method on a subgroup', 'fieldmanager' ) ); + throw new FM_Developer_Exception( esc_html__( 'You cannot use this method on a subgroup.', 'fieldmanager' ) ); } } diff --git a/php/class-fieldmanager-group.php b/php/class-fieldmanager-group.php index 4fa73830a2..363d845e7e 100644 --- a/php/class-fieldmanager-group.php +++ b/php/class-fieldmanager-group.php @@ -149,7 +149,11 @@ public function __construct( $label = '', $options = array() ) { // Repeatable groups cannot used unserialized data. $is_repeatable = ( 1 != $this->limit ); if ( ! $this->serialize_data && $is_repeatable ) { - throw new FM_Developer_Exception( esc_html__( 'You cannot use `"serialize_data" => false` with repeating groups', 'fieldmanager' ) ); + throw new FM_Developer_Exception( esc_html( sprintf( + /* translators: %s: `'serialize_data' => false` */ + __( 'You cannot use %s with repeating groups.', 'fieldmanager' ), + "`'serialize_data' => false`" + ) ) ); } // If this is collapsed, collapsibility is implied. @@ -161,21 +165,28 @@ public function __construct( $label = '', $options = array() ) { foreach ( $this->children as $name => $element ) { // if the array key is not an int, and the name attr is set, and they don't match, we got a problem. if ( $element->name && ! is_int( $name ) && $element->name != $name ) { - throw new FM_Developer_Exception( esc_html__( 'Group child name conflict: ', 'fieldmanager' ) . $name . ' / ' . $element->name ); + /* translators: 1: group child name, 2: group child name */ + throw new FM_Developer_Exception( sprintf( esc_html__( 'Group child name conflict: %1$s / %2$s.', 'fieldmanager' ), "`{$name}`", "`{$element->name}`" ) ); } elseif ( ! $element->name ) { $element->name = $name; } // Catch errors when using serialize_data => false and index => true. if ( ! $this->serialize_data && $element->index ) { - throw new FM_Developer_Exception( esc_html__( 'You cannot use `serialize_data => false` with `index => true`', 'fieldmanager' ) ); + throw new FM_Developer_Exception( esc_html( sprintf( + /* translators: 1: `'serialize_data' => false`, 2: `'index' => true` */ + __( 'You cannot use %1$s with %2$s.', 'fieldmanager' ), + "`'serialize_data' => false`", + "`'index' => true`" + ) ) ); } // A post can only have one parent, so if this saves to post_parent and // it's repeatable, we're doing it wrong. if ( $element->datasource && ! empty( $element->datasource->save_to_post_parent ) && $this->is_repeatable() ) { - _doing_it_wrong( 'Fieldmanager_Datasource_Post::$save_to_post_parent', esc_html__( 'A post can only have one parent, therefore you cannot store to post_parent in repeatable fields.', 'fieldmanager' ), '1.0.0' ); - $element->datasource->save_to_post_parent = false; + /* translators: %s: `post_parent` */ + _doing_it_wrong( 'Fieldmanager_Datasource_Post::$save_to_post_parent', sprintf( esc_html__( 'A post can only have one parent, therefore you cannot store to %s in repeatable fields.', 'fieldmanager' ), '`post_parent`' ), '1.0.0' ); + $element->datasource->save_to_post_parent = false; $element->datasource->only_save_to_post_parent = false; } @@ -190,7 +201,11 @@ public function __construct( $label = '', $options = array() ) { // Check for invalid usage of repeatables and serialize_data. if ( $is_repeatable && $this->has_unserialized_descendants ) { - throw new FM_Developer_Exception( esc_html__( 'You cannot use `serialize_data => false` with repeating groups', 'fieldmanager' ) ); + throw new FM_Developer_Exception( esc_html( sprintf( + /* translators: %s: `'serialize_data' => false` */ + __( 'You cannot use %s with repeating groups.', 'fieldmanager' ), + "`'serialize_data' => false`" + ) ) ); } // Add the tab JS and CSS if it is needed. @@ -330,7 +345,12 @@ public function add_child( Fieldmanager_Field $child ) { // Catch errors when using serialize_data => false and index-> true. if ( ! $this->serialize_data && $child->index ) { - throw new FM_Developer_Exception( esc_html__( 'You cannot use `serialize_data => false` with `index => true`', 'fieldmanager' ) ); + throw new FM_Developer_Exception( esc_html( sprintf( + /* translators: 1: `'serialize_data' => false`, 2: `'index' => true` */ + __( 'You cannot use %1$s with %2$s.', 'fieldmanager' ), + "`'serialize_data' => false`", + "`'index' => true`" + ) ) ); } } @@ -348,8 +368,8 @@ public function presave( $values, $current_values = array() ) { if ( ! isset( $this->children[ $key ] ) ) { // If we're here, it means that the input, generally $_POST, contains a value that doesn't belong, // and thus one which we cannot sanitize and must not save. This might be an attack. - /* translators: 1: key attempting to be saved */ - $this->_unauthorized_access( sprintf( __( 'Found "%1$s" in data but not in children', 'fieldmanager' ), $key ) ); + /* translators: %s: key attempting to be saved */ + $this->_unauthorized_access( sprintf( __( 'Found %s in data but not in children.', 'fieldmanager' ), "`{$key}`" ) ); } } } diff --git a/php/class-fieldmanager-media.php b/php/class-fieldmanager-media.php index 31ef5d33de..9faf192603 100644 --- a/php/class-fieldmanager-media.php +++ b/php/class-fieldmanager-media.php @@ -102,9 +102,9 @@ public function __construct( $label = '', $options = array() ) { $this->button_label = __( 'Attach a File', 'fieldmanager' ); $this->modal_button_label = __( 'Select Attachment', 'fieldmanager' ); $this->modal_title = __( 'Choose an Attachment', 'fieldmanager' ); - $this->selected_image_label = __( 'Uploaded image:', 'fieldmanager' ); - $this->selected_file_label = __( 'Uploaded file:', 'fieldmanager' ); - $this->remove_media_label = __( 'remove', 'fieldmanager' ); + $this->selected_image_label = __( 'Uploaded Image:', 'fieldmanager' ); + $this->selected_file_label = __( 'Uploaded File:', 'fieldmanager' ); + $this->remove_media_label = __( 'Remove', 'fieldmanager' ); if ( ! self::$has_registered_media ) { fm_add_script( 'fm_media', 'js/media/fieldmanager-media.js', array( 'jquery' ), FM_VERSION, true ); diff --git a/php/class-fieldmanager-options.php b/php/class-fieldmanager-options.php index a901952514..411273d97c 100644 --- a/php/class-fieldmanager-options.php +++ b/php/class-fieldmanager-options.php @@ -249,7 +249,7 @@ public function presave( $value, $current_value = array() ) { $this->_failed_validation( sprintf( /* translators: 1: Invalid value, 2: field label */ - __( 'Input "%1$s" is not valid for field "%2$s" ', 'fieldmanager' ), + __( 'Input "%1$s" is not valid for field "%2$s".', 'fieldmanager' ), (string) $value, $this->label ) diff --git a/php/context/class-fieldmanager-context-page.php b/php/context/class-fieldmanager-context-page.php index 2f0c2929ba..76aaf5fee7 100644 --- a/php/context/class-fieldmanager-context-page.php +++ b/php/context/class-fieldmanager-context-page.php @@ -55,7 +55,7 @@ public function save_page_form() { isset( $_POST[ 'fieldmanager-' . $this->fm->name . '-nonce' ] ) // WPCS: input var okay. && ! wp_verify_nonce( $_POST[ 'fieldmanager-' . $this->fm->name . '-nonce' ], 'fieldmanager-save-' . $this->fm->name ) // WPCS: input var okay. sanitization ok. ) { - $this->fm->_unauthorized_access( __( 'Nonce validation failed', 'fieldmanager' ) ); + $this->fm->_unauthorized_access( __( 'Nonce validation failed.', 'fieldmanager' ) ); } $this->fm->data_id = $user_id; $value = isset( $_POST[ $this->fm->name ] ) ? $_POST[ $this->fm->name ] : ''; // WPCS: input var okay. sanitization ok. diff --git a/php/context/class-fieldmanager-context-post.php b/php/context/class-fieldmanager-context-post.php index 1b4a1db066..920eb6cb05 100644 --- a/php/context/class-fieldmanager-context-post.php +++ b/php/context/class-fieldmanager-context-post.php @@ -212,7 +212,7 @@ public function save_fields_for_post( $post_id ) { // Make sure the current user is authorized to save this post. if ( isset( $_POST['post_type'] ) && 'post' == $_POST['post_type'] ) { // WPCS: input var okay. CSRF ok. if ( ! current_user_can( 'edit_post', $post_id ) ) { - $this->fm->_unauthorized_access( __( 'User cannot edit this post', 'fieldmanager' ) ); + $this->fm->_unauthorized_access( __( 'Current user cannot edit this post.', 'fieldmanager' ) ); return; } } diff --git a/php/context/class-fieldmanager-context-quickedit.php b/php/context/class-fieldmanager-context-quickedit.php index bdaaa0c044..e0887a4afc 100644 --- a/php/context/class-fieldmanager-context-quickedit.php +++ b/php/context/class-fieldmanager-context-quickedit.php @@ -221,7 +221,7 @@ public function save_fields_for_quickedit( $post_id ) { // Make sure the current user can save this post. if ( 'post' == $_POST['post_type'] ) { // WPCS: input var okay. CSRF okay. if ( ! current_user_can( 'edit_post', $post_id ) ) { - $this->fm->_unauthorized_access( __( 'User cannot edit this post', 'fieldmanager' ) ); + $this->fm->_unauthorized_access( __( 'Current user cannot edit this post.', 'fieldmanager' ) ); return; } } diff --git a/php/context/class-fieldmanager-context-storable.php b/php/context/class-fieldmanager-context-storable.php index f1133a549b..319998054a 100644 --- a/php/context/class-fieldmanager-context-storable.php +++ b/php/context/class-fieldmanager-context-storable.php @@ -78,7 +78,7 @@ protected function save_field( $field, $data ) { if ( isset( $this->save_keys[ $field->get_element_key() ] ) ) { /* translators: %s: element key for the field */ - throw new FM_Developer_Exception( sprintf( esc_html__( 'You have two fields in this group saving to the same key: %s', 'fieldmanager' ), $field->get_element_key() ) ); + throw new FM_Developer_Exception( sprintf( esc_html__( 'You have two fields in this group saving to the same key: %s.', 'fieldmanager' ), "`{$field->get_element_key()}`" ) ); } else { $this->save_keys[ $field->get_element_key() ] = true; } diff --git a/php/context/class-fieldmanager-context-submenu.php b/php/context/class-fieldmanager-context-submenu.php index 6b34608449..75c0d9762c 100644 --- a/php/context/class-fieldmanager-context-submenu.php +++ b/php/context/class-fieldmanager-context-submenu.php @@ -86,7 +86,7 @@ public function __construct( $parent_slug, $page_title, $menu_title = null, $cap $this->parent_slug = $parent_slug; $this->page_title = $page_title; $this->capability = $capability; - $this->updated_message = __( 'Options updated', 'fieldmanager' ); + $this->updated_message = __( 'Options updated.', 'fieldmanager' ); $this->uniqid = $this->fm->get_element_id() . '_form'; if ( ! $already_registered ) { add_action( 'admin_menu', array( $this, 'register_submenu_page' ) ); @@ -151,7 +151,7 @@ public function handle_submenu_save() { } if ( ! current_user_can( $this->capability ) ) { - $this->fm->_unauthorized_access( __( 'Current user cannot edit this page', 'fieldmanager' ) ); + $this->fm->_unauthorized_access( __( 'Current user cannot edit this page.', 'fieldmanager' ) ); return; } diff --git a/php/context/class-fieldmanager-context-term.php b/php/context/class-fieldmanager-context-term.php index cb8c510fbd..165077dfb1 100644 --- a/php/context/class-fieldmanager-context-term.php +++ b/php/context/class-fieldmanager-context-term.php @@ -127,7 +127,13 @@ public function __construct( $args, $taxonomies = array(), $show_on_add = true, ) ); if ( ! isset( $args['title'], $args['taxonomies'] ) ) { - throw new FM_Developer_Exception( esc_html__( '"title" and "taxonomies" are required values for Fieldmanager_Context_Term', 'fieldmanager' ) ); + throw new FM_Developer_Exception( esc_html( sprintf( + /* translators: 1: `title`, 2: `taxonomies`, 3: `Fieldmanager_Context_Term` */ + __( '%1$s and %2$s are required values for %3$s.', 'fieldmanager' ), + '`title`', + '`taxonomies`', + '`Fieldmanager_Context_Term`' + ) ) ); } $this->title = $args['title']; @@ -138,7 +144,13 @@ public function __construct( $args, $taxonomies = array(), $show_on_add = true, $this->use_fm_meta = $args['use_fm_meta']; $this->fm = $args['field']; } elseif ( empty( $taxonomies ) ) { - throw new FM_Developer_Exception( esc_html__( '"title" and "taxonomies" are required values for Fieldmanager_Context_Term', 'fieldmanager' ) ); + throw new FM_Developer_Exception( esc_html( sprintf( + /* translators: 1: `title`, 2: `taxonomies`, 3: `Fieldmanager_Context_Term` */ + __( '%1$s and %2$s are required values for %3$s.', 'fieldmanager' ), + '`title`', + '`taxonomies`', + '`Fieldmanager_Context_Term`' + ) ) ); } else { /** * Instantiating Fieldmanager_Context_Term using individual @@ -239,7 +251,7 @@ public function term_fields( $html_template, $taxonomy, $term = null ) { // Make sure the user hasn't specified a field name we can't use. if ( in_array( $this->fm->name, $this->reserved_fields ) ) { /* translators: %s: field name */ - $this->fm->_invalid_definition( sprintf( __( 'The field name "%s" is reserved for WordPress on the term form.', 'fieldmanager' ), $this->fm->name ) ); + $this->fm->_invalid_definition( sprintf( __( 'The field name %s is reserved for WordPress on the term form.', 'fieldmanager' ), "`{$this->fm->name}`" ) ); } // Set the data type and ID. @@ -295,7 +307,7 @@ public function save_term_fields( $term_id, $tt_id, $taxonomy ) { // Make sure the current user can save this post. $tax_obj = get_taxonomy( $taxonomy ); if ( ! current_user_can( $tax_obj->cap->manage_terms ) ) { - $this->fm->_unauthorized_access( __( 'User cannot edit this term', 'fieldmanager' ) ); + $this->fm->_unauthorized_access( __( 'Current user cannot edit this term.', 'fieldmanager' ) ); return; } diff --git a/php/context/class-fieldmanager-context-user.php b/php/context/class-fieldmanager-context-user.php index eb78db7f0d..db78b82e8d 100644 --- a/php/context/class-fieldmanager-context-user.php +++ b/php/context/class-fieldmanager-context-user.php @@ -78,7 +78,7 @@ public function save_user_form( $user_id ) { } if ( ! current_user_can( 'edit_user', $user_id ) ) { - $this->fm->_unauthorized_access( __( 'Current user cannot edit this user', 'fieldmanager' ) ); + $this->fm->_unauthorized_access( __( 'Current user cannot edit this user.', 'fieldmanager' ) ); return; } diff --git a/php/context/class-fieldmanager-context.php b/php/context/class-fieldmanager-context.php index 0a06f91bdb..d7a73a5da8 100644 --- a/php/context/class-fieldmanager-context.php +++ b/php/context/class-fieldmanager-context.php @@ -46,7 +46,7 @@ protected function is_valid_nonce() { } if ( ! wp_verify_nonce( $_POST[ 'fieldmanager-' . $this->fm->name . '-nonce' ], 'fieldmanager-save-' . $this->fm->name ) ) { // WPCS: input var okay. Sanitization okay. - $this->fm->_unauthorized_access( __( 'Nonce validation failed', 'fieldmanager' ) ); + $this->fm->_unauthorized_access( __( 'Nonce validation failed.', 'fieldmanager' ) ); } return true; diff --git a/php/datasource/class-fieldmanager-datasource-post.php b/php/datasource/class-fieldmanager-datasource-post.php index 0a343cbe19..f0a34745c7 100644 --- a/php/datasource/class-fieldmanager-datasource-post.php +++ b/php/datasource/class-fieldmanager-datasource-post.php @@ -246,8 +246,8 @@ public function presave( Fieldmanager_Field $field, $value, $current_value ) { if ( ! defined( 'DOING_CRON' ) || ! DOING_CRON ) { $post_type_obj = get_post_type_object( get_post_type( $value ) ); if ( empty( $post_type_obj->cap->edit_post ) || ! current_user_can( $post_type_obj->cap->edit_post, $value ) ) { - /* translators: 1: post type object name, 2: post ID value being saved, 3: field name */ - wp_die( esc_html( sprintf( __( 'Tried to alter %1$s %2$d through field "%3$s", which user is not permitted to edit.', 'fieldmanager' ), $post_type_obj->name, $value, $field->name ) ) ); + /* translators: 1: post type name, 2: post ID, 3: field name */ + wp_die( esc_html( sprintf( __( 'Tried to alter %1$s %2$d through field %3$s, which current user cannot edit.', 'fieldmanager' ), "`{$post_type_obj->name}`", $value, "`{$field->name}`" ) ) ); } } $this->presave_status_transition( $field, $value ); diff --git a/php/datasource/class-fieldmanager-datasource-user.php b/php/datasource/class-fieldmanager-datasource-user.php index 9eabf4ce4f..ca33a68e8d 100644 --- a/php/datasource/class-fieldmanager-datasource-user.php +++ b/php/datasource/class-fieldmanager-datasource-user.php @@ -94,30 +94,44 @@ public function __construct( $options = array() ) { // Validate improper usage of store property. if ( ! in_array( $this->store_property, $this->allowed_store_properties ) ) { - throw new FM_Developer_Exception( - sprintf( - /* translators: 1: stored property, 2: allowed store properties */ - __( 'Store property %1$s is invalid. Must be one of %2$s.', 'fieldmanager' ), - $this->store_property, - implode( ', ', $this->allowed_store_properties ) - ) - ); + throw new FM_Developer_Exception( sprintf( + /* translators: 1: invalid property name, 2: list of valid property names */ + __( 'Store property %1$s is invalid. Must be one of %2$s.', 'fieldmanager' ), + "`{$this->store_property}`", + /* translators: used between list items, there is a space after the comma */ + implode( __( ', ', 'fieldmanager' ), array_map( + function ( $property ) { + return "`{$property}`"; + }, + $this->allowed_store_properties + ) ) + ) ); } if ( ! empty( $this->reciprocal ) && 'ID' != $this->store_property ) { - throw new FM_Developer_Exception( __( 'You cannot use reciprocal relationships with FM_Datasource_User if store_property is not set to ID.', 'fieldmanager' ) ); + throw new FM_Developer_Exception( sprintf( + /* translators: 1: `Fieldmanager_Datasource_User`, 2: `store_property`, 3: `ID` */ + __( 'You cannot use reciprocal relationships with %1$s if %2$s is not set to %3$s.', 'fieldmanager' ), + '`Fieldmanager_Datasource_User`', + '`store_property`', + '`ID`' + ) ); } // Validate improper usage of display property. if ( ! in_array( $this->display_property, $this->allowed_display_properties ) ) { - throw new FM_Developer_Exception( - sprintf( - /* translators: 1: display property, 2: allowed display properties */ - __( 'Display property %1$s is invalid. Must be one of %2$s.', 'fieldmanager' ), - $this->display_property, - implode( ', ', $this->allowed_display_properties ) - ) - ); + throw new FM_Developer_Exception( sprintf( + /* translators: 1: invalid property name, 2: list of valid property names */ + __( 'Display property %1$s is invalid. Must be one of %2$s.', 'fieldmanager' ), + "`{$this->display_property}`", + /* translators: used between list items, there is a space after the comma */ + implode( __( ', ', 'fieldmanager' ), array_map( + function ( $property ) { + return "`{$property}`"; + }, + $this->allowed_display_properties + ) ) + ) ); } } diff --git a/php/datasource/class-fieldmanager-datasource.php b/php/datasource/class-fieldmanager-datasource.php index 8bab722003..14128ba48b 100644 --- a/php/datasource/class-fieldmanager-datasource.php +++ b/php/datasource/class-fieldmanager-datasource.php @@ -83,14 +83,14 @@ public function __construct( $options = array() ) { } } catch ( Exception $e ) { $message = sprintf( - /* translators: 1: property name, 2: current class name, 3: option name */ - __( 'You attempted to set a property "%1$s" that is nonexistant or invalid for an instance of "%2$s" named "%3$s".', 'fieldmanager' ), - $k, - get_class(), - ! empty( $options['name'] ) ? $options['name'] : 'NULL' + /* translators: 1: property name, 2: class name, 3: field name */ + __( 'You attempted to set a property %1$s that is nonexistant or invalid for an instance of %2$s named %3$s.', 'fieldmanager' ), + "`{$k}`", + '`' . get_class() . '`', + ! empty( $options['name'] ) ? "`{$options['name']}`" : '`NULL`' ); if ( ! Fieldmanager_Field::$debug ) { - wp_die( esc_html( $message ), esc_html__( 'Nonexistant or invalid option', 'fieldmanager' ) ); + wp_die( esc_html( $message ), esc_html__( 'Nonexistant or invalid option.', 'fieldmanager' ) ); } else { throw new FM_Developer_Exception( esc_html( $message ) ); } @@ -98,11 +98,15 @@ public function __construct( $options = array() ) { } if ( get_class( $this ) === __CLASS__ && empty( $options ) ) { - $message = __( 'Invalid options for Datasource; must use the options parameter to supply an array.', 'fieldmanager' ); + $message = esc_html( sprintf( + /* translators: %s: `$options` */ + __( 'Invalid datasource options; must use the %s parameter to supply an array.', 'fieldmanager' ), + '`$options`' + ) ); if ( Fieldmanager_Field::$debug ) { throw new FM_Developer_Exception( $message ); } else { - wp_die( esc_html( $message ), esc_html__( 'Invalid Datasource Options', 'fieldmanager' ) ); + wp_die( esc_html( $message ), esc_html__( 'Invalid datasource options.', 'fieldmanager' ) ); } } diff --git a/php/util/class-fieldmanager-util-validation.php b/php/util/class-fieldmanager-util-validation.php index 1ec895159f..c49e2aa425 100644 --- a/php/util/class-fieldmanager-util-validation.php +++ b/php/util/class-fieldmanager-util-validation.php @@ -146,7 +146,8 @@ public function add_field( &$fm ) { if ( ! is_array( $fm->validation_rules ) ) { // If a string, the only acceptable value is "required". if ( ! is_string( $fm->validation_rules ) || 'required' !== $fm->validation_rules ) { - $fm->_invalid_definition( sprintf( __( 'The validation rule is not valid.', 'fieldmanager' ), $fm->validation_rules ) ); + /* translators: %s: validation rule name */ + $fm->_invalid_definition( sprintf( __( 'The validation rule %s does not exist.', 'fieldmanager' ), "`{$fm->validation_rules}`" ) ); } // Convert the value to an array since we standardize the Javascript output on this format. @@ -163,8 +164,8 @@ public function add_field( &$fm ) { foreach ( $fm->validation_rules as $validation_key => $validation_rule ) { if ( ! in_array( $validation_key, $this->valid_rules ) ) { // This is not a rule available in jQuery validation. - /* translators: %s: validation key */ - $fm->_invalid_definition( sprintf( __( 'The validation rule "%s" does not exist.', 'fieldmanager' ), $validation_key ) ); + /* translators: %s: validation rule name */ + $fm->_invalid_definition( sprintf( __( 'The validation rule %s does not exist.', 'fieldmanager' ), "`{$validation_key}`" ) ); } else { // This rule is valid so check for any messages. if ( isset( $fm->validation_messages[ $validation_key ] ) ) { diff --git a/tests/php/test_fieldmanager_field.php b/tests/php/test_fieldmanager_field.php index 6b241d00c0..9422299e99 100644 --- a/tests/php/test_fieldmanager_field.php +++ b/tests/php/test_fieldmanager_field.php @@ -831,7 +831,7 @@ public function test_extra_elements_and_minimum_counts() { /** * @expectedException FM_Exception - * @expectedExceptionMessage submitted 5 values against a limit of 3 + * @expectedExceptionMessage Submitted 5 values against a limit of 3. */ public function test_limit_exceeded_exceptions() { $test_data_too_many = array(