From 61ca999c9aa2a9d8741d6563859713d57f6045a7 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 23 Sep 2020 19:42:38 +0900 Subject: [PATCH 01/66] feat: add filter hook for excluding files from parsing --- lib/runner.php | 84 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 5 deletions(-) diff --git a/lib/runner.php b/lib/runner.php index cacbec2..ef5363d 100644 --- a/lib/runner.php +++ b/lib/runner.php @@ -14,11 +14,17 @@ * * @return array|\WP_Error */ -function get_wp_files( $directory ) { - $iterableFiles = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator( $directory ) - ); - $files = array(); +function get_wp_files( $root ) { + $dirIterator = new \RecursiveDirectoryIterator( $root ); + $filterIterator = filter_wp_directories( $root, $dirIterator ); + + if ( $filterIterator instanceof \RecursiveCallbackFilterIterator ) { + $iterableFiles = new \RecursiveIteratorIterator( $filterIterator ); + } else { + $iterableFiles = new \RecursiveIteratorIterator( $dirIterator ); + } + + $files = array(); try { foreach ( $iterableFiles as $file ) { @@ -26,6 +32,13 @@ function get_wp_files( $directory ) { continue; } + /** + * Whether to exclude a file for parsing. + */ + if ( ! apply_filters( 'wp_parser_pre_get_wp_file', true, $file->getPathname(), $root ) ) { + continue; + } + $files[] = $file->getPathname(); } } catch ( \UnexpectedValueException $exc ) { @@ -38,6 +51,67 @@ function get_wp_files( $directory ) { return $files; } +/** + * Fiter the directories to parse. + * + * @param string $root Root dir. + * @param object $dirIterator RecursiveDirectoryIterator. + * @return object|false RecursiveCallbackFilterIterator or false. + */ +function filter_wp_directories( $root, $dirIterator ) { + $root = trailingslashit( $root ); + + /** + * Filter directories found in the root directory. + * + * For example: 'vendor', 'tests', 'specific/directory'. + * + * @param unknown $exclude Array with directories to skip parsing. Default empty array(). + * @param unknown $root Root directory to parse. + */ + $exclude = apply_filters( 'wp_parser_exclude_directories', array(), $root ); + + /** + * Whether to exlude directories if found in a subdirectory. + * + * @param unknown $strict. Exclude subdirectories. Default false. + * @param unknown $root Root directory to parse. + */ + $strict = apply_filters( 'wp_parser_exclude_directories_strict', false, $root ); + + if ( ! $exclude ) { + return false; + } + + $filter = new \RecursiveCallbackFilterIterator( $dirIterator, function ( $current ) use ( $root, $exclude, $strict ) { + if ( $current->isFile() && ( 'php' !== $current->getExtension() ) ) { + return false; + } + + if ( ! $current->isDir() ) { + return true; + } + + // Exclude directories strict. + $dir_name = $current->getFilename(); + if ( $strict && in_array( $dir_name, $exclude ) ) { + return false; + } + + // Exclude directories in the root directory. + $current_path = $current->getPathname(); + foreach ( $exclude as $dir ) { + if ( ( $root . untrailingslashit( $dir ) ) === $current_path ) { + return false; + } + } + + return true; + } ); + + return $filter; +} + /** * @param array $files * @param string $root From 8efd3dda00e5b93105df5c7f92cff691fcb03286 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Thu, 19 Aug 2021 18:47:14 +0900 Subject: [PATCH 02/66] feat: add wp-parser-source-type taxonomy with default terms. Parse docparser-meta.json from root dir of import folders --- lib/api-functions.php | 59 ++ lib/class-command.php | 322 ++++--- lib/class-importer.php | 1723 ++++++++++++++++++----------------- lib/class-plugin.php | 533 ++++++----- lib/class-relationships.php | 8 +- lib/template-functions.php | 11 + plugin.php | 28 +- 7 files changed, 1462 insertions(+), 1222 deletions(-) create mode 100644 lib/api-functions.php create mode 100644 lib/template-functions.php diff --git a/lib/api-functions.php b/lib/api-functions.php new file mode 100644 index 0000000..34d0c6e --- /dev/null +++ b/lib/api-functions.php @@ -0,0 +1,59 @@ + __('Classes', 'wp-parser'), + 'wp-parser-function' => __('Functions', 'wp-parser'), + 'wp-parser-hook' => __('Hooks', 'wp-parser'), + 'wp-parser-method' => __('Methods', 'wp-parser'), + ]; + + if ('labels' !== $labels) { + return array_keys($post_types); + } + + return $post_types; +} + +/** + * Returns source type "type" and "name" terms for the current post + * + * @author Evan D Shaw + * @param int|null $post_id + * @return array|null + */ +function avcpdp_get_post_source_type_terms($post_id = null) { + if ($post_id === null) { + $post_id = get_the_ID(); + } + + if (empty($post_id)) { + return null; + } + + $terms = wp_get_post_terms($post_id, WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); + if (empty($terms)) { + return null; + } + + $res = []; + foreach ($terms as $term) { + if ($term->parent === 0) { + $res['type'] = $term; + } else { + $res['name'] = $term; + } + } + + if (empty($res['type']) || empty($res['name'])) { + return null; + } + + return $res; +} diff --git a/lib/class-command.php b/lib/class-command.php index 4fdad91..b6cd31a 100644 --- a/lib/class-command.php +++ b/lib/class-command.php @@ -8,136 +8,194 @@ /** * Converts PHPDoc markup into a template ready for import to a WordPress blog. */ -class Command extends WP_CLI_Command { - - /** - * Generate a JSON file containing the PHPDoc markup, and save to filesystem. - * - * @synopsis [] - * - * @param array $args - */ - public function export( $args ) { - $directory = realpath( $args[0] ); - $output_file = empty( $args[1] ) ? 'phpdoc.json' : $args[1]; - $json = $this->_get_phpdoc_data( $directory ); - $result = file_put_contents( $output_file, $json ); - WP_CLI::line(); - - if ( false === $result ) { - WP_CLI::error( sprintf( 'Problem writing %1$s bytes of data to %2$s', strlen( $json ), $output_file ) ); - exit; - } - - WP_CLI::success( sprintf( 'Data exported to %1$s', $output_file ) ); - WP_CLI::line(); - } - - /** - * Read a JSON file containing the PHPDoc markup, convert it into WordPress posts, and insert into DB. - * - * @synopsis [--quick] [--import-internal] - * - * @param array $args - * @param array $assoc_args - */ - public function import( $args, $assoc_args ) { - list( $file ) = $args; - WP_CLI::line(); - - // Get the data from the , and check it's valid. - $phpdoc = false; - - if ( is_readable( $file ) ) { - $phpdoc = file_get_contents( $file ); - } - - if ( ! $phpdoc ) { - WP_CLI::error( sprintf( "Can't read %1\$s. Does the file exist?", $file ) ); - exit; - } - - $phpdoc = json_decode( $phpdoc, true ); - if ( is_null( $phpdoc ) ) { - WP_CLI::error( sprintf( "JSON in %1\$s can't be decoded :(", $file ) ); - exit; - } - - // Import data - $this->_do_import( $phpdoc, isset( $assoc_args['quick'] ), isset( $assoc_args['import-internal'] ) ); - } - - /** - * Generate JSON containing the PHPDoc markup, convert it into WordPress posts, and insert into DB. - * - * @subcommand create - * @synopsis [--quick] [--import-internal] [--user] - * - * @param array $args - * @param array $assoc_args - */ - public function create( $args, $assoc_args ) { - list( $directory ) = $args; - $directory = realpath( $directory ); - - if ( empty( $directory ) ) { - WP_CLI::error( sprintf( "Can't read %1\$s. Does the file exist?", $directory ) ); - exit; - } - - WP_CLI::line(); - - // Import data - $this->_do_import( $this->_get_phpdoc_data( $directory, 'array' ), isset( $assoc_args['quick'] ), isset( $assoc_args['import-internal'] ) ); - } - - /** - * Generate the data from the PHPDoc markup. - * - * @param string $path Directory or file to scan for PHPDoc - * @param string $format What format the data is returned in: [json|array]. - * - * @return string|array - */ - protected function _get_phpdoc_data( $path, $format = 'json' ) { - WP_CLI::line( sprintf( 'Extracting PHPDoc from %1$s. This may take a few minutes...', $path ) ); - $is_file = is_file( $path ); - $files = $is_file ? array( $path ) : get_wp_files( $path ); - $path = $is_file ? dirname( $path ) : $path; - - if ( $files instanceof \WP_Error ) { - WP_CLI::error( sprintf( 'Problem with %1$s: %2$s', $path, $files->get_error_message() ) ); - exit; - } - - $output = parse_files( $files, $path ); - - if ( 'json' == $format ) { - return json_encode( $output, JSON_PRETTY_PRINT ); - } - - return $output; - } - - /** - * Import the PHPDoc $data into WordPress posts and taxonomies - * - * @param array $data - * @param bool $skip_sleep If true, the sleep() calls are skipped. - * @param bool $import_ignored If true, functions marked `@ignore` will be imported. - */ - protected function _do_import( array $data, $skip_sleep = false, $import_ignored = false ) { - - if ( ! wp_get_current_user()->exists() ) { - WP_CLI::error( 'Please specify a valid user: --user=' ); - exit; - } - - // Run the importer - $importer = new Importer; - $importer->setLogger( new WP_CLI_Logger() ); - $importer->import( $data, $skip_sleep, $import_ignored ); - - WP_CLI::line(); - } +class Command extends WP_CLI_Command +{ + /** + * Generate a JSON file containing the PHPDoc markup, and save to filesystem. + * + * @synopsis [] + * + * @param array $args + */ + public function export($args) { + $directory = realpath($args[0]); + $output_file = empty($args[1]) ? 'phpdoc.json' : $args[1]; + $json = $this->_get_phpdoc_data($directory); + $result = file_put_contents($output_file, $json); + WP_CLI::line(); + + if (false === $result) { + WP_CLI::error(sprintf('Problem writing %1$s bytes of data to %2$s', strlen($json), $output_file)); + exit; + } + + WP_CLI::success(sprintf('Data exported to %1$s', $output_file)); + WP_CLI::line(); + } + + /** + * Read a JSON file containing the PHPDoc markup, convert it into WordPress posts, and insert into DB. + * + * @synopsis [--quick] [--import-internal] + * + * @param array $args + * @param array $assoc_args + */ + public function import($args, $assoc_args) { + list( $file ) = $args; + WP_CLI::line(); + + // Get the data from the , and check it's valid. + $phpdoc = false; + + if (is_readable($file)) { + $phpdoc = file_get_contents($file); + } + + if (!$phpdoc) { + WP_CLI::error(sprintf("Can't read %1\$s. Does the file exist?", $file)); + exit; + } + + $phpdoc = json_decode($phpdoc, true); + if (is_null($phpdoc)) { + WP_CLI::error(sprintf("JSON in %1\$s can't be decoded :(", $file)); + exit; + } + + // Import data + $this->_do_import($phpdoc, isset($assoc_args['quick']), isset($assoc_args['import-internal'])); + } + + /** + * Generate JSON containing the PHPDoc markup, convert it into WordPress posts, and insert into DB. + * + * @subcommand create + * @synopsis [--quick] [--import-internal] [--user] + * + * @param array $args + * @param array $assoc_args + */ + public function create($args, $assoc_args) { + list( $directory ) = $args; + $directory = realpath($directory); + + if (empty($directory)) { + WP_CLI::error(sprintf("Can't read %1\$s. Does the file exist?", $directory)); + exit; + } + + WP_CLI::line(); + + $parser_meta_filen = 'docparser-meta.json'; + $parser_meta_filep = ''; + if ($directory === '.') { + $parser_meta_filep = "./{$parser_meta_filen}"; + } else { + $parser_meta_filep = "{$directory}/{$parser_meta_filen}"; + } + + WP_CLI::line(sprintf('Getting source meta data from %1$s', $parser_meta_filep)); + + if (!file_exists($parser_meta_filep)) { + WP_CLI::error(sprintf('Missing required file: %1$s', $parser_meta_filep)); + exit; + } + + $metaf = file_get_contents($parser_meta_filep); + if (empty($metaf)) { + WP_CLI::error(sprintf("Can't read %1\$s. Possible permissions error.", $parser_meta_filep)); + exit; + } + + $parser_meta = json_decode($metaf, true); + if ($parser_meta === null) { + WP_CLI::error(sprintf( + '%1$s is malformed. Make sure the file is in proper JSON format.', + $parser_meta_filen + )); + exit; + } + + $types = ['plugin', 'theme', 'composer-packages']; + $validtypesm = 'Valid types are "plugin", "theme", and "composer-package"'; + if (empty($parser_meta['type'])) { + WP_CLI::error('The "type" key is missing.', false); + WP_CLI::log($validtypesm); + exit; + } + + if (!in_array($parser_meta['type'], $types, true)) { + WP_CLI::error($validtypesm); + exit; + } + + if (empty($parser_meta['name'])) { + WP_CLI::error('The "name" key is missing or contains an empty value.'); + exit; + } + + if (!is_string($parser_meta['name'])) { + WP_CLI::error('"name" must be a string.'); + exit; + } + + $data = $this->_get_phpdoc_data($directory, 'array'); + $data = [ + 'meta' => $parser_meta, + 'files' => $data, + ]; + + // Import data + $this->_do_import($data, isset($assoc_args['quick']), isset($assoc_args['import-internal'])); + } + + /** + * Generate the data from the PHPDoc markup. + * + * @param string $path Directory or file to scan for PHPDoc + * @param string $format What format the data is returned in: [json|array]. + * + * @return string|array + */ + protected function _get_phpdoc_data($path, $format = 'json') { + WP_CLI::line(sprintf('Extracting PHPDoc from %1$s. This may take a few minutes...', $path)); + $is_file = is_file($path); + $files = $is_file ? [$path] : get_wp_files($path); + $path = $is_file ? dirname($path) : $path; + + if ($files instanceof \WP_Error) { + WP_CLI::error(sprintf('Problem with %1$s: %2$s', $path, $files->get_error_message())); + exit; + } + + $output = parse_files($files, $path); + + if ('json' == $format) { + return json_encode($output, JSON_PRETTY_PRINT); + } + + return $output; + } + + /** + * Import the PHPDoc $data into WordPress posts and taxonomies + * + * @param array $data + * @param bool $skip_sleep If true, the sleep() calls are skipped. + * @param bool $import_ignored If true, functions marked `@ignore` will be imported. + */ + protected function _do_import(array $data, $skip_sleep = false, $import_ignored = false) { + if (!wp_get_current_user()->exists()) { + WP_CLI::error('Please specify a valid user: --user='); + exit; + } + + // Run the importer + $importer = new Importer($data['meta']); + $importer->setLogger(new WP_CLI_Logger()); + $importer->import($data['files'], $skip_sleep, $import_ignored); + + WP_CLI::line(); + } } diff --git a/lib/class-importer.php b/lib/class-importer.php index bc72372..dc18e51 100644 --- a/lib/class-importer.php +++ b/lib/class-importer.php @@ -9,831 +9,900 @@ /** * Handles creating and updating posts from (functions|classes|files) generated by phpDoc. */ -class Importer implements LoggerAwareInterface { - - use LoggerAwareTrait; - - /** - * Taxonomy name for files - * - * @var string - */ - public $taxonomy_file; - - /** - * Taxonomy name for an item's namespace tags - * - * @var string - */ - public $taxonomy_namespace; - - /** - * Taxonomy name for an item's @since tag - * - * @var string - */ - public $taxonomy_since_version; - - /** - * Taxonomy name for an item's @package/@subpackage tags - * - * @var string - */ - public $taxonomy_package; - - /** - * Post type name for functions - * - * @var string - */ - public $post_type_function; - - /** - * Post type name for classes - * - * @var string - */ - public $post_type_class; - - /** - * Post type name for methods - * - * @var string - */ - public $post_type_method; - - /** - * Post type name for hooks - * - * @var string - */ - public $post_type_hook; - - /** - * Handy store for meta about the current item being imported - * - * @var array - */ - public $file_meta = array(); - - /** - * @var array Human-readable errors - */ - public $errors = array(); - - /** - * Version number of codebase being parsed. - * - * @var string - */ - public $version; - - /** - * @var array Cached items of inserted terms - */ - protected $inserted_terms = array(); - - /** - * Constructor. Sets up post type/taxonomy names. - * - * @param array $args Optional. Associative array; class property => value. - */ - public function __construct( array $args = array() ) { - - $properties = wp_parse_args( - $args, - array( - 'post_type_class' => 'wp-parser-class', - 'post_type_method' => 'wp-parser-method', - 'post_type_function' => 'wp-parser-function', - 'post_type_hook' => 'wp-parser-hook', - 'taxonomy_file' => 'wp-parser-source-file', - 'taxonomy_namespace' => 'wp-parser-namespace', - 'taxonomy_package' => 'wp-parser-package', - 'taxonomy_since_version' => 'wp-parser-since', - ) - ); - - foreach ( $properties as $property_name => $value ) { - $this->{$property_name} = $value; - } - - $this->logger = new NullLogger(); - } - - /** - * Import the PHPDoc $data into WordPress posts and taxonomies - * - * @param array $data - * @param bool $skip_sleep Optional; defaults to false. If true, the sleep() calls are skipped. - * @param bool $import_ignored_functions Optional; defaults to false. If true, functions marked `@ignore` will be imported. - */ - public function import( array $data, $skip_sleep = false, $import_ignored_functions = false ) { - global $wpdb; - - $time_start = microtime(true); - $num_queries = $wpdb->num_queries; - - $this->logger->info( 'Starting import. This will take some time…' ); - - $file_number = 1; - $num_of_files = count( $data ); - - do_action( 'wp_parser_starting_import' ); - - // Defer term counting for performance - wp_suspend_cache_invalidation( true ); - wp_defer_term_counting( true ); - wp_defer_comment_counting( true ); - - // Remove actions for performance - remove_action( 'transition_post_status', '_update_blog_date_on_post_publish', 10 ); - remove_action( 'transition_post_status', '__clear_multi_author_cache', 10 ); - - delete_option( 'wp_parser_imported_wp_version' ); - delete_option( 'wp_parser_root_import_dir' ); - - // Sanity check -- do the required post types exist? - if ( ! post_type_exists( $this->post_type_class ) || ! post_type_exists( $this->post_type_function ) || ! post_type_exists( $this->post_type_hook ) ) { - $this->logger->error( sprintf( 'Missing post type; check that "%1$s", "%2$s", and "%3$s" are registered.', $this->post_type_class, $this->post_type_function, $this->post_type_hook ) ); - exit; - } - - // Sanity check -- do the required taxonomies exist? - if ( ! taxonomy_exists( $this->taxonomy_file ) || ! taxonomy_exists( $this->taxonomy_since_version ) || ! taxonomy_exists( $this->taxonomy_package ) ) { - $this->logger->error( sprintf( 'Missing taxonomy; check that "%1$s" is registered.', $this->taxonomy_file ) ); - exit; - } - - // Specifically import WP version file first to get version number. - $ver_file = array_filter( $data, function( $f ) { return 'wp-includes/version.php' === $f['path']; } ); - if ( $ver_file ) { - $this->version = $this->import_version( reset( $ver_file ) ); - } - - $root = ''; - foreach ( $data as $file ) { - $this->logger->info( sprintf( 'Processing file %1$s of %2$s "%3$s".', number_format_i18n( $file_number ), number_format_i18n( $num_of_files ), $file['path'] ) ); - $file_number ++; - - $this->import_file( $file, $skip_sleep, $import_ignored_functions ); - - if ( empty( $root ) && ( isset( $file['root'] ) && $file['root'] ) ) { - $root = $file['root']; - } - } - - if ( ! empty( $root ) ) { - update_option( 'wp_parser_root_import_dir', $root ); - $this->logger->info( 'Updated option wp_parser_root_import_dir: ' . $root ); - } - - $last_import = time(); - $import_date = date_i18n( get_option('date_format'), $last_import ); - $import_time = date_i18n( get_option('time_format'), $last_import ); - update_option( 'wp_parser_last_import', $last_import ); - $this->logger->info( sprintf( 'Updated option wp_parser_last_import: %1$s at %2$s.', $import_date, $import_time ) ); - - $wp_version = get_option( 'wp_parser_imported_wp_version' ); - if ( $wp_version ) { - $this->logger->info( 'Updated option wp_parser_imported_wp_version: ' . $wp_version ); - } - - /** - * Workaround for a WP core bug where hierarchical taxonomy caches are not being cleared - * - * https://core.trac.wordpress.org/ticket/14485 - * http://wordpress.stackexchange.com/questions/8357/inserting-terms-in-an-hierarchical-taxonomy - */ - delete_option( "{$this->taxonomy_package}_children" ); - delete_option( "{$this->taxonomy_since_version}_children" ); - - /** - * Action at the end of a complete import - */ - do_action( 'wp_parser_ending_import' ); - - // Start counting again - wp_defer_term_counting( false ); - wp_suspend_cache_invalidation( false ); - wp_cache_flush(); - wp_defer_comment_counting( false ); - - $time_end = microtime(true); - $time = $time_end - $time_start; - - $this->logger->info( 'Time: '.$time ); - $this->logger->info( 'Queries: ' . ( $wpdb->num_queries - $num_queries ) ); - if ( empty( $this->errors ) ) { - $this->logger->notice( 'Import complete!' ); - - } else { - $this->logger->info( 'Import complete, but some errors were found:' ); - - foreach ( $this->errors as $error ) { - $this->logger->error( $error ); - } - } - } - - /** - * @param int|string $term - * @param string $taxonomy - * @param array $args - * - * @return array|mixed|\WP_Error - */ - protected function insert_term( $term, $taxonomy, $args = array() ) { - $parent = isset( $args['parent'] ) ? $args['parent'] : 0; - - if ( isset( $this->inserted_terms[ $taxonomy ][ $term . $parent ] ) ) { - return $this->inserted_terms[ $taxonomy ][ $term . $parent ]; - } - - - if ( ! $inserted_term = term_exists( $term, $taxonomy, $parent ) ) { - $inserted_term = wp_insert_term( $term, $taxonomy, $args ); - } - - if ( ! is_wp_error( $inserted_term ) ) { - $this->inserted_terms[ $taxonomy ][ $term . $parent ] = $inserted_term; - } - - return $inserted_term; - } - - /** - * For a specific file, go through and import the file, functions, and classes. - * - * @param array $file - * @param bool $skip_sleep Optional; defaults to false. If true, the sleep() calls are skipped. - * @param bool $import_ignored Optional; defaults to false. If true, functions and classes marked `@ignore` will be imported. - */ - public function import_file( array $file, $skip_sleep = false, $import_ignored = false ) { - - /** - * Filter whether to proceed with importing a prospective file. - * - * Returning a falsey value to the filter will short-circuit processing of the import file. - * - * @param bool $display Whether to proceed with importing the file. Default true. - * @param array $file File data - */ - if ( ! apply_filters( 'wp_parser_pre_import_file', true, $file ) ) { - $this->logger->info( sprintf( "\t" . 'Skipping file "%s".', $file['path'] ) ); - return; - } - - // Maybe add this file to the file taxonomy - $slug = sanitize_title( str_replace( '/', '_', $file['path'] ) ); - - $term = $this->insert_term( $file['path'], $this->taxonomy_file, array( 'slug' => $slug ) ); - - if ( is_wp_error( $term ) ) { - $this->errors[] = sprintf( 'Problem creating file tax item "%1$s" for %2$s: %3$s', $slug, $file['path'], $term->get_error_message() ); - return; - } - - // Detect deprecated file - $deprecated_file = false; - if ( isset( $file['uses']['functions'] ) ) { - $first_function = $file['uses']['functions'][0]; - - // If the first function in this file is _deprecated_function - if ( '_deprecated_file' === $first_function['name'] ) { - - // Set the deprecated flag to the version number - $deprecated_file = $first_function['deprecation_version']; - } - } - - // Store file meta for later use - $this->file_meta = array( - 'docblock' => $file['file'], // File docblock - 'term_id' => $file['path'], // Term name in the file taxonomy is the file name - 'deprecated' => $deprecated_file, // Deprecation status - ); - - // TODO ensures values are set, but better handled upstream later - $file = array_merge( array( - 'functions' => array(), - 'classes' => array(), - 'hooks' => array(), - ), $file ); - - $count = 0; - - foreach ( $file['functions'] as $function ) { - $this->import_function( $function, 0, $import_ignored ); - $count ++; - - if ( ! $skip_sleep && 0 == $count % 10 ) { // TODO figure our why are we still doing this - sleep( 3 ); - } - } - - foreach ( $file['classes'] as $class ) { - $this->import_class( $class, $import_ignored ); - $count ++; - - if ( ! $skip_sleep && 0 == $count % 10 ) { - sleep( 3 ); - } - } - - foreach ( $file['hooks'] as $hook ) { - $this->import_hook( $hook, 0, $import_ignored ); - $count ++; - - if ( ! $skip_sleep && 0 == $count % 10 ) { - sleep( 3 ); - } - } - } - - /** - * Create a post for a function - * - * @param array $data Function. - * @param int $parent_post_id Optional; post ID of the parent (class or function) this item belongs to. Defaults to zero (no parent). - * @param bool $import_ignored Optional; defaults to false. If true, functions marked `@ignore` will be imported. - * - * @return bool|int Post ID of this function, false if any failure. - */ - public function import_function( array $data, $parent_post_id = 0, $import_ignored = false ) { - $function_id = $this->import_item( $data, $parent_post_id, $import_ignored ); - - foreach ( $data['hooks'] as $hook ) { - $this->import_hook( $hook, $function_id, $import_ignored ); - } - } - - /** - * Create a post for a hook - * - * @param array $data Hook. - * @param int $parent_post_id Optional; post ID of the parent (function) this item belongs to. Defaults to zero (no parent). - * @param bool $import_ignored Optional; defaults to false. If true, hooks marked `@ignore` will be imported. - * @return bool|int Post ID of this hook, false if any failure. - */ - public function import_hook( array $data, $parent_post_id = 0, $import_ignored = false ) { - /** - * Filter whether to skip parsing duplicate hooks. - * - * "Duplicate hooks" are characterized in WordPress core by a preceding DocBlock comment - * including the phrases "This action is documented in" or "This filter is documented in". - * - * Passing a truthy value will skip the parsing of duplicate hooks. - * - * @param bool $skip Whether to skip parsing duplicate hooks. Default false. - */ - $skip_duplicates = apply_filters( 'wp_parser_skip_duplicate_hooks', false ); - - if ( false !== $skip_duplicates ) { - if ( 0 === strpos( $data['doc']['description'], 'This action is documented in' ) ) { - return false; - } - - if ( 0 === strpos( $data['doc']['description'], 'This filter is documented in' ) ) { - return false; - } - - if ( '' === $data['doc']['description'] && '' === $data['doc']['long_description'] ) { - return false; - } - } - - $hook_id = $this->import_item( $data, $parent_post_id, $import_ignored, array( 'post_type' => $this->post_type_hook ) ); - - if ( ! $hook_id ) { - return false; - } - - update_post_meta( $hook_id, '_wp-parser_hook_type', $data['type'] ); - - return $hook_id; - } - - /** - * Create a post for a class - * - * @param array $data Class. - * @param bool $import_ignored Optional; defaults to false. If true, functions marked `@ignore` will be imported. - * @return bool|int Post ID of this function, false if any failure. - */ - protected function import_class( array $data, $import_ignored = false ) { - - // Insert this class - $class_id = $this->import_item( $data, 0, $import_ignored, array( 'post_type' => $this->post_type_class ) ); - - if ( ! $class_id ) { - return false; - } - - // Set class-specific meta - update_post_meta( $class_id, '_wp-parser_final', (string) $data['final'] ); - update_post_meta( $class_id, '_wp-parser_abstract', (string) $data['abstract'] ); - update_post_meta( $class_id, '_wp-parser_extends', $data['extends'] ); - update_post_meta( $class_id, '_wp-parser_implements', $data['implements'] ); - update_post_meta( $class_id, '_wp-parser_properties', $data['properties'] ); - - // Now add the methods - foreach ( $data['methods'] as $method ) { - // Namespace method names with the class name - $method['name'] = $data['name'] . '::' . $method['name']; - $this->import_method( $method, $class_id, $import_ignored ); - } - - return $class_id; - } - - /** - * Create a post for a class method. - * - * @param array $data Method. - * @param int $parent_post_id Optional; post ID of the parent (class) this - * method belongs to. Defaults to zero (no parent). - * @param bool $import_ignored Optional; defaults to false. If true, functions - * marked `@ignore` will be imported. - * @return bool|int Post ID of this function, false if any failure. - */ - protected function import_method( array $data, $parent_post_id = 0, $import_ignored = false ) { - - // Insert this method. - $method_id = $this->import_item( $data, $parent_post_id, $import_ignored, array( 'post_type' => $this->post_type_method ) ); - - if ( ! $method_id ) { - return false; - } - - // Set method-specific meta. - update_post_meta( $method_id, '_wp-parser_final', (string) $data['final'] ); - update_post_meta( $method_id, '_wp-parser_abstract', (string) $data['abstract'] ); - update_post_meta( $method_id, '_wp-parser_static', (string) $data['static'] ); - update_post_meta( $method_id, '_wp-parser_visibility', $data['visibility'] ); - - // Now add the hooks. - if ( ! empty( $data['hooks'] ) ) { - foreach ( $data['hooks'] as $hook ) { - $this->import_hook( $hook, $method_id, $import_ignored ); - } - } - - return $method_id; - } - - /** - * Updates the 'wp_parser_imported_wp_version' option with the version from wp-includes/version.php. - * - * @param array $data Data - * @return string|false WordPress version number, or false if not known. - */ - protected function import_version( $data ) { - - $version_path = $data['root'] . '/' . $data['path']; - - if ( ! is_readable( $version_path ) ) { - return false; - } - - include $version_path; - - if ( isset( $wp_version ) && $wp_version ) { - update_option( 'wp_parser_imported_wp_version', $wp_version ); - $this->logger->info( "\t" . sprintf( 'Updated option wp_parser_imported_wp_version to "%1$s"', $wp_version ) ); - return $wp_version; - } - - return false; - } - - /** - * Create a post for an item (a class or a function). - * - * Anything that needs to be dealt identically for functions or methods should go in this function. - * Anything more specific should go in either import_function() or import_class() as appropriate. - * - * @param array $data Data. - * @param int $parent_post_id Optional; post ID of the parent (class or function) this item belongs to. Defaults to zero (no parent). - * @param bool $import_ignored Optional; defaults to false. If true, functions or classes marked `@ignore` will be imported. - * @param array $arg_overrides Optional; array of parameters that override the defaults passed to wp_update_post(). - * - * @return bool|int Post ID of this item, false if any failure. - */ - public function import_item( array $data, $parent_post_id = 0, $import_ignored = false, array $arg_overrides = array() ) { - - /** @var \wpdb $wpdb */ - global $wpdb; - - $is_new_post = true; - $ns_name = ( empty( $data['namespace'] ) || 'global' === $data['namespace'] ) ? $data['name'] : $data['namespace'] . '\\' . $data['name']; - $slug = sanitize_title( str_replace( '\\', '-', str_replace( '::', '-', $ns_name ) ) ); - - $post_data = wp_parse_args( - $arg_overrides, - array( - 'post_content' => $data['doc']['long_description'], - 'post_excerpt' => $data['doc']['description'], - 'post_name' => $slug, - 'post_parent' => (int) $parent_post_id, - 'post_status' => 'publish', - 'post_title' => $data['name'], - 'post_type' => $this->post_type_function, - ) - ); - - // Don't import items marked `@ignore` unless explicitly requested. See https://github.com/WordPress/phpdoc-parser/issues/16 - if ( ! $import_ignored && wp_list_filter( $data['doc']['tags'], array( 'name' => 'ignore' ) ) ) { - - switch ( $post_data['post_type'] ) { - case $this->post_type_class: - $this->logger->info( "\t" . sprintf( 'Skipped importing @ignore-d class "%1$s"', $ns_name ) ); - break; - - case $this->post_type_method: - $this->logger->info( "\t\t" . sprintf( 'Skipped importing @ignore-d method "%1$s"', $ns_name ) ); - break; - - case $this->post_type_hook: - $indent = ( $parent_post_id ) ? "\t\t" : "\t"; - $this->logger->info( $indent . sprintf( 'Skipped importing @ignore-d hook "%1$s"', $ns_name ) ); - break; - - default: - $this->logger->info( "\t" . sprintf( 'Skipped importing @ignore-d function "%1$s"', $ns_name ) ); - } - - return false; - } - - if ( wp_list_filter( $data['doc']['tags'], array( 'name' => 'ignore' ) ) ) { - return false; - } - - /** - * Filter whether to proceed with adding/updating a prospective import item. - * - * Returning a falsey value to the filter will short-circuit addition of the import item. - * - * @param bool $display Whether to proceed with adding/updating the import item. Default true. - * @param array $data Data - * @param int $parent_post_id Optional; post ID of the parent (class or function) this item belongs to. Defaults to zero (no parent). - * @param bool $import_ignored Optional; defaults to false. If true, functions or classes marked `@ignore` will be imported. - * @param array $arg_overrides Optional; array of parameters that override the defaults passed to wp_update_post(). - */ - if ( ! apply_filters( 'wp_parser_pre_import_item', true, $data, $parent_post_id, $import_ignored, $arg_overrides ) ) { - return false; - } - - // Look for an existing post for this item - if ( 'wp-parser-hook' === $post_data['post_type'] ) { - $existing_post_id = $wpdb->get_var( - $q = $wpdb->prepare( - "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type = %s LIMIT 1", - $slug, - $post_data['post_type'] - ) - ); - } else { - $existing_post_id = $wpdb->get_var( - $q = $wpdb->prepare( - "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND post_parent = %d LIMIT 1", - $slug, - $post_data['post_type'], - (int) $parent_post_id - ) - ); - } - - /** - * Filter an import item's post data before it is updated or inserted. - * - * @param array $post_data Array of post data. - * @param string|null $existing_post_id ID if the post already exists, null otherwise. - */ - $post_data = apply_filters( 'wp_parser_import_item_post_data', $post_data, $existing_post_id ); - - // Insert/update the item post - if ( ! empty( $existing_post_id ) ) { - $is_new_post = false; - $post_id = $post_data['ID'] = (int) $existing_post_id; - $post_needed_update = array_diff_assoc( sanitize_post( $post_data, 'db' ), get_post( $existing_post_id, ARRAY_A, 'db' ) ); - if ( $post_needed_update ) { - $post_id = wp_update_post( wp_slash( $post_data ), true ); - } - } else { - $post_id = wp_insert_post( wp_slash( $post_data ), true ); - } - $anything_updated = array(); - - if ( ! $post_id || is_wp_error( $post_id ) ) { - - switch ( $post_data['post_type'] ) { - case $this->post_type_class: - $this->errors[] = "\t" . sprintf( 'Problem inserting/updating post for class "%1$s"', $ns_name, $post_id->get_error_message() ); - break; - - case $this->post_type_method: - $this->errors[] = "\t\t" . sprintf( 'Problem inserting/updating post for method "%1$s"', $ns_name, $post_id->get_error_message() ); - break; - - case $this->post_type_hook: - $indent = ( $parent_post_id ) ? "\t\t" : "\t"; - $this->errors[] = $indent . sprintf( 'Problem inserting/updating post for hook "%1$s"', $ns_name, $post_id->get_error_message() ); - break; - - default: - $this->errors[] = "\t" . sprintf( 'Problem inserting/updating post for function "%1$s"', $ns_name, $post_id->get_error_message() ); - } - - return false; - } - - $namespaces = ( ! empty( $data['namespace'] ) ) ? explode( '\\', $data['namespace'] ) : array(); - $this->_set_namespaces( $post_id, $namespaces ); - - // If the item has @since markup, assign the taxonomy - $since_versions = wp_list_filter( $data['doc']['tags'], array( 'name' => 'since' ) ); - if ( ! empty( $since_versions ) ) { - - // Loop through all @since versions. - foreach ( $since_versions as $since_version ) { - - if ( ! empty( $since_version['content'] ) ) { - $since_term = $this->insert_term( $since_version['content'], $this->taxonomy_since_version ); - - // Assign the tax item to the post - if ( ! is_wp_error( $since_term ) ) { - $added_term_relationship = did_action( 'added_term_relationship' ); - wp_set_object_terms( $post_id, (int) $since_term['term_id'], $this->taxonomy_since_version, true ); - if ( did_action( 'added_term_relationship' ) > $added_term_relationship ) { - $anything_updated[] = true; - } - } else { - $this->logger->warning( "\tCannot set @since term: " . $since_term->get_error_message() ); - } - } - } - } - - $packages = array( - 'main' => wp_list_filter( $data['doc']['tags'], array( 'name' => 'package' ) ), - 'sub' => wp_list_filter( $data['doc']['tags'], array( 'name' => 'subpackage' ) ), - ); - - // If the @package/@subpackage is not set by the individual function or class, get it from the file scope - if ( empty( $packages['main'] ) ) { - $packages['main'] = wp_list_filter( $this->file_meta['docblock']['tags'], array( 'name' => 'package' ) ); - } - - if ( empty( $packages['sub'] ) ) { - $packages['sub'] = wp_list_filter( $this->file_meta['docblock']['tags'], array( 'name' => 'subpackage' ) ); - } - - $main_package_id = false; - $package_term_ids = array(); - - // If the item has any @package/@subpackage markup (or has inherited it from file scope), assign the taxonomy. - foreach ( $packages as $pack_name => $pack_value ) { - - if ( empty( $pack_value ) ) { - continue; - } - - $pack_value = array_shift( $pack_value ); - $pack_value = $pack_value['content']; - - $package_term_args = array( 'parent' => 0 ); - // Set the parent term_id to look for, as the package taxonomy is hierarchical. - if ( 'sub' === $pack_name && is_int( $main_package_id ) ) { - $package_term_args = array( 'parent' => $main_package_id ); - } - - // If the package doesn't already exist in the taxonomy, add it - $package_term = $this->insert_term( $pack_value, $this->taxonomy_package, $package_term_args ); - $package_term_ids[] = (int) $package_term['term_id']; - - if ( 'main' === $pack_name && false === $main_package_id && ! is_wp_error( $package_term ) ) { - $main_package_id = (int) $package_term['term_id']; - } - - if ( is_wp_error( $package_term ) ) { - if ( is_int( $main_package_id ) ) { - $this->logger->warning( "\tCannot create @subpackage term: " . $package_term->get_error_message() ); - } else { - $this->logger->warning( "\tCannot create @package term: " . $package_term->get_error_message() ); - } - } - } - $added_term_relationship = did_action( 'added_term_relationship' ); - wp_set_object_terms( $post_id, $package_term_ids, $this->taxonomy_package ); - if ( did_action( 'added_term_relationship' ) > $added_term_relationship ) { - $anything_updated[] = true; - } - - // Set other taxonomy and post meta to use in the theme templates - $added_item = did_action( 'added_term_relationship' ); - wp_set_object_terms( $post_id, $this->file_meta['term_id'], $this->taxonomy_file ); - if ( did_action( 'added_term_relationship' ) > $added_item ) { - $anything_updated[] = true; - } - - // If the file is deprecated do something - if ( ! empty( $this->file_meta['deprecated'] ) ) { - $data['doc']['tags']['deprecated'] = $this->file_meta['deprecated']; - } - - if ( $post_data['post_type'] !== $this->post_type_class ) { - $anything_updated[] = update_post_meta( $post_id, '_wp-parser_args', $data['arguments'] ); - } - - // If the post type is using namespace aliases, record them. - if ( ! empty( $data['aliases'] ) ) { - $anything_updated[] = update_post_meta( $post_id, '_wp_parser_aliases', (array) $data['aliases'] ); - } - - // Recored the namespace if there is one. - if ( ! empty( $data['namespace'] ) ) { - $anything_updated[] = update_post_meta( $post_id, '_wp_parser_namespace', (string) addslashes( $data['namespace'] ) ); - } - - $anything_updated[] = update_post_meta( $post_id, '_wp-parser_line_num', (string) $data['line'] ); - $anything_updated[] = update_post_meta( $post_id, '_wp-parser_end_line_num', (string) $data['end_line'] ); - $anything_updated[] = update_post_meta( $post_id, '_wp-parser_tags', $data['doc']['tags'] ); - $anything_updated[] = update_post_meta( $post_id, '_wp-parser_last_parsed_wp_version', $this->version ); - - // If the post didn't need to be updated, but meta or tax changed, update it to bump last modified. - if ( ! $is_new_post && ! $post_needed_update && array_filter( $anything_updated ) ) { - wp_update_post( wp_slash( $post_data ), true ); - } - - $action = $is_new_post ? 'Imported' : 'Updated'; - - switch ( $post_data['post_type'] ) { - case $this->post_type_class: - $this->logger->info( "\t" . sprintf( '%1$s class "%2$s"', $action, $ns_name ) ); - break; - - case $this->post_type_hook: - $indent = ( $parent_post_id ) ? "\t\t" : "\t"; - $this->logger->info( $indent . sprintf( '%1$s hook "%2$s"', $action, $ns_name ) ); - break; - - case $this->post_type_method: - $this->logger->info( "\t\t" . sprintf( '%1$s method "%2$s"', $action, $ns_name ) ); - break; - - default: - $this->logger->info( "\t" . sprintf( '%1$s function "%2$s"', $action, $ns_name ) ); - } - - /** - * Action at the end of importing an item. - * - * @param int $post_id Optional; post ID of the inserted or updated item. - * @param array $data PHPDoc data for the item we just imported - * @param array $post_data WordPress data of the post we just inserted or updated - */ - do_action( 'wp_parser_import_item', $post_id, $data, $post_data ); - - return $post_id; - } - - /** - * Process the Namespace of items and add them to the correct taxonomy terms. - * - * This creates terms for each of the namespace terms in a hierachical tree - * and then adds the item being processed to each of the terms in that tree. - * - * @param int $post_id The ID of the post item being processed. - * @param array $namespaces An array of namespaces strings - */ - protected function _set_namespaces( $post_id, $namespaces ) { - $ns_term = false; - $ns_terms = array(); - foreach ( $namespaces as $namespace ) { - $ns_term = $this->insert_term( - $namespace, - $this->taxonomy_namespace, - array( - 'slug' => strtolower( str_replace( '_', '-', $namespace ) ), - 'parent' => ( $ns_term ) ? $ns_term['term_id'] : 0, - ) - ); - if ( ! is_wp_error( $ns_term ) ) { - $ns_terms[] = (int) $ns_term['term_id']; - } else { - $this->logger->warning( "\tCannot set namespace term: " . $ns_term->get_error_message() ); - $ns_term = false; - } - } - - if ( ! empty( $ns_terms ) ) { - $added_term_relationship = did_action( 'added_term_relationship' ); - wp_set_object_terms( $post_id, $ns_terms, $this->taxonomy_namespace ); - if( did_action( 'added_term_relationship' ) > $added_term_relationship ) { - $this->anything_updated[] = true; - } - } - } +class Importer implements LoggerAwareInterface +{ + use LoggerAwareTrait; + + /** + * + */ + const PROPERTY_MAP = [ + 'post_type_class' => 'wp-parser-class', + 'post_type_method' => 'wp-parser-method', + 'post_type_function' => 'wp-parser-function', + 'post_type_hook' => 'wp-parser-hook', + 'taxonomy_file' => 'wp-parser-source-file', + 'taxonomy_namespace' => 'wp-parser-namespace', + 'taxonomy_package' => 'wp-parser-package', + 'taxonomy_since_version' => 'wp-parser-since', + 'taxonomy_source_type' => Plugin::SOURCE_TYPE_TAX_SLUG, + ]; + + /** + * Taxonomy name for files + * + * @var string + */ + public $taxonomy_file; + + /** + * Taxonomy name for an item's namespace tags + * + * @var string + */ + public $taxonomy_namespace; + + /** + * Taxonomy name for an item's @since tag + * + * @var string + */ + public $taxonomy_since_version; + + /** + * Taxonomy name for an item's @package/@subpackage tags + * + * @var string + */ + public $taxonomy_package; + + /** + * Taxonomy name for the type of source being parsed. + * + * Example: `plugin`, `theme`, `composer-package` + * + * @var string + */ + public $taxonomy_source_type; + + /** + * Meta data containing information about the type of source being parsed + * + * @var array + */ + public $source_type_meta; + + /** + * Post type name for functions + * + * @var string + */ + public $post_type_function; + + /** + * Post type name for classes + * + * @var string + */ + public $post_type_class; + + /** + * Post type name for methods + * + * @var string + */ + public $post_type_method; + + /** + * Post type name for hooks + * + * @var string + */ + public $post_type_hook; + + /** + * Handy store for meta about the current item being imported + * + * @var array + */ + public $file_meta = []; + + /** + * @var array Human-readable errors + */ + public $errors = []; + + /** + * Version number of codebase being parsed. + * + * @var string + */ + public $version; + + /** + * @var array Cached items of inserted terms + */ + protected $inserted_terms = []; + + /** + * Constructor. Sets up post type/taxonomy names. + * + * @param array $source_type_meta + * @param array $args Optional. Associative array; class property => value. + */ + public function __construct(array $source_type_meta, array $args = []) { + $this->source_type_meta = $source_type_meta; + $properties = wp_parse_args( + $args, + self::PROPERTY_MAP + ); + + foreach ($properties as $property_name => $value) { + $this->{$property_name} = $value; + } + + $this->logger = new NullLogger(); + } + + /** + * Import the PHPDoc $data into WordPress posts and taxonomies + * + * @param array $data + * @param bool $skip_sleep Optional; defaults to false. If true, the sleep() calls are skipped. + * @param bool $import_ignored_functions Optional; defaults to false. If true, functions marked `@ignore` will be imported. + */ + public function import(array $data, $skip_sleep = false, $import_ignored_functions = false) { + global $wpdb; + + $time_start = microtime(true); + $num_queries = $wpdb->num_queries; + + $this->logger->info('Starting import. This will take some time…'); + + $file_number = 1; + $num_of_files = count($data); + + do_action('wp_parser_starting_import'); + + // Defer term counting for performance + wp_suspend_cache_invalidation(true); + wp_defer_term_counting(true); + wp_defer_comment_counting(true); + + // Remove actions for performance + remove_action('transition_post_status', '_update_blog_date_on_post_publish', 10); + remove_action('transition_post_status', '__clear_multi_author_cache', 10); + + delete_option('wp_parser_imported_wp_version'); + delete_option('wp_parser_root_import_dir'); + + // Sanity check -- do the required post types exist? + if (!post_type_exists($this->post_type_class) || !post_type_exists($this->post_type_function) || !post_type_exists($this->post_type_hook)) { + $this->logger->error(sprintf('Missing post type; check that "%1$s", "%2$s", and "%3$s" are registered.', $this->post_type_class, $this->post_type_function, $this->post_type_hook)); + exit; + } + + // Sanity check -- do the required taxonomies exist? + foreach (['taxonomy_file', 'taxonomy_since_version', 'taxonomy_package', 'taxonomy_source_type'] as $taxonomy_name) { + if (!taxonomy_exists($this->{$taxonomy_name})) { + $this->logger->error(sprintf('Missing taxonomy; check that "%1$s" is registered.', $this->{$taxonomy_name})); + exit; + } + } + + // Sanity check -- make sure `wp-parser-source-type` default terms exist + foreach (['plugin', 'theme', 'composer-package'] as $term_slug) { + if (!term_exists($term_slug, $this->taxonomy_source_type)) { + $this->logger->error(sprintf( + "Missing term for {$this->taxonomy_source_type}; check that '%1\$s' is registered.", + $term_slug + )); + exit; + } + } + + $parent_term = get_term_by('slug', $this->source_type_meta['type'], $this->taxonomy_source_type); + if (empty($parent_term)) { + $this->logger->error(sprintf( + "Missing term for {$this->taxonomy_source_type}; check that '%1\$s' is registered.", + $this->source_type_meta['type'] + )); + exit; + } + + // Create a child term for the corresponding `wp-parser-source-type` taxonomy default term, if necessary + $source_term_id = null; + $source_type_term = get_term_by('slug', $this->source_type_meta['name'], $this->taxonomy_source_type); + if (empty($source_type_term)) { + $source_type_term = wp_insert_term( + $this->source_type_meta['name'], + $this->taxonomy_source_type, + ['parent' => $parent_term->term_id] + ); + + if ($source_type_term instanceof \WP_Error) { + $this->logger->error(sprintf( + "Failed creating child term {$this->source_type_meta['name']}; check that the parent term '%1\$s' is registered.", + $this->source_type_meta['type'] + )); + exit; + } + $source_term_id = $source_type_term['term_id']; + } else { + $source_term_id = $source_type_term->term_id; + } + + // Set term data so we can create relationships later + $this->source_type_meta['type_term_id'] = $source_term_id; + $this->source_type_meta['type_parent_term_id'] = $parent_term->term_id; + + // Specifically import WP version file first to get version number. + $ver_file = array_filter($data, function ($f) { + return 'wp-includes/version.php' === $f['path']; + }); + if ($ver_file) { + $this->version = $this->import_version(reset($ver_file)); + } + + $root = ''; + foreach ($data as $file) { + $this->logger->info(sprintf('Processing file %1$s of %2$s "%3$s".', number_format_i18n($file_number), number_format_i18n($num_of_files), $file['path'])); + $file_number++; + + $this->import_file($file, $skip_sleep, $import_ignored_functions); + + if (empty($root) && (isset($file['root']) && $file['root'])) { + $root = $file['root']; + } + } + + if (!empty($root)) { + update_option('wp_parser_root_import_dir', $root); + $this->logger->info('Updated option wp_parser_root_import_dir: ' . $root); + } + + $last_import = time(); + $import_date = date_i18n(get_option('date_format'), $last_import); + $import_time = date_i18n(get_option('time_format'), $last_import); + update_option('wp_parser_last_import', $last_import); + $this->logger->info(sprintf('Updated option wp_parser_last_import: %1$s at %2$s.', $import_date, $import_time)); + + $wp_version = get_option('wp_parser_imported_wp_version'); + if ($wp_version) { + $this->logger->info('Updated option wp_parser_imported_wp_version: ' . $wp_version); + } + + /* + * Workaround for a WP core bug where hierarchical taxonomy caches are not being cleared + * + * https://core.trac.wordpress.org/ticket/14485 + * http://wordpress.stackexchange.com/questions/8357/inserting-terms-in-an-hierarchical-taxonomy + */ + delete_option("{$this->taxonomy_package}_children"); + delete_option("{$this->taxonomy_since_version}_children"); + + /* + * Action at the end of a complete import + */ + do_action('wp_parser_ending_import'); + + // Start counting again + wp_defer_term_counting(false); + wp_suspend_cache_invalidation(false); + wp_cache_flush(); + wp_defer_comment_counting(false); + + $time_end = microtime(true); + $time = $time_end - $time_start; + + $this->logger->info('Time: ' . $time); + $this->logger->info('Queries: ' . ($wpdb->num_queries - $num_queries)); + if (empty($this->errors)) { + $this->logger->notice('Import complete!'); + } else { + $this->logger->info('Import complete, but some errors were found:'); + + foreach ($this->errors as $error) { + $this->logger->error($error); + } + } + } + + /** + * @param int|string $term + * @param string $taxonomy + * @param array $args + * + * @return array|mixed|\WP_Error + */ + protected function insert_term($term, $taxonomy, $args = []) { + $parent = isset($args['parent']) ? $args['parent'] : 0; + + if (isset($this->inserted_terms[$taxonomy][$term . $parent])) { + return $this->inserted_terms[$taxonomy][$term . $parent]; + } + + if (!$inserted_term = term_exists($term, $taxonomy, $parent)) { + $inserted_term = wp_insert_term($term, $taxonomy, $args); + } + + if (!is_wp_error($inserted_term)) { + $this->inserted_terms[$taxonomy][$term . $parent] = $inserted_term; + } + + return $inserted_term; + } + + /** + * For a specific file, go through and import the file, functions, and classes. + * + * @param array $file + * @param bool $skip_sleep Optional; defaults to false. If true, the sleep() calls are skipped. + * @param bool $import_ignored Optional; defaults to false. If true, functions and classes marked `@ignore` will be imported. + */ + public function import_file(array $file, $skip_sleep = false, $import_ignored = false) { + /* + * Filter whether to proceed with importing a prospective file. + * + * Returning a falsey value to the filter will short-circuit processing of the import file. + * + * @param bool $display Whether to proceed with importing the file. Default true. + * @param array $file File data + */ + if (!apply_filters('wp_parser_pre_import_file', true, $file)) { + $this->logger->info(sprintf("\t" . 'Skipping file "%s".', $file['path'])); + return; + } + + // Maybe add this file to the file taxonomy + $slug = sanitize_title(str_replace('/', '_', $file['path'])); + + $term = $this->insert_term($file['path'], $this->taxonomy_file, ['slug' => $slug]); + + if (is_wp_error($term)) { + $this->errors[] = sprintf('Problem creating file tax item "%1$s" for %2$s: %3$s', $slug, $file['path'], $term->get_error_message()); + return; + } + + // Detect deprecated file + $deprecated_file = false; + if (isset($file['uses']['functions'])) { + $first_function = $file['uses']['functions'][0]; + + // If the first function in this file is _deprecated_function + if ('_deprecated_file' === $first_function['name']) { + // Set the deprecated flag to the version number + $deprecated_file = $first_function['deprecation_version']; + } + } + + // Store file meta for later use + $this->file_meta = [ + 'docblock' => $file['file'], // File docblock + 'term_id' => $file['path'], // Term name in the file taxonomy is the file name + 'deprecated' => $deprecated_file, // Deprecation status + ]; + + // TODO ensures values are set, but better handled upstream later + $file = array_merge([ + 'functions' => [], + 'classes' => [], + 'hooks' => [], + ], $file); + + $count = 0; + + foreach ($file['functions'] as $function) { + $this->import_function($function, 0, $import_ignored); + $count++; + + if (!$skip_sleep && 0 == $count % 10) { // TODO figure our why are we still doing this + sleep(3); + } + } + + foreach ($file['classes'] as $class) { + $this->import_class($class, $import_ignored); + $count++; + + if (!$skip_sleep && 0 == $count % 10) { + sleep(3); + } + } + + foreach ($file['hooks'] as $hook) { + $this->import_hook($hook, 0, $import_ignored); + $count++; + + if (!$skip_sleep && 0 == $count % 10) { + sleep(3); + } + } + } + + /** + * Create a post for a function + * + * @param array $data Function. + * @param int $parent_post_id Optional; post ID of the parent (class or function) this item belongs to. Defaults to zero (no parent). + * @param bool $import_ignored Optional; defaults to false. If true, functions marked `@ignore` will be imported. + * + * @return bool|int Post ID of this function, false if any failure. + */ + public function import_function(array $data, $parent_post_id = 0, $import_ignored = false) { + $function_id = $this->import_item($data, $parent_post_id, $import_ignored); + + foreach ($data['hooks'] as $hook) { + $this->import_hook($hook, $function_id, $import_ignored); + } + } + + /** + * Create a post for a hook + * + * @param array $data Hook. + * @param int $parent_post_id Optional; post ID of the parent (function) this item belongs to. Defaults to zero (no parent). + * @param bool $import_ignored Optional; defaults to false. If true, hooks marked `@ignore` will be imported. + * @return bool|int Post ID of this hook, false if any failure. + */ + public function import_hook(array $data, $parent_post_id = 0, $import_ignored = false) { + /* + * Filter whether to skip parsing duplicate hooks. + * + * "Duplicate hooks" are characterized in WordPress core by a preceding DocBlock comment + * including the phrases "This action is documented in" or "This filter is documented in". + * + * Passing a truthy value will skip the parsing of duplicate hooks. + * + * @param bool $skip Whether to skip parsing duplicate hooks. Default false. + */ + $skip_duplicates = apply_filters('wp_parser_skip_duplicate_hooks', false); + + if (false !== $skip_duplicates) { + if (0 === strpos($data['doc']['description'], 'This action is documented in')) { + return false; + } + + if (0 === strpos($data['doc']['description'], 'This filter is documented in')) { + return false; + } + + if ('' === $data['doc']['description'] && '' === $data['doc']['long_description']) { + return false; + } + } + + $hook_id = $this->import_item($data, $parent_post_id, $import_ignored, ['post_type' => $this->post_type_hook]); + + if (!$hook_id) { + return false; + } + + update_post_meta($hook_id, '_wp-parser_hook_type', $data['type']); + + return $hook_id; + } + + /** + * Create a post for a class + * + * @param array $data Class. + * @param bool $import_ignored Optional; defaults to false. If true, functions marked `@ignore` will be imported. + * @return bool|int Post ID of this function, false if any failure. + */ + protected function import_class(array $data, $import_ignored = false) { + // Insert this class + $class_id = $this->import_item($data, 0, $import_ignored, ['post_type' => $this->post_type_class]); + + if (!$class_id) { + return false; + } + + // Set class-specific meta + update_post_meta($class_id, '_wp-parser_final', (string)$data['final']); + update_post_meta($class_id, '_wp-parser_abstract', (string)$data['abstract']); + update_post_meta($class_id, '_wp-parser_extends', $data['extends']); + update_post_meta($class_id, '_wp-parser_implements', $data['implements']); + update_post_meta($class_id, '_wp-parser_properties', $data['properties']); + + // Now add the methods + foreach ($data['methods'] as $method) { + // Namespace method names with the class name + $method['name'] = $data['name'] . '::' . $method['name']; + $this->import_method($method, $class_id, $import_ignored); + } + + return $class_id; + } + + /** + * Create a post for a class method. + * + * @param array $data Method. + * @param int $parent_post_id Optional; post ID of the parent (class) this + * method belongs to. Defaults to zero (no parent). + * @param bool $import_ignored Optional; defaults to false. If true, functions + * marked `@ignore` will be imported. + * @return bool|int Post ID of this function, false if any failure. + */ + protected function import_method(array $data, $parent_post_id = 0, $import_ignored = false) { + // Insert this method. + $method_id = $this->import_item($data, $parent_post_id, $import_ignored, ['post_type' => $this->post_type_method]); + + if (!$method_id) { + return false; + } + + // Set method-specific meta. + update_post_meta($method_id, '_wp-parser_final', (string)$data['final']); + update_post_meta($method_id, '_wp-parser_abstract', (string)$data['abstract']); + update_post_meta($method_id, '_wp-parser_static', (string)$data['static']); + update_post_meta($method_id, '_wp-parser_visibility', $data['visibility']); + + // Now add the hooks. + if (!empty($data['hooks'])) { + foreach ($data['hooks'] as $hook) { + $this->import_hook($hook, $method_id, $import_ignored); + } + } + + return $method_id; + } + + /** + * Updates the 'wp_parser_imported_wp_version' option with the version from wp-includes/version.php. + * + * @param array $data Data + * @return string|false WordPress version number, or false if not known. + */ + protected function import_version($data) { + $version_path = $data['root'] . '/' . $data['path']; + + if (!is_readable($version_path)) { + return false; + } + + include $version_path; + + if (isset($wp_version) && $wp_version) { + update_option('wp_parser_imported_wp_version', $wp_version); + $this->logger->info("\t" . sprintf('Updated option wp_parser_imported_wp_version to "%1$s"', $wp_version)); + return $wp_version; + } + + return false; + } + + /** + * Create a post for an item (a class or a function). + * + * Anything that needs to be dealt identically for functions or methods should go in this function. + * Anything more specific should go in either import_function() or import_class() as appropriate. + * + * @param array $data Data. + * @param int $parent_post_id Optional; post ID of the parent (class or function) this item belongs to. Defaults to zero (no parent). + * @param bool $import_ignored Optional; defaults to false. If true, functions or classes marked `@ignore` will be imported. + * @param array $arg_overrides Optional; array of parameters that override the defaults passed to wp_update_post(). + * + * @return bool|int Post ID of this item, false if any failure. + */ + public function import_item(array $data, $parent_post_id = 0, $import_ignored = false, array $arg_overrides = []) { + /* + * @var \wpdb $wpdb + */ + global $wpdb; + + $is_new_post = true; + $ns_name = (empty($data['namespace']) || 'global' === $data['namespace']) ? $data['name'] : $data['namespace'] . '\\' . $data['name']; + $slug = sanitize_title(str_replace('\\', '-', str_replace('::', '-', $ns_name))); + + $post_data = wp_parse_args( + $arg_overrides, + [ + 'post_content' => $data['doc']['long_description'], + 'post_excerpt' => $data['doc']['description'], + 'post_name' => $slug, + 'post_parent' => (int)$parent_post_id, + 'post_status' => 'publish', + 'post_title' => $data['name'], + 'post_type' => $this->post_type_function, + ] + ); + + // Don't import items marked `@ignore` unless explicitly requested. See https://github.com/WordPress/phpdoc-parser/issues/16 + if (!$import_ignored && wp_list_filter($data['doc']['tags'], ['name' => 'ignore'])) { + switch ($post_data['post_type']) { + case $this->post_type_class: + $this->logger->info("\t" . sprintf('Skipped importing @ignore-d class "%1$s"', $ns_name)); + break; + + case $this->post_type_method: + $this->logger->info("\t\t" . sprintf('Skipped importing @ignore-d method "%1$s"', $ns_name)); + break; + + case $this->post_type_hook: + $indent = ($parent_post_id) ? "\t\t" : "\t"; + $this->logger->info($indent . sprintf('Skipped importing @ignore-d hook "%1$s"', $ns_name)); + break; + + default: + $this->logger->info("\t" . sprintf('Skipped importing @ignore-d function "%1$s"', $ns_name)); + } + + return false; + } + + if (wp_list_filter($data['doc']['tags'], ['name' => 'ignore'])) { + return false; + } + + /* + * Filter whether to proceed with adding/updating a prospective import item. + * + * Returning a falsey value to the filter will short-circuit addition of the import item. + * + * @param bool $display Whether to proceed with adding/updating the import item. Default true. + * @param array $data Data + * @param int $parent_post_id Optional; post ID of the parent (class or function) this item belongs to. Defaults to zero (no parent). + * @param bool $import_ignored Optional; defaults to false. If true, functions or classes marked `@ignore` will be imported. + * @param array $arg_overrides Optional; array of parameters that override the defaults passed to wp_update_post(). + */ + if (!apply_filters('wp_parser_pre_import_item', true, $data, $parent_post_id, $import_ignored, $arg_overrides)) { + return false; + } + + // Look for an existing post for this item + if ('wp-parser-hook' === $post_data['post_type']) { + $existing_post_id = $wpdb->get_var( + $q = $wpdb->prepare( + "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type = %s LIMIT 1", + $slug, + $post_data['post_type'] + ) + ); + } else { + $existing_post_id = $wpdb->get_var( + $q = $wpdb->prepare( + "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND post_parent = %d LIMIT 1", + $slug, + $post_data['post_type'], + (int)$parent_post_id + ) + ); + } + + /* + * Filter an import item's post data before it is updated or inserted. + * + * @param array $post_data Array of post data. + * @param string|null $existing_post_id ID if the post already exists, null otherwise. + */ + $post_data = apply_filters('wp_parser_import_item_post_data', $post_data, $existing_post_id); + + // Insert/update the item post + if (!empty($existing_post_id)) { + $is_new_post = false; + $post_id = $post_data['ID'] = (int)$existing_post_id; + $post_needed_update = array_diff_assoc(sanitize_post($post_data, 'db'), get_post($existing_post_id, ARRAY_A, 'db')); + if ($post_needed_update) { + $post_id = wp_update_post(wp_slash($post_data), true); + } + } else { + $post_id = wp_insert_post(wp_slash($post_data), true); + } + $anything_updated = []; + + if (!$post_id || is_wp_error($post_id)) { + switch ($post_data['post_type']) { + case $this->post_type_class: + $this->errors[] = "\t" . sprintf('Problem inserting/updating post for class "%1$s"', $ns_name, $post_id->get_error_message()); + break; + + case $this->post_type_method: + $this->errors[] = "\t\t" . sprintf('Problem inserting/updating post for method "%1$s"', $ns_name, $post_id->get_error_message()); + break; + + case $this->post_type_hook: + $indent = ($parent_post_id) ? "\t\t" : "\t"; + $this->errors[] = $indent . sprintf('Problem inserting/updating post for hook "%1$s"', $ns_name, $post_id->get_error_message()); + break; + + default: + $this->errors[] = "\t" . sprintf('Problem inserting/updating post for function "%1$s"', $ns_name, $post_id->get_error_message()); + } + + return false; + } + + $namespaces = (!empty($data['namespace'])) ? explode('\\', $data['namespace']) : []; + $this->_set_namespaces($post_id, $namespaces); + + // Assign `wp-parser-source-type` term + wp_set_object_terms( + $post_id, + [$this->source_type_meta['type_parent_term_id'], $this->source_type_meta['type_term_id']], + $this->taxonomy_source_type + ); + + // If the item has @since markup, assign the taxonomy + $since_versions = wp_list_filter($data['doc']['tags'], ['name' => 'since']); + if (!empty($since_versions)) { + // Loop through all @since versions. + foreach ($since_versions as $since_version) { + if (!empty($since_version['content'])) { + $since_term = $this->insert_term($since_version['content'], $this->taxonomy_since_version); + + // Assign the tax item to the post + if (!is_wp_error($since_term)) { + $added_term_relationship = did_action('added_term_relationship'); + wp_set_object_terms($post_id, (int)$since_term['term_id'], $this->taxonomy_since_version, true); + if (did_action('added_term_relationship') > $added_term_relationship) { + $anything_updated[] = true; + } + } else { + $this->logger->warning("\tCannot set @since term: " . $since_term->get_error_message()); + } + } + } + } + + $packages = [ + 'main' => wp_list_filter($data['doc']['tags'], ['name' => 'package']), + 'sub' => wp_list_filter($data['doc']['tags'], ['name' => 'subpackage']), + ]; + + // If the @package/@subpackage is not set by the individual function or class, get it from the file scope + if (empty($packages['main'])) { + $packages['main'] = wp_list_filter($this->file_meta['docblock']['tags'], ['name' => 'package']); + } + + if (empty($packages['sub'])) { + $packages['sub'] = wp_list_filter($this->file_meta['docblock']['tags'], ['name' => 'subpackage']); + } + + $main_package_id = false; + $package_term_ids = []; + + // If the item has any @package/@subpackage markup (or has inherited it from file scope), assign the taxonomy. + foreach ($packages as $pack_name => $pack_value) { + if (empty($pack_value)) { + continue; + } + + $pack_value = array_shift($pack_value); + $pack_value = $pack_value['content']; + + $package_term_args = ['parent' => 0]; + // Set the parent term_id to look for, as the package taxonomy is hierarchical. + if ('sub' === $pack_name && is_int($main_package_id)) { + $package_term_args = ['parent' => $main_package_id]; + } + + // If the package doesn't already exist in the taxonomy, add it + $package_term = $this->insert_term($pack_value, $this->taxonomy_package, $package_term_args); + $package_term_ids[] = (int)$package_term['term_id']; + + if ('main' === $pack_name && false === $main_package_id && !is_wp_error($package_term)) { + $main_package_id = (int)$package_term['term_id']; + } + + if (is_wp_error($package_term)) { + if (is_int($main_package_id)) { + $this->logger->warning("\tCannot create @subpackage term: " . $package_term->get_error_message()); + } else { + $this->logger->warning("\tCannot create @package term: " . $package_term->get_error_message()); + } + } + } + $added_term_relationship = did_action('added_term_relationship'); + wp_set_object_terms($post_id, $package_term_ids, $this->taxonomy_package); + if (did_action('added_term_relationship') > $added_term_relationship) { + $anything_updated[] = true; + } + + // Set other taxonomy and post meta to use in the theme templates + $added_item = did_action('added_term_relationship'); + wp_set_object_terms($post_id, $this->file_meta['term_id'], $this->taxonomy_file); + if (did_action('added_term_relationship') > $added_item) { + $anything_updated[] = true; + } + + // If the file is deprecated do something + if (!empty($this->file_meta['deprecated'])) { + $data['doc']['tags']['deprecated'] = $this->file_meta['deprecated']; + } + + if ($post_data['post_type'] !== $this->post_type_class) { + $anything_updated[] = update_post_meta($post_id, '_wp-parser_args', $data['arguments']); + } + + // If the post type is using namespace aliases, record them. + if (!empty($data['aliases'])) { + $anything_updated[] = update_post_meta($post_id, '_wp_parser_aliases', (array)$data['aliases']); + } + + // Recored the namespace if there is one. + if (!empty($data['namespace'])) { + $anything_updated[] = update_post_meta($post_id, '_wp_parser_namespace', (string)addslashes($data['namespace'])); + } + + $anything_updated[] = update_post_meta($post_id, '_wp-parser_line_num', (string)$data['line']); + $anything_updated[] = update_post_meta($post_id, '_wp-parser_end_line_num', (string)$data['end_line']); + $anything_updated[] = update_post_meta($post_id, '_wp-parser_tags', $data['doc']['tags']); + $anything_updated[] = update_post_meta($post_id, '_wp-parser_last_parsed_wp_version', $this->version); + + // If the post didn't need to be updated, but meta or tax changed, update it to bump last modified. + if (!$is_new_post && !$post_needed_update && array_filter($anything_updated)) { + wp_update_post(wp_slash($post_data), true); + } + + $action = $is_new_post ? 'Imported' : 'Updated'; + + switch ($post_data['post_type']) { + case $this->post_type_class: + $this->logger->info("\t" . sprintf('%1$s class "%2$s"', $action, $ns_name)); + break; + + case $this->post_type_hook: + $indent = ($parent_post_id) ? "\t\t" : "\t"; + $this->logger->info($indent . sprintf('%1$s hook "%2$s"', $action, $ns_name)); + break; + + case $this->post_type_method: + $this->logger->info("\t\t" . sprintf('%1$s method "%2$s"', $action, $ns_name)); + break; + + default: + $this->logger->info("\t" . sprintf('%1$s function "%2$s"', $action, $ns_name)); + } + + /* + * Action at the end of importing an item. + * + * @param int $post_id Optional; post ID of the inserted or updated item. + * @param array $data PHPDoc data for the item we just imported + * @param array $post_data WordPress data of the post we just inserted or updated + */ + do_action('wp_parser_import_item', $post_id, $data, $post_data); + + return $post_id; + } + + /** + * Process the Namespace of items and add them to the correct taxonomy terms. + * + * This creates terms for each of the namespace terms in a hierachical tree + * and then adds the item being processed to each of the terms in that tree. + * + * @param int $post_id The ID of the post item being processed. + * @param array $namespaces An array of namespaces strings + */ + protected function _set_namespaces($post_id, $namespaces) { + $ns_term = false; + $ns_terms = []; + foreach ($namespaces as $namespace) { + $ns_term = $this->insert_term( + $namespace, + $this->taxonomy_namespace, + [ + 'slug' => strtolower(str_replace('_', '-', $namespace)), + 'parent' => ($ns_term) ? $ns_term['term_id'] : 0, + ] + ); + if (!is_wp_error($ns_term)) { + $ns_terms[] = (int)$ns_term['term_id']; + } else { + $this->logger->warning("\tCannot set namespace term: " . $ns_term->get_error_message()); + $ns_term = false; + } + } + + if (!empty($ns_terms)) { + $added_term_relationship = did_action('added_term_relationship'); + wp_set_object_terms($post_id, $ns_terms, $this->taxonomy_namespace); + if (did_action('added_term_relationship') > $added_term_relationship) { + $this->anything_updated[] = true; + } + } + } } diff --git a/lib/class-plugin.php b/lib/class-plugin.php index 5fe7f95..f9d8ace 100644 --- a/lib/class-plugin.php +++ b/lib/class-plugin.php @@ -1,258 +1,289 @@ relationships = new Relationships; - - add_action( 'init', array( $this, 'register_post_types' ), 11 ); - add_action( 'init', array( $this, 'register_taxonomies' ), 11 ); - add_filter( 'wp_parser_get_arguments', array( $this, 'make_args_safe' ) ); - add_filter( 'wp_parser_return_type', array( $this, 'humanize_separator' ) ); - - add_filter( 'post_type_link', array( $this, 'method_permalink' ), 10, 2 ); - } - - /** - * Register the function and class post types - */ - public function register_post_types() { - - $supports = array( - 'comments', - 'custom-fields', - 'editor', - 'excerpt', - 'revisions', - 'title', - ); - - if ( ! post_type_exists( 'wp-parser-function' ) ) { - - register_post_type( - 'wp-parser-function', - array( - 'has_archive' => 'functions', - 'label' => __( 'Functions', 'wp-parser' ), - 'public' => true, - 'rewrite' => array( - 'feeds' => false, - 'slug' => 'function', - 'with_front' => false, - ), - 'supports' => $supports, - ) - ); - } - - - if ( ! post_type_exists( 'wp-parser-method' ) ) { - - add_rewrite_rule( 'method/([^/]+)/([^/]+)/?$', 'index.php?post_type=wp-parser-method&name=$matches[1]-$matches[2]', 'top' ); - - register_post_type( - 'wp-parser-method', - array( - 'has_archive' => 'methods', - 'label' => __( 'Methods', 'wp-parser' ), - 'public' => true, - 'rewrite' => array( - 'feeds' => false, - 'slug' => 'method', - 'with_front' => false, - ), - 'supports' => $supports, - ) - ); - } - - - if ( ! post_type_exists( 'wp-parser-class' ) ) { - - register_post_type( - 'wp-parser-class', - array( - 'has_archive' => 'classes', - 'label' => __( 'Classes', 'wp-parser' ), - 'public' => true, - 'rewrite' => array( - 'feeds' => false, - 'slug' => 'class', - 'with_front' => false, - ), - 'supports' => $supports, - ) - ); - } - - if ( ! post_type_exists( 'wp-parser-hook' ) ) { - - register_post_type( - 'wp-parser-hook', - array( - 'has_archive' => 'hooks', - 'label' => __( 'Hooks', 'wp-parser' ), - 'public' => true, - 'rewrite' => array( - 'feeds' => false, - 'slug' => 'hook', - 'with_front' => false, - ), - 'supports' => $supports, - ) - ); - } - } - - /** - * Register the file and @since taxonomies - */ - public function register_taxonomies() { - - $object_types = array( 'wp-parser-class', 'wp-parser-method', 'wp-parser-function', 'wp-parser-hook' ); - - if ( ! taxonomy_exists( 'wp-parser-source-file' ) ) { - - register_taxonomy( - 'wp-parser-source-file', - $object_types, - array( - 'label' => __( 'Files', 'wp-parser' ), - 'public' => true, - 'rewrite' => array( 'slug' => 'files' ), - 'sort' => false, - 'update_count_callback' => '_update_post_term_count', - ) - ); - } - - if ( ! taxonomy_exists( 'wp-parser-package' ) ) { - - register_taxonomy( - 'wp-parser-package', - $object_types, - array( - 'hierarchical' => true, - 'label' => '@package', - 'public' => true, - 'rewrite' => array( 'slug' => 'package' ), - 'sort' => false, - 'update_count_callback' => '_update_post_term_count', - ) - ); - } - - if ( ! taxonomy_exists( 'wp-parser-since' ) ) { - - register_taxonomy( - 'wp-parser-since', - $object_types, - array( - 'hierarchical' => true, - 'label' => __( '@since', 'wp-parser' ), - 'public' => true, - 'rewrite' => array( 'slug' => 'since' ), - 'sort' => false, - 'update_count_callback' => '_update_post_term_count', - ) - ); - } - - if ( ! taxonomy_exists( 'wp-parser-namespace' ) ) { - - register_taxonomy( - 'wp-parser-namespace', - $object_types, - array( - 'hierarchical' => true, - 'label' => __( 'Namespaces', 'wp-parser' ), - 'public' => true, - 'rewrite' => array( 'slug' => 'namespace' ), - 'sort' => false, - 'update_count_callback' => '_update_post_term_count', - ) - ); - } - } - - /** - * @param string $link - * @param \WP_Post $post - * - * @return string|void - */ - public function method_permalink( $link, $post ) { - - if ( 'wp-parser-method' !== $post->post_type || 0 == $post->post_parent ) { - return $link; - } - - list( $class, $method ) = explode( '-', $post->post_name ); - $link = home_url( user_trailingslashit( "method/$class/$method" ) ); - - return $link; - } - - /** - * Raw phpDoc could potentially introduce unsafe markup into the HTML, so we sanitise it here. - * - * @param array $args Parameter arguments to make safe - * - * @return array - */ - public function make_args_safe( $args ) { - - array_walk_recursive( $args, array( $this, 'sanitize_argument' ) ); - - return apply_filters( 'wp_parser_make_args_safe', $args ); - } - - /** - * @param mixed $value - * - * @return mixed - */ - public function sanitize_argument( &$value ) { - - static $filters = array( - 'wp_filter_kses', - 'make_clickable', - 'force_balance_tags', - 'wptexturize', - 'convert_smilies', - 'convert_chars', - 'stripslashes_deep', - ); - - foreach ( $filters as $filter ) { - $value = call_user_func( $filter, $value ); - } - - return $value; - } - - /** - * Replace separators with a more readable version - * - * @param string $type Variable type - * - * @return string - */ - public function humanize_separator( $type ) { - return str_replace( '|', '' . _x( ' or ', 'separator', 'wp-parser' ) . '', $type ); - } +class Plugin +{ + const SOURCE_TYPE_TAX_SLUG = 'wp-parser-source-type'; + + /** + * @var \WP_Parser\Relationships + */ + public $relationships; + + public function on_load() { + if (defined('WP_CLI') && WP_CLI) { + \WP_CLI::add_command('parser', __NAMESPACE__ . '\\Command'); + } + + $this->relationships = new Relationships(); + + add_action('init', [$this, 'register_post_types'], 11); + add_action('init', [$this, 'register_taxonomies'], 11); + add_filter('wp_parser_get_arguments', [$this, 'make_args_safe']); + add_filter('wp_parser_return_type', [$this, 'humanize_separator']); + + add_filter('post_type_link', [$this, 'method_permalink'], 10, 2); + } + + /** + * Register the function and class post types + */ + public function register_post_types() { + $supports = [ + 'comments', + 'custom-fields', + 'editor', + 'excerpt', + 'revisions', + 'title', + ]; + + if (!post_type_exists('wp-parser-function')) { + register_post_type( + 'wp-parser-function', + [ + 'has_archive' => 'functions', + 'label' => __('Functions', 'wp-parser'), + 'public' => true, + 'rewrite' => [ + 'feeds' => false, + 'slug' => 'function', + 'with_front' => false, + ], + 'supports' => $supports, + ] + ); + } + + if (!post_type_exists('wp-parser-method')) { + add_rewrite_rule('method/([^/]+)/([^/]+)/?$', 'index.php?post_type=wp-parser-method&name=$matches[1]-$matches[2]', 'top'); + + register_post_type( + 'wp-parser-method', + [ + 'has_archive' => 'methods', + 'label' => __('Methods', 'wp-parser'), + 'public' => true, + 'rewrite' => [ + 'feeds' => false, + 'slug' => 'method', + 'with_front' => false, + ], + 'supports' => $supports, + ] + ); + } + + if (!post_type_exists('wp-parser-class')) { + register_post_type( + 'wp-parser-class', + [ + 'has_archive' => 'classes', + 'label' => __('Classes', 'wp-parser'), + 'public' => true, + 'rewrite' => [ + 'feeds' => false, + 'slug' => 'class', + 'with_front' => false, + ], + 'supports' => $supports, + ] + ); + } + + if (!post_type_exists('wp-parser-hook')) { + register_post_type( + 'wp-parser-hook', + [ + 'has_archive' => 'hooks', + 'label' => __('Hooks', 'wp-parser'), + 'public' => true, + 'rewrite' => [ + 'feeds' => false, + 'slug' => 'hook', + 'with_front' => false, + ], + 'supports' => $supports, + ] + ); + } + } + + /** + * Register the file and @since taxonomies + */ + public function register_taxonomies() { + $object_types = [ + 'wp-parser-class', + 'wp-parser-method', + 'wp-parser-function', + 'wp-parser-hook', + ]; + + if (!taxonomy_exists('wp-parser-source-file')) { + register_taxonomy( + 'wp-parser-source-file', + $object_types, + [ + 'label' => __('Files', 'wp-parser'), + 'public' => true, + 'rewrite' => ['slug' => 'files'], + 'sort' => false, + 'update_count_callback' => '_update_post_term_count', + ] + ); + } + + if (!taxonomy_exists('wp-parser-package')) { + register_taxonomy( + 'wp-parser-package', + $object_types, + [ + 'hierarchical' => true, + 'label' => '@package', + 'public' => true, + 'rewrite' => ['slug' => 'package'], + 'sort' => false, + 'update_count_callback' => '_update_post_term_count', + ] + ); + } + + if (!taxonomy_exists('wp-parser-since')) { + register_taxonomy( + 'wp-parser-since', + $object_types, + [ + 'hierarchical' => true, + 'label' => __('@since', 'wp-parser'), + 'public' => true, + 'rewrite' => ['slug' => 'since'], + 'sort' => false, + 'update_count_callback' => '_update_post_term_count', + ] + ); + } + + if (!taxonomy_exists('wp-parser-namespace')) { + register_taxonomy( + 'wp-parser-namespace', + $object_types, + [ + 'hierarchical' => true, + 'label' => __('Namespaces', 'wp-parser'), + 'public' => true, + 'rewrite' => ['slug' => 'namespace'], + 'sort' => false, + 'update_count_callback' => '_update_post_term_count', + ] + ); + } + + if (!taxonomy_exists(self::SOURCE_TYPE_TAX_SLUG)) { + register_taxonomy( + self::SOURCE_TYPE_TAX_SLUG, + $object_types, + [ + 'hierarchical' => true, + 'label' => __('Source Type', 'wp-parser'), + 'public' => true, + 'rewrite' => ['slug' => 'source-type'], + 'sort' => false, + 'update_count_callback' => '_update_post_term_count', + ] + ); + } + + if (!term_exists('plugin', self::SOURCE_TYPE_TAX_SLUG)) { + wp_insert_term( + __('Plugin', 'wp-parser'), + self::SOURCE_TYPE_TAX_SLUG, + ['slug' => 'plugin'] + ); + } + + if (!term_exists('theme', self::SOURCE_TYPE_TAX_SLUG)) { + wp_insert_term( + __('Theme', 'wp-parser'), + self::SOURCE_TYPE_TAX_SLUG, + ['slug' => 'theme'] + ); + } + + if (!term_exists('composer-package', self::SOURCE_TYPE_TAX_SLUG)) { + wp_insert_term( + __('Composer Package', 'wp-parser'), + self::SOURCE_TYPE_TAX_SLUG, + ['slug' => 'composer-package'] + ); + } + } + + /** + * @param string $link + * @param \WP_Post $post + * + * @return string|void + */ + public function method_permalink($link, $post) { + if ('wp-parser-method' !== $post->post_type || 0 == $post->post_parent) { + return $link; + } + + list( $class, $method ) = explode('-', $post->post_name); + $link = home_url(user_trailingslashit("method/$class/$method")); + + return $link; + } + + /** + * Raw phpDoc could potentially introduce unsafe markup into the HTML, so we sanitise it here. + * + * @param array $args Parameter arguments to make safe + * + * @return array + */ + public function make_args_safe($args) { + array_walk_recursive($args, [$this, 'sanitize_argument']); + + return apply_filters('wp_parser_make_args_safe', $args); + } + + /** + * @param mixed $value + * + * @return mixed + */ + public function sanitize_argument(&$value) { + static $filters = [ + 'wp_filter_kses', + 'make_clickable', + 'force_balance_tags', + 'wptexturize', + 'convert_smilies', + 'convert_chars', + 'stripslashes_deep', + ]; + + foreach ($filters as $filter) { + $value = call_user_func($filter, $value); + } + + return $value; + } + + /** + * Replace separators with a more readable version + * + * @param string $type Variable type + * + * @return string + */ + public function humanize_separator($type) { + return str_replace('|', '' . _x(' or ', 'separator', 'wp-parser') . '', $type); + } } diff --git a/lib/class-relationships.php b/lib/class-relationships.php index ad29e18..77c61a5 100644 --- a/lib/class-relationships.php +++ b/lib/class-relationships.php @@ -126,17 +126,15 @@ public function register_post_relationships() { * Runs at import start. */ public function wp_parser_starting_import() { - $importer = new Importer; - if ( ! $this->p2p_tables_exist() ) { \P2P_Storage::init(); \P2P_Storage::install(); } $this->post_types = array( - 'hook' => $importer->post_type_hook, - 'method' => $importer->post_type_method, - 'function' => $importer->post_type_function, + 'hook' => Importer::PROPERTY_MAP['post_type_hook'], + 'method' => Importer::PROPERTY_MAP['post_type_method'], + 'function' => Importer::PROPERTY_MAP['post_type_function'], ); } diff --git a/lib/template-functions.php b/lib/template-functions.php new file mode 100644 index 0000000..be1749c --- /dev/null +++ b/lib/template-functions.php @@ -0,0 +1,11 @@ + + * @return string + */ +function avcpdp_get_source_type_taxonomy_slug() { + return WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG; +} diff --git a/plugin.php b/plugin.php index ac76e79..216176b 100644 --- a/plugin.php +++ b/plugin.php @@ -1,7 +1,8 @@ on_load(); -register_activation_hook( __FILE__, array( 'P2P_Storage', 'init' ) ); -register_activation_hook( __FILE__, array( 'P2P_Storage', 'install' ) ); +add_filter('wp_parser_exclude_directories', function () { + return ['vendor', 'dist', 'tests', 'semantic', 'node_modules']; +}); + +add_filter('wp_parser_exclude_directories_strict', function () { + return true; +}); + +register_activation_hook(__FILE__, ['P2P_Storage', 'init']); +register_activation_hook(__FILE__, ['P2P_Storage', 'install']); // TODO safer handling for uninstall -//register_uninstall_hook( __FILE__, array( 'P2P_Storage', 'uninstall' ) ); +// register_uninstall_hook( __FILE__, array( 'P2P_Storage', 'uninstall' ) ); From a405a5502b3459310905d053d9e6a265b798002d Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Fri, 20 Aug 2021 12:45:32 +0900 Subject: [PATCH 03/66] fix: delete p2p relationships on a per-plugin/theme/package basis on import finish. Save source root dir on a per-plugin/theme/package basis --- composer.json | 75 +-- lib/class-importer.php | 7 +- lib/class-relationships.php | 889 +++++++++++++++++++----------------- plugin.php | 3 - 4 files changed, 513 insertions(+), 461 deletions(-) diff --git a/composer.json b/composer.json index 6e2b6c0..1c4e007 100644 --- a/composer.json +++ b/composer.json @@ -1,35 +1,44 @@ { - "name" : "wordpress/phpdoc-parser", - "description": "Static code parser for WordPress source.", - "keywords" : ["wordpress"], - "type" : "wordpress-plugin", - "homepage" : "https://github.com/WordPress/phpdoc-parser", - "license" : "GPL-2.0-or-later", - "authors" : [ - { - "name" : "Ryan McCue", - "homepage": "http://ryanmccue.info", - "role" : "Developer" - }, - { - "name" : "Contributors", - "homepage": "https://github.com/WordPress/phpdoc-parser/graphs/contributors" - } - ], - "support" : { - "issues": "https://github.com/WordPress/phpdoc-parser/issues" - }, - "require" : { - "php" : ">=5.4", - "composer/installers" : "~1.0", - "phpdocumentor/reflection" : "~3.0", - "erusev/parsedown" : "~1.7", - "scribu/lib-posts-to-posts": "dev-master@dev", - "scribu/scb-framework" : "dev-master@dev", - "psr/log" : "~1.0" - }, - "autoload" : { - "classmap": ["lib"], - "files" : ["lib/runner.php", "lib/template.php"] - } + "name": "wordpress/phpdoc-parser", + "description": "Static code parser for WordPress source.", + "keywords": [ + "wordpress" + ], + "type": "wordpress-plugin", + "homepage": "https://github.com/WordPress/phpdoc-parser", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Ryan McCue", + "homepage": "http://ryanmccue.info", + "role": "Developer" + }, + { + "name": "Contributors", + "homepage": "https://github.com/WordPress/phpdoc-parser/graphs/contributors" + } + ], + "support": { + "issues": "https://github.com/WordPress/phpdoc-parser/issues" + }, + "require": { + "php": ">=5.4", + "composer/installers": "~1.0", + "phpdocumentor/reflection": "~3.0", + "erusev/parsedown": "~1.7", + "scribu/lib-posts-to-posts": "dev-master@dev", + "scribu/scb-framework": "dev-master@dev", + "psr/log": "~1.0" + }, + "autoload": { + "classmap": [ + "lib" + ], + "files": [ + "lib/runner.php", + "lib/template.php", + "lib/api-functions.php", + "lib/template-functions.php" + ] + } } diff --git a/lib/class-importer.php b/lib/class-importer.php index dc18e51..673c40f 100644 --- a/lib/class-importer.php +++ b/lib/class-importer.php @@ -258,6 +258,11 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio if (!empty($root)) { update_option('wp_parser_root_import_dir', $root); + update_term_meta( + $this->source_type_meta['type_term_id'], + 'wp_parser_root_import_dir', + $root + ); $this->logger->info('Updated option wp_parser_root_import_dir: ' . $root); } @@ -284,7 +289,7 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio /* * Action at the end of a complete import */ - do_action('wp_parser_ending_import'); + do_action('wp_parser_ending_import', $this); // Start counting again wp_defer_term_counting(false); diff --git a/lib/class-relationships.php b/lib/class-relationships.php index 77c61a5..c228c6c 100644 --- a/lib/class-relationships.php +++ b/lib/class-relationships.php @@ -7,428 +7,469 @@ /** * Registers and implements relationships with Posts 2 Posts. */ -class Relationships { - - /** - * @var array Post types we're setting relationships between - */ - public $post_types; - - /** - * @var array Map of post slugs to post ids. - */ - public $slugs_to_ids = array(); - - /** - * Map of how post IDs relate to one another. - * - * array( - * $from_type => array( - * $from_id => array( - * $to_type => array( - * $to_slug => $to_id - * ) - * ) - * ) - * ) - * - * @var array - */ - public $relationships = array(); - - /** - * Adds the actions. - */ - public function __construct() { - add_action( 'plugins_loaded', array( $this, 'require_posts_to_posts' ) ); - add_action( 'wp_loaded', array( $this, 'register_post_relationships' ) ); - - add_action( 'wp_parser_import_item', array( $this, 'import_item' ), 10, 3 ); - add_action( 'wp_parser_starting_import', array( $this, 'wp_parser_starting_import' ) ); - add_action( 'wp_parser_ending_import', array( $this, 'wp_parser_ending_import' ) ); - } - - /** - * Load the posts2posts from the composer package if it is not loaded already. - */ - public function require_posts_to_posts() { - // Initializes the database tables - \P2P_Storage::init(); - - // Initializes the query mechanism - \P2P_Query_Post::init(); - } - - /** - * Set up relationships using Posts to Posts plugin. - * - * Default settings for p2p_register_connection_type: - * 'cardinality' => 'many-to-many' - * 'reciprocal' => false - * - * @link https://github.com/scribu/wp-posts-to-posts/wiki/p2p_register_connection_type - */ - public function register_post_relationships() { - - /* - * Functions to functions, methods and hooks - */ - p2p_register_connection_type( array( - 'name' => 'functions_to_functions', - 'from' => 'wp-parser-function', - 'to' => 'wp-parser-function', - 'self_connections' => 'true', - 'title' => array( 'from' => 'Uses Functions', 'to' => 'Used by Functions' ), - ) ); - - p2p_register_connection_type( array( - 'name' => 'functions_to_methods', - 'from' => 'wp-parser-function', - 'to' => 'wp-parser-method', - 'title' => array( 'from' => 'Uses Methods', 'to' => 'Used by Functions' ), - ) ); - - p2p_register_connection_type( array( - 'name' => 'functions_to_hooks', - 'from' => 'wp-parser-function', - 'to' => 'wp-parser-hook', - 'title' => array( 'from' => 'Uses Hooks', 'to' => 'Used by Functions' ), - ) ); - - /* - * Methods to functions, methods and hooks - */ - p2p_register_connection_type( array( - 'name' => 'methods_to_functions', - 'from' => 'wp-parser-method', - 'to' => 'wp-parser-function', - 'title' => array( 'from' => 'Uses Functions', 'to' => 'Used by Methods' ), - ) ); - - p2p_register_connection_type( array( - 'name' => 'methods_to_methods', - 'from' => 'wp-parser-method', - 'to' => 'wp-parser-method', - 'self_connections' => 'true', - 'title' => array( 'from' => 'Uses Methods', 'to' => 'Used by Methods' ), - ) ); - - p2p_register_connection_type( array( - 'name' => 'methods_to_hooks', - 'from' => 'wp-parser-method', - 'to' => 'wp-parser-hook', - 'title' => array( 'from' => 'Used by Methods', 'to' => 'Uses Hooks' ), - ) ); - } - - /** - * Bring Importer post types into this class. - * Runs at import start. - */ - public function wp_parser_starting_import() { - if ( ! $this->p2p_tables_exist() ) { - \P2P_Storage::init(); - \P2P_Storage::install(); - } - - $this->post_types = array( - 'hook' => Importer::PROPERTY_MAP['post_type_hook'], - 'method' => Importer::PROPERTY_MAP['post_type_method'], - 'function' => Importer::PROPERTY_MAP['post_type_function'], - ); - } - - /** - * Checks to see if the posts to posts tables exist and returns if they do - * - * @return bool Whether or not the posts 2 posts tables exist. - */ - public function p2p_tables_exist() { - global $wpdb; - - $tables = $wpdb->get_col( 'SHOW TABLES' ); - - // There is no way to get the name out of P2P so we hard code it here. - return in_array( $wpdb->prefix . 'p2p', $tables ); - } - - /** - * As each item imports, build an array mapping it's post_type->slug to it's post ID. - * These will be used to associate post IDs to each other without doing an additional - * database query to map each post's slug to its ID. - * - * @param int $post_id Post ID of item just imported. - * @param array $data Parser data - * @param array $post_data Post data - */ - public function import_item( $post_id, $data, $post_data ) { - - $from_type = $post_data['post_type']; - $slug = $post_data['post_name']; - - $this->slugs_to_ids[ $from_type ][ $slug ] = $post_id; - - // Build Relationships: Functions - if ( $this->post_types['function'] == $from_type ) { - - // Functions to Functions - $to_type = $this->post_types['function']; - foreach ( (array) @$data['uses']['functions'] as $to_function ) { - $to_function_slug = $this->names_to_slugs( $to_function['name'], $data['namespace'] ); - - $this->relationships[ $from_type ][ $post_id ][ $to_type ][] = $to_function_slug; - } - - // Functions to Methods - $to_type = $this->post_types['method']; - foreach ( (array) @$data['uses']['methods'] as $to_method ) { - - if ( $to_method['static'] || ! empty( $to_method['class'] ) ) { - $to_method_slug = $to_method['class'] . '-' . $to_method['name']; - } else { - $to_method_slug = $to_method['name']; - } - $to_method_slug = $this->names_to_slugs( $to_method_slug, $data['namespace'] ); - - $this->relationships[ $from_type ][ $post_id ][ $to_type ][] = $to_method_slug; - } - - // Functions to Hooks - $to_type = $this->post_types['hook']; - foreach ( (array) @$data['hooks'] as $to_hook ) { - // Never a namespace on a hook so don't send one. - $to_hook_slug = $this->names_to_slugs( $to_hook['name'] ); - - $this->relationships[ $from_type ][ $post_id ][ $to_type ][] = $to_hook_slug; - } - } - - if ( $this->post_types['method'] === $from_type ) { - - // Methods to Functions - $to_type = $this->post_types['function']; - foreach ( (array) @$data['uses']['functions'] as $to_function ) { - $to_function_slug = $this->names_to_slugs( $to_function['name'], $data['namespace'] ); - - $this->relationships[ $from_type ][ $post_id ][ $to_type ][] = $to_function_slug; - } - - // Methods to Methods - $to_type = $this->post_types['method']; - foreach ( (array) @$data['uses']['methods'] as $to_method ) { - - if ( ! is_string( $to_method['name'] ) ) { // might contain variable node for dynamic method calls - continue; - } - - if ( $to_method['static'] || ! empty( $to_method['class'] ) ) { - $to_method_slug = $to_method['class'] . '-' . $to_method['name']; - } else { - $to_method_slug = $to_method['name']; - } - $to_method_slug = $this->names_to_slugs( $to_method_slug, $data['namespace'] ); - - $this->relationships[ $from_type ][ $post_id ][ $to_type ][] = $to_method_slug; - } - - // Methods to Hooks - $to_type = $this->post_types['hook']; - foreach ( (array) @$data['hooks'] as $to_hook ) { - $to_hook_slug = $this->names_to_slugs( $to_hook['name'] ); - - $this->relationships[ $from_type ][ $post_id ][ $to_type ][] = $to_hook_slug; - } - } - - } - - /** - * After import has run, go back and connect all the posts. - */ - public function wp_parser_ending_import() { - - if ( defined( 'WP_CLI' ) && WP_CLI ) { - WP_CLI::log( 'Removing current relationships...' ); - } - - p2p_delete_connections( 'functions_to_functions' ); - p2p_delete_connections( 'functions_to_methods' ); - p2p_delete_connections( 'functions_to_hooks' ); - p2p_delete_connections( 'methods_to_functions' ); - p2p_delete_connections( 'methods_to_methods' ); - p2p_delete_connections( 'methods_to_hooks' ); - - if ( defined( 'WP_CLI' ) && WP_CLI ) { - WP_CLI::log( 'Setting up relationships...' ); - } - - // Iterate over post types being related FROM: functions, methods, and hooks - foreach ( $this->post_types as $from_type ) { - // Iterate over relationships for each post type - foreach ( (array) @$this->relationships[ $from_type ] as $from_id => $to_types ) { - - // Iterate over slugs for each post type being related TO - foreach ( $to_types as $to_type => $to_slugs ) { - - // Convert slugs to IDs. - if ( empty( $this->slugs_to_ids[ $to_type ] ) ) { // TODO why might this be empty? test class-IXR.php - continue; - } - - $this->relationships[ $from_type ][ $from_id ][ $to_type ] = $this->get_ids_for_slugs( $to_slugs, $this->slugs_to_ids[ $to_type ] ); - } - } - } - - // Repeat loop over post_types and relationships now that all slugs have been mapped to IDs - foreach ( $this->post_types as $from_type ) { - foreach ( (array) @$this->relationships[ $from_type ] as $from_id => $to_types ) { - - // Connect Functions - if ( $from_type == $this->post_types['function'] ) { - - foreach ( $to_types as $to_type => $to_slugs ) { - // ...to Functions - if ( $this->post_types['function'] == $to_type ) { - foreach ( $to_slugs as $to_slug => $to_id ) { - $to_id = intval( $to_id, 10 ); - if ( 0 != $to_id ) { - p2p_type( 'functions_to_functions' )->connect( $from_id, $to_id, array( 'date' => current_time( 'mysql' ) ) ); - } - } - } - // ...to Methods - if ( $this->post_types['method'] == $to_type ) { - foreach ( $to_slugs as $to_slug => $to_id ) { - $to_id = intval( $to_id, 10 ); - if ( 0 != $to_id ) { - p2p_type( 'functions_to_methods' )->connect( $from_id, $to_id, array( 'date' => current_time( 'mysql' ) ) ); - } - } - } - // ...to Hooks - if ( $this->post_types['hook'] == $to_type ) { - foreach ( $to_slugs as $to_slug => $to_id ) { - $to_id = intval( $to_id, 10 ); - if ( 0 != $to_id ) { - p2p_type( 'functions_to_hooks' )->connect( $from_id, $to_id, array( 'date' => current_time( 'mysql' ) ) ); - } - } - } - } - } - - // Connect Methods - if ( $from_type === $this->post_types['method'] ) { - - foreach ( $to_types as $to_type => $to_slugs ) { - - // ...to Functions - if ( $this->post_types['function'] === $to_type ) { - foreach ( $to_slugs as $to_slug => $to_id ) { - $to_id = intval( $to_id, 10 ); - if ( 0 != $to_id ) { - p2p_type( 'methods_to_functions' )->connect( $from_id, $to_id, array( 'data' => current_time( 'mysql' ) ) ); - } - } - } - - // ...to Methods - if ( $this->post_types['method'] === $to_type ) { - foreach ( $to_slugs as $to_slug => $to_id ) { - $to_id = intval( $to_id, 10 ); - if ( 0 != $to_id ) { - p2p_type( 'methods_to_methods' )->connect( $from_id, $to_id, array( 'data' => current_time( 'mysql' ) ) ); - } - } - } - - // ...to Hooks - if ( $this->post_types['hook'] === $to_type ) { - foreach ( $to_slugs as $to_slug => $to_id ) { - $to_id = intval( $to_id, 10 ); - if ( 0 != $to_id ) { - p2p_type( 'methods_to_hooks' )->connect( $from_id, $to_id, array( 'data' => current_time( 'mysql' ) ) ); - } - } - } - } - } - } - } - - } - - /** - * Map a name to slug, taking into account namespace context. - * - * When a function is called within a namespace, the function is first looked - * for in the current namespace. If it exists, the namespaced version is used. - * If the function does not exist in the current namespace, PHP tries to find - * the function in the global scope. - * - * Unless the call has been prefixed with '\' indicating it is fully qualified - * we need to check first in the current namespace and then in the global - * scope. - * - * This also catches the case where relative namespaces are used. You can - * create a file in namespace `\Foo` and then call a funtion called `baz` in - * namespace `\Foo\Bar\` by just calling `Bar\baz()`. PHP will first look - * for `\Foo\Bar\baz()` and if it can't find it fall back to `\Bar\baz()`. - * - * @see WP_Parser\Importer::import_item() - * @param string $name The name of the item a slug is needed for. - * @param string $namespace The namespace the item is in when for context. - * @return array An array of slugs, starting with the context of the - * namespace, and falling back to the global namespace. - */ - public function names_to_slugs( $name, $namespace = null ) { - $fully_qualified = ( 0 === strpos( '\\', $name ) ); - $name = ltrim( $name, '\\' ); - $names = array(); - - if ( $namespace && ! $fully_qualified ) { - $names[] = $this->name_to_slug( $namespace . '\\' . $name ); - } - $names[] = $this->name_to_slug( $name ); - - return $names; - } - - /** - * Simple conversion of a method, function, or hook name to a post slug. - * - * Replaces '::' and '\' to dashes and then runs the name through `sanitize_title()`. - * - * @param string $name Method, function, or hook name - * @return string The post slug for the passed name. - */ - public function name_to_slug( $name ) { - return sanitize_title( str_replace( '\\', '-', str_replace( '::', '-', $name ) ) ); - } - - /** - * Convert a post slug to an array( 'slug' => id ) - * Ignores slugs that are not found in $slugs_to_ids - * - * @param array $slugs Array of post slugs. - * @param array $slugs_to_ids Map of slugs to IDs. - * @return array - */ - public function get_ids_for_slugs( array $slugs, array $slugs_to_ids ) { - $slugs_with_ids = array(); - - foreach ( $slugs as $index => $scoped_slugs ) { - // Find the first matching scope the ID exists for. - foreach ( $scoped_slugs as $slug ) { - if ( array_key_exists( $slug, $slugs_to_ids ) ) { - $slugs_with_ids[ $slug ] = $slugs_to_ids[ $slug ]; - // if we found it in this scope, stop searching the chain. - continue; - } - } - } - - return $slugs_with_ids; - } +class Relationships +{ + /** + * @var array Post types we're setting relationships between + */ + public $post_types; + + /** + * @var array Map of post slugs to post ids. + */ + public $slugs_to_ids = []; + + /** + * Map of how post IDs relate to one another. + * + * array( + * $from_type => array( + * $from_id => array( + * $to_type => array( + * $to_slug => $to_id + * ) + * ) + * ) + * ) + * + * @var array + */ + public $relationships = []; + + /** + * Adds the actions. + */ + public function __construct() { + add_action('plugins_loaded', [$this, 'require_posts_to_posts']); + add_action('wp_loaded', [$this, 'register_post_relationships']); + + add_action('wp_parser_import_item', [$this, 'import_item'], 10, 3); + add_action('wp_parser_starting_import', [$this, 'wp_parser_starting_import']); + add_action('wp_parser_ending_import', [$this, 'wp_parser_ending_import'], 10, 1); + } + + /** + * Load the posts2posts from the composer package if it is not loaded already. + */ + public function require_posts_to_posts() { + // Initializes the database tables + \P2P_Storage::init(); + + // Initializes the query mechanism + \P2P_Query_Post::init(); + } + + /** + * Set up relationships using Posts to Posts plugin. + * + * Default settings for p2p_register_connection_type: + * 'cardinality' => 'many-to-many' + * 'reciprocal' => false + * + * @link https://github.com/scribu/wp-posts-to-posts/wiki/p2p_register_connection_type + */ + public function register_post_relationships() { + /* + * Functions to functions, methods and hooks + */ + p2p_register_connection_type([ + 'name' => 'functions_to_functions', + 'from' => 'wp-parser-function', + 'to' => 'wp-parser-function', + 'self_connections' => 'true', + 'title' => [ + 'from' => 'Uses Functions', + 'to' => 'Used by Functions', + ], + ]); + + p2p_register_connection_type([ + 'name' => 'functions_to_methods', + 'from' => 'wp-parser-function', + 'to' => 'wp-parser-method', + 'title' => [ + 'from' => 'Uses Methods', + 'to' => 'Used by Functions', + ], + ]); + + p2p_register_connection_type([ + 'name' => 'functions_to_hooks', + 'from' => 'wp-parser-function', + 'to' => 'wp-parser-hook', + 'title' => [ + 'from' => 'Uses Hooks', + 'to' => 'Used by Functions', + ], + ]); + + /* + * Methods to functions, methods and hooks + */ + p2p_register_connection_type([ + 'name' => 'methods_to_functions', + 'from' => 'wp-parser-method', + 'to' => 'wp-parser-function', + 'title' => [ + 'from' => 'Uses Functions', + 'to' => 'Used by Methods', + ], + ]); + + p2p_register_connection_type([ + 'name' => 'methods_to_methods', + 'from' => 'wp-parser-method', + 'to' => 'wp-parser-method', + 'self_connections' => 'true', + 'title' => [ + 'from' => 'Uses Methods', + 'to' => 'Used by Methods', + ], + ]); + + p2p_register_connection_type([ + 'name' => 'methods_to_hooks', + 'from' => 'wp-parser-method', + 'to' => 'wp-parser-hook', + 'title' => [ + 'from' => 'Used by Methods', + 'to' => 'Uses Hooks', + ], + ]); + } + + /** + * Bring Importer post types into this class. + * Runs at import start. + */ + public function wp_parser_starting_import() { + if (!$this->p2p_tables_exist()) { + \P2P_Storage::init(); + \P2P_Storage::install(); + } + + $this->post_types = [ + 'hook' => Importer::PROPERTY_MAP['post_type_hook'], + 'method' => Importer::PROPERTY_MAP['post_type_method'], + 'function' => Importer::PROPERTY_MAP['post_type_function'], + ]; + } + + /** + * Checks to see if the posts to posts tables exist and returns if they do + * + * @return bool Whether or not the posts 2 posts tables exist. + */ + public function p2p_tables_exist() { + global $wpdb; + + $tables = $wpdb->get_col('SHOW TABLES'); + + // There is no way to get the name out of P2P so we hard code it here. + return in_array($wpdb->prefix . 'p2p', $tables); + } + + /** + * As each item imports, build an array mapping it's post_type->slug to it's post ID. + * These will be used to associate post IDs to each other without doing an additional + * database query to map each post's slug to its ID. + * + * @param int $post_id Post ID of item just imported. + * @param array $data Parser data + * @param array $post_data Post data + */ + public function import_item($post_id, $data, $post_data) { + $from_type = $post_data['post_type']; + $slug = $post_data['post_name']; + + $this->slugs_to_ids[$from_type][$slug] = $post_id; + + // Build Relationships: Functions + if ($this->post_types['function'] == $from_type) { + // Functions to Functions + $to_type = $this->post_types['function']; + foreach ((array)@$data['uses']['functions'] as $to_function) { + $to_function_slug = $this->names_to_slugs($to_function['name'], $data['namespace']); + + $this->relationships[$from_type][$post_id][$to_type][] = $to_function_slug; + } + + // Functions to Methods + $to_type = $this->post_types['method']; + foreach ((array)@$data['uses']['methods'] as $to_method) { + if ($to_method['static'] || !empty($to_method['class'])) { + $to_method_slug = $to_method['class'] . '-' . $to_method['name']; + } else { + $to_method_slug = $to_method['name']; + } + $to_method_slug = $this->names_to_slugs($to_method_slug, $data['namespace']); + + $this->relationships[$from_type][$post_id][$to_type][] = $to_method_slug; + } + + // Functions to Hooks + $to_type = $this->post_types['hook']; + foreach ((array)@$data['hooks'] as $to_hook) { + // Never a namespace on a hook so don't send one. + $to_hook_slug = $this->names_to_slugs($to_hook['name']); + + $this->relationships[$from_type][$post_id][$to_type][] = $to_hook_slug; + } + } + + if ($this->post_types['method'] === $from_type) { + // Methods to Functions + $to_type = $this->post_types['function']; + foreach ((array)@$data['uses']['functions'] as $to_function) { + $to_function_slug = $this->names_to_slugs($to_function['name'], $data['namespace']); + + $this->relationships[$from_type][$post_id][$to_type][] = $to_function_slug; + } + + // Methods to Methods + $to_type = $this->post_types['method']; + foreach ((array)@$data['uses']['methods'] as $to_method) { + if (!is_string($to_method['name'])) { // might contain variable node for dynamic method calls + continue; + } + + if ($to_method['static'] || !empty($to_method['class'])) { + $to_method_slug = $to_method['class'] . '-' . $to_method['name']; + } else { + $to_method_slug = $to_method['name']; + } + $to_method_slug = $this->names_to_slugs($to_method_slug, $data['namespace']); + + $this->relationships[$from_type][$post_id][$to_type][] = $to_method_slug; + } + + // Methods to Hooks + $to_type = $this->post_types['hook']; + foreach ((array)@$data['hooks'] as $to_hook) { + $to_hook_slug = $this->names_to_slugs($to_hook['name']); + + $this->relationships[$from_type][$post_id][$to_type][] = $to_hook_slug; + } + } + } + + /** + * After import has run, go back and connect all the posts. + */ + public function wp_parser_ending_import(Importer $importer) { + global $wpdb; + + if (defined('WP_CLI') && WP_CLI) { + WP_CLI::log('Removing current relationships...'); + } + + /** + * The following lines delete connections for ALL sources which + * is why we delete with a custom query below. + */ + // p2p_delete_connections('functions_to_functions'); + // p2p_delete_connections('functions_to_methods'); + // p2p_delete_connections('functions_to_hooks'); + // p2p_delete_connections('methods_to_functions'); + // p2p_delete_connections('methods_to_methods'); + // p2p_delete_connections('methods_to_hooks'); + + $wtr = $wpdb->prefix . 'term_relationships'; + $wtt = $wpdb->prefix . 'term_taxonomy'; + $wt = $wpdb->prefix . 'terms'; + $p2p = $wpdb->prefix . 'p2p'; + $p2p_meta = $wpdb->prefix . 'p2pmeta'; + foreach ( + [ + 'functions_to_functions', + 'functions_to_methods', + 'functions_to_hooks', + 'methods_to_functions', + 'methods_to_methods', + 'methods_to_hooks', + ] as $p2p_type + ) { + $res = $wpdb->query( + $wpdb->prepare( + "DELETE p2p, p2p_meta FROM {$p2p} p2p + INNER JOIN {$wtr} wtr ON wtr.object_id = p2p.p2p_from + INNER JOIN {$wtt} wtt ON wtt.term_taxonomy_id = wtr.term_taxonomy_id + INNER JOIN {$wt} wt ON wt.term_id = wtt.term_id + LEFT JOIN {$p2p_meta} p2p_meta ON p2p_meta.p2p_id = p2p.p2p_id + WHERE wt.slug = %s + AND wtt.parent = %d + AND p2p.p2p_type = %s", + $importer->source_type_meta['name'], + $importer->source_type_meta['type_parent_term_id'], + $p2p_type + ) + ); + } + + if (defined('WP_CLI') && WP_CLI) { + WP_CLI::log('Setting up relationships...'); + } + + // Iterate over post types being related FROM: functions, methods, and hooks + foreach ($this->post_types as $from_type) { + // Iterate over relationships for each post type + foreach ((array)@$this->relationships[$from_type] as $from_id => $to_types) { + // Iterate over slugs for each post type being related TO + foreach ($to_types as $to_type => $to_slugs) { + // Convert slugs to IDs. + if (empty($this->slugs_to_ids[$to_type])) { // TODO why might this be empty? test class-IXR.php + continue; + } + + $this->relationships[$from_type][$from_id][$to_type] = $this->get_ids_for_slugs($to_slugs, $this->slugs_to_ids[$to_type]); + } + } + } + + // Repeat loop over post_types and relationships now that all slugs have been mapped to IDs + foreach ($this->post_types as $from_type) { + foreach ((array)@$this->relationships[$from_type] as $from_id => $to_types) { + // Connect Functions + if ($from_type == $this->post_types['function']) { + foreach ($to_types as $to_type => $to_slugs) { + // ...to Functions + if ($this->post_types['function'] == $to_type) { + foreach ($to_slugs as $to_slug => $to_id) { + $to_id = intval($to_id, 10); + if (0 != $to_id) { + p2p_type('functions_to_functions')->connect($from_id, $to_id, ['date' => current_time('mysql')]); + } + } + } + // ...to Methods + if ($this->post_types['method'] == $to_type) { + foreach ($to_slugs as $to_slug => $to_id) { + $to_id = intval($to_id, 10); + if (0 != $to_id) { + p2p_type('functions_to_methods')->connect($from_id, $to_id, ['date' => current_time('mysql')]); + } + } + } + // ...to Hooks + if ($this->post_types['hook'] == $to_type) { + foreach ($to_slugs as $to_slug => $to_id) { + $to_id = intval($to_id, 10); + if (0 != $to_id) { + p2p_type('functions_to_hooks')->connect($from_id, $to_id, ['date' => current_time('mysql')]); + } + } + } + } + } + + // Connect Methods + if ($from_type === $this->post_types['method']) { + foreach ($to_types as $to_type => $to_slugs) { + // ...to Functions + if ($this->post_types['function'] === $to_type) { + foreach ($to_slugs as $to_slug => $to_id) { + $to_id = intval($to_id, 10); + if (0 != $to_id) { + p2p_type('methods_to_functions')->connect($from_id, $to_id, ['data' => current_time('mysql')]); + } + } + } + + // ...to Methods + if ($this->post_types['method'] === $to_type) { + foreach ($to_slugs as $to_slug => $to_id) { + $to_id = intval($to_id, 10); + if (0 != $to_id) { + p2p_type('methods_to_methods')->connect($from_id, $to_id, ['data' => current_time('mysql')]); + } + } + } + + // ...to Hooks + if ($this->post_types['hook'] === $to_type) { + foreach ($to_slugs as $to_slug => $to_id) { + $to_id = intval($to_id, 10); + if (0 != $to_id) { + p2p_type('methods_to_hooks')->connect($from_id, $to_id, ['data' => current_time('mysql')]); + } + } + } + } + } + } + } + } + + /** + * Map a name to slug, taking into account namespace context. + * + * When a function is called within a namespace, the function is first looked + * for in the current namespace. If it exists, the namespaced version is used. + * If the function does not exist in the current namespace, PHP tries to find + * the function in the global scope. + * + * Unless the call has been prefixed with '\' indicating it is fully qualified + * we need to check first in the current namespace and then in the global + * scope. + * + * This also catches the case where relative namespaces are used. You can + * create a file in namespace `\Foo` and then call a funtion called `baz` in + * namespace `\Foo\Bar\` by just calling `Bar\baz()`. PHP will first look + * for `\Foo\Bar\baz()` and if it can't find it fall back to `\Bar\baz()`. + * + * @see WP_Parser\Importer::import_item() + * @param string $name The name of the item a slug is needed for. + * @param string $namespace The namespace the item is in when for context. + * @return array An array of slugs, starting with the context of the + * namespace, and falling back to the global namespace. + */ + public function names_to_slugs($name, $namespace = null) { + $fully_qualified = (0 === strpos('\\', $name)); + $name = ltrim($name, '\\'); + $names = []; + + if ($namespace && !$fully_qualified) { + $names[] = $this->name_to_slug($namespace . '\\' . $name); + } + $names[] = $this->name_to_slug($name); + + return $names; + } + + /** + * Simple conversion of a method, function, or hook name to a post slug. + * + * Replaces '::' and '\' to dashes and then runs the name through `sanitize_title()`. + * + * @param string $name Method, function, or hook name + * @return string The post slug for the passed name. + */ + public function name_to_slug($name) { + return sanitize_title(str_replace('\\', '-', str_replace('::', '-', $name))); + } + + /** + * Convert a post slug to an array( 'slug' => id ) + * Ignores slugs that are not found in $slugs_to_ids + * + * @param array $slugs Array of post slugs. + * @param array $slugs_to_ids Map of slugs to IDs. + * @return array + */ + public function get_ids_for_slugs(array $slugs, array $slugs_to_ids) { + $slugs_with_ids = []; + + foreach ($slugs as $index => $scoped_slugs) { + // Find the first matching scope the ID exists for. + foreach ($scoped_slugs as $slug) { + if (array_key_exists($slug, $slugs_to_ids)) { + $slugs_with_ids[$slug] = $slugs_to_ids[$slug]; + // if we found it in this scope, stop searching the chain. + continue; + } + } + } + + return $slugs_with_ids; + } } diff --git a/plugin.php b/plugin.php index 216176b..4815cb1 100644 --- a/plugin.php +++ b/plugin.php @@ -16,9 +16,6 @@ require __DIR__ . '/vendor/autoload.php'; } -require_once(__DIR__ . '/lib/api-functions.php'); -require_once(__DIR__ . '/lib/template-functions.php'); - global $wp_parser; $wp_parser = new WP_Parser\Plugin(); $wp_parser->on_load(); From b26f72346c57e3e61d5740d3be250afc860b7091 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Fri, 20 Aug 2021 12:53:55 +0900 Subject: [PATCH 04/66] feat: add get_source_code_root_dir api-function --- lib/api-functions.php | 32 ++++++++++++++++++++++++++++++++ lib/class-relationships.php | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/api-functions.php b/lib/api-functions.php index 34d0c6e..ed122fd 100644 --- a/lib/api-functions.php +++ b/lib/api-functions.php @@ -57,3 +57,35 @@ function avcpdp_get_post_source_type_terms($post_id = null) { return $res; } + +/** + * Retrieve the root directory of the parsed WP code. + * + * If the option 'wp_parser_root_import_dir' (as set by the parser) is not + * set, then assume ABSPATH. + * + * @param int|null $post_id + * @return string + */ +function avcpdp_get_source_code_root_dir($post_id = null) { + $root_dir = get_option('wp_parser_root_import_dir'); + if (empty($post_id)) { + $post_id = get_the_ID(); + if (!empty($post_id)) { + $sourceterms = avcpdp_get_post_source_type_terms($post_id); + if (!empty($sourceterms['name'])) { + $dir = get_term_meta( + $sourceterms['name']->term_id, + 'wp_parser_root_import_dir', + true + ); + $root_dir = !empty($dir) ? $dir : $root_dir; + } + } + } + if (isset($_ENV['AVC_NODE_ENV']) && $_ENV['AVC_NODE_ENV'] === 'development') { + $root_dir = str_replace('/app/', '/var/www/html/', $root_dir); + } + + return $root_dir ? trailingslashit($root_dir) : ABSPATH; +} diff --git a/lib/class-relationships.php b/lib/class-relationships.php index c228c6c..5ba7b8e 100644 --- a/lib/class-relationships.php +++ b/lib/class-relationships.php @@ -289,7 +289,7 @@ public function wp_parser_ending_import(Importer $importer) { 'methods_to_hooks', ] as $p2p_type ) { - $res = $wpdb->query( + $wpdb->query( $wpdb->prepare( "DELETE p2p, p2p_meta FROM {$p2p} p2p INNER JOIN {$wtr} wtr ON wtr.object_id = p2p.p2p_from From 9841ed127ff973c700387a9bbd8624e37d198515 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Fri, 20 Aug 2021 17:51:05 +0900 Subject: [PATCH 05/66] feat: move majority of API like functions from wporg-developer theme to src --- composer.json | 9 +- lib/api-functions.php | 91 ---- lib/class-plugin.php | 275 ++++++++---- lib/class-relationships.php | 82 +++- plugin.php | 8 +- src/Admin.php | 133 ++++++ src/Explanations.php | 650 ++++++++++++++++++++++++++++ src/Master.php | 43 ++ src/ParsedContent.php | 276 ++++++++++++ src/api-functions.php | 211 +++++++++ src/js/explanations.js | 108 +++++ src/js/parsed-content.js | 90 ++++ src/styles/admin.css | 123 ++++++ {lib => src}/template-functions.php | 0 14 files changed, 1913 insertions(+), 186 deletions(-) delete mode 100644 lib/api-functions.php create mode 100644 src/Admin.php create mode 100644 src/Explanations.php create mode 100644 src/Master.php create mode 100644 src/ParsedContent.php create mode 100644 src/api-functions.php create mode 100644 src/js/explanations.js create mode 100644 src/js/parsed-content.js create mode 100644 src/styles/admin.css rename {lib => src}/template-functions.php (100%) diff --git a/composer.json b/composer.json index 1c4e007..d321be4 100644 --- a/composer.json +++ b/composer.json @@ -37,8 +37,11 @@ "files": [ "lib/runner.php", "lib/template.php", - "lib/api-functions.php", - "lib/template-functions.php" - ] + "src/api-functions.php", + "src/template-functions.php" + ], + "psr-4": { + "Aivec\\Plugins\\DocParser\\": "src" + } } } diff --git a/lib/api-functions.php b/lib/api-functions.php deleted file mode 100644 index ed122fd..0000000 --- a/lib/api-functions.php +++ /dev/null @@ -1,91 +0,0 @@ - __('Classes', 'wp-parser'), - 'wp-parser-function' => __('Functions', 'wp-parser'), - 'wp-parser-hook' => __('Hooks', 'wp-parser'), - 'wp-parser-method' => __('Methods', 'wp-parser'), - ]; - - if ('labels' !== $labels) { - return array_keys($post_types); - } - - return $post_types; -} - -/** - * Returns source type "type" and "name" terms for the current post - * - * @author Evan D Shaw - * @param int|null $post_id - * @return array|null - */ -function avcpdp_get_post_source_type_terms($post_id = null) { - if ($post_id === null) { - $post_id = get_the_ID(); - } - - if (empty($post_id)) { - return null; - } - - $terms = wp_get_post_terms($post_id, WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); - if (empty($terms)) { - return null; - } - - $res = []; - foreach ($terms as $term) { - if ($term->parent === 0) { - $res['type'] = $term; - } else { - $res['name'] = $term; - } - } - - if (empty($res['type']) || empty($res['name'])) { - return null; - } - - return $res; -} - -/** - * Retrieve the root directory of the parsed WP code. - * - * If the option 'wp_parser_root_import_dir' (as set by the parser) is not - * set, then assume ABSPATH. - * - * @param int|null $post_id - * @return string - */ -function avcpdp_get_source_code_root_dir($post_id = null) { - $root_dir = get_option('wp_parser_root_import_dir'); - if (empty($post_id)) { - $post_id = get_the_ID(); - if (!empty($post_id)) { - $sourceterms = avcpdp_get_post_source_type_terms($post_id); - if (!empty($sourceterms['name'])) { - $dir = get_term_meta( - $sourceterms['name']->term_id, - 'wp_parser_root_import_dir', - true - ); - $root_dir = !empty($dir) ? $dir : $root_dir; - } - } - } - if (isset($_ENV['AVC_NODE_ENV']) && $_ENV['AVC_NODE_ENV'] === 'development') { - $root_dir = str_replace('/app/', '/var/www/html/', $root_dir); - } - - return $root_dir ? trailingslashit($root_dir) : ABSPATH; -} diff --git a/lib/class-plugin.php b/lib/class-plugin.php index f9d8ace..15f6b4c 100644 --- a/lib/class-plugin.php +++ b/lib/class-plugin.php @@ -27,6 +27,7 @@ public function on_load() { add_filter('wp_parser_return_type', [$this, 'humanize_separator']); add_filter('post_type_link', [$this, 'method_permalink'], 10, 2); + add_filter('term_link', [$this, 'taxonomy_permalink'], 10, 3); } /** @@ -42,74 +43,134 @@ public function register_post_types() { 'title', ]; + // Functions if (!post_type_exists('wp-parser-function')) { - register_post_type( - 'wp-parser-function', - [ - 'has_archive' => 'functions', - 'label' => __('Functions', 'wp-parser'), - 'public' => true, - 'rewrite' => [ - 'feeds' => false, - 'slug' => 'function', - 'with_front' => false, - ], - 'supports' => $supports, - ] - ); + register_post_type('wp-parser-function', [ + 'has_archive' => 'reference/functions', + 'label' => __('Functions', 'wporg'), + 'labels' => [ + 'name' => __('Functions', 'wporg'), + 'singular_name' => __('Function', 'wporg'), + 'all_items' => __('Functions', 'wporg'), + 'new_item' => __('New Function', 'wporg'), + 'add_new' => __('Add New', 'wporg'), + 'add_new_item' => __('Add New Function', 'wporg'), + 'edit_item' => __('Edit Function', 'wporg'), + 'view_item' => __('View Function', 'wporg'), + 'search_items' => __('Search Functions', 'wporg'), + 'not_found' => __('No Functions found', 'wporg'), + 'not_found_in_trash' => __('No Functions found in trash', 'wporg'), + 'parent_item_colon' => __('Parent Function', 'wporg'), + 'menu_name' => __('Functions', 'wporg'), + ], + 'menu_icon' => 'dashicons-editor-code', + 'public' => true, + 'rewrite' => [ + 'feeds' => false, + 'slug' => 'reference/functions', + 'with_front' => false, + ], + 'supports' => $supports, + 'show_in_rest' => true, + ]); } + // Methods if (!post_type_exists('wp-parser-method')) { - add_rewrite_rule('method/([^/]+)/([^/]+)/?$', 'index.php?post_type=wp-parser-method&name=$matches[1]-$matches[2]', 'top'); - - register_post_type( - 'wp-parser-method', - [ - 'has_archive' => 'methods', - 'label' => __('Methods', 'wp-parser'), - 'public' => true, - 'rewrite' => [ - 'feeds' => false, - 'slug' => 'method', - 'with_front' => false, - ], - 'supports' => $supports, - ] - ); + add_rewrite_rule('reference/classes/page/([0-9]{1,})/?$', 'index.php?post_type=wp-parser-class&paged=$matches[1]', 'top'); + add_rewrite_rule('reference/classes/([^/]+)/([^/]+)/?$', 'index.php?post_type=wp-parser-method&name=$matches[1]-$matches[2]', 'top'); + register_post_type('wp-parser-method', [ + 'has_archive' => 'reference/methods', + 'label' => __('Methods', 'wporg'), + 'labels' => [ + 'name' => __('Methods', 'wporg'), + 'singular_name' => __('Method', 'wporg'), + 'all_items' => __('Methods', 'wporg'), + 'new_item' => __('New Method', 'wporg'), + 'add_new' => __('Add New', 'wporg'), + 'add_new_item' => __('Add New Method', 'wporg'), + 'edit_item' => __('Edit Method', 'wporg'), + 'view_item' => __('View Method', 'wporg'), + 'search_items' => __('Search Methods', 'wporg'), + 'not_found' => __('No Methods found', 'wporg'), + 'not_found_in_trash' => __('No Methods found in trash', 'wporg'), + 'parent_item_colon' => __('Parent Method', 'wporg'), + 'menu_name' => __('Methods', 'wporg'), + ], + 'menu_icon' => 'dashicons-editor-code', + 'public' => true, + 'rewrite' => [ + 'feeds' => false, + 'slug' => 'classes', + 'with_front' => false, + ], + 'supports' => $supports, + 'show_in_rest' => true, + ]); } + // Classes if (!post_type_exists('wp-parser-class')) { - register_post_type( - 'wp-parser-class', - [ - 'has_archive' => 'classes', - 'label' => __('Classes', 'wp-parser'), - 'public' => true, - 'rewrite' => [ - 'feeds' => false, - 'slug' => 'class', - 'with_front' => false, - ], - 'supports' => $supports, - ] - ); + register_post_type('wp-parser-class', [ + 'has_archive' => 'reference/classes', + 'label' => __('Classes', 'wporg'), + 'labels' => [ + 'name' => __('Classes', 'wporg'), + 'singular_name' => __('Class', 'wporg'), + 'all_items' => __('Classes', 'wporg'), + 'new_item' => __('New Class', 'wporg'), + 'add_new' => __('Add New', 'wporg'), + 'add_new_item' => __('Add New Class', 'wporg'), + 'edit_item' => __('Edit Class', 'wporg'), + 'view_item' => __('View Class', 'wporg'), + 'search_items' => __('Search Classes', 'wporg'), + 'not_found' => __('No Classes found', 'wporg'), + 'not_found_in_trash' => __('No Classes found in trash', 'wporg'), + 'parent_item_colon' => __('Parent Class', 'wporg'), + 'menu_name' => __('Classes', 'wporg'), + ], + 'menu_icon' => 'dashicons-editor-code', + 'public' => true, + 'rewrite' => [ + 'feeds' => false, + 'slug' => 'reference/classes', + 'with_front' => false, + ], + 'supports' => $supports, + 'show_in_rest' => true, + ]); } + // Hooks if (!post_type_exists('wp-parser-hook')) { - register_post_type( - 'wp-parser-hook', - [ - 'has_archive' => 'hooks', - 'label' => __('Hooks', 'wp-parser'), - 'public' => true, - 'rewrite' => [ - 'feeds' => false, - 'slug' => 'hook', - 'with_front' => false, - ], - 'supports' => $supports, - ] - ); + register_post_type('wp-parser-hook', [ + 'has_archive' => 'reference/hooks', + 'label' => __('Hooks', 'wporg'), + 'labels' => [ + 'name' => __('Hooks', 'wporg'), + 'singular_name' => __('Hook', 'wporg'), + 'all_items' => __('Hooks', 'wporg'), + 'new_item' => __('New Hook', 'wporg'), + 'add_new' => __('Add New', 'wporg'), + 'add_new_item' => __('Add New Hook', 'wporg'), + 'edit_item' => __('Edit Hook', 'wporg'), + 'view_item' => __('View Hook', 'wporg'), + 'search_items' => __('Search Hooks', 'wporg'), + 'not_found' => __('No Hooks found', 'wporg'), + 'not_found_in_trash' => __('No Hooks found in trash', 'wporg'), + 'parent_item_colon' => __('Parent Hook', 'wporg'), + 'menu_name' => __('Hooks', 'wporg'), + ], + 'menu_icon' => 'dashicons-editor-code', + 'public' => true, + 'rewrite' => [ + 'feeds' => false, + 'slug' => 'reference/hooks', + 'with_front' => false, + ], + 'supports' => $supports, + 'show_in_rest' => true, + ]); } } @@ -117,27 +178,48 @@ public function register_post_types() { * Register the file and @since taxonomies */ public function register_taxonomies() { - $object_types = [ - 'wp-parser-class', - 'wp-parser-method', - 'wp-parser-function', - 'wp-parser-hook', - ]; + $object_types = avcpdp_get_parsed_post_types(); + // Files if (!taxonomy_exists('wp-parser-source-file')) { register_taxonomy( 'wp-parser-source-file', $object_types, [ - 'label' => __('Files', 'wp-parser'), + 'label' => __('Files', 'wporg'), + 'labels' => [ + 'name' => __('Files', 'wporg'), + 'singular_name' => _x('File', 'taxonomy general name', 'wporg'), + 'search_items' => __('Search Files', 'wporg'), + 'popular_items' => null, + 'all_items' => __('All Files', 'wporg'), + 'parent_item' => __('Parent File', 'wporg'), + 'parent_item_colon' => __('Parent File:', 'wporg'), + 'edit_item' => __('Edit File', 'wporg'), + 'update_item' => __('Update File', 'wporg'), + 'add_new_item' => __('New File', 'wporg'), + 'new_item_name' => __('New File', 'wporg'), + 'separate_items_with_commas' => __('Files separated by comma', 'wporg'), + 'add_or_remove_items' => __('Add or remove Files', 'wporg'), + 'choose_from_most_used' => __('Choose from the most used Files', 'wporg'), + 'menu_name' => __('Files', 'wporg'), + ], 'public' => true, - 'rewrite' => ['slug' => 'files'], + // Hierarchical x 2 to enable (.+) rather than ([^/]+) for rewrites. + 'hierarchical' => true, + 'rewrite' => [ + 'with_front' => false, + 'slug' => 'reference/files', + 'hierarchical' => true, + ], 'sort' => false, 'update_count_callback' => '_update_post_term_count', + 'show_in_rest' => true, ] ); } + // Package if (!taxonomy_exists('wp-parser-package')) { register_taxonomy( 'wp-parser-package', @@ -146,28 +228,38 @@ public function register_taxonomies() { 'hierarchical' => true, 'label' => '@package', 'public' => true, - 'rewrite' => ['slug' => 'package'], + 'rewrite' => [ + 'with_front' => false, + 'slug' => 'reference/package', + ], 'sort' => false, 'update_count_callback' => '_update_post_term_count', + 'show_in_rest' => true, ] ); } + // @since if (!taxonomy_exists('wp-parser-since')) { register_taxonomy( 'wp-parser-since', $object_types, [ 'hierarchical' => true, - 'label' => __('@since', 'wp-parser'), + 'label' => __('@since', 'wporg'), 'public' => true, - 'rewrite' => ['slug' => 'since'], + 'rewrite' => [ + 'with_front' => false, + 'slug' => 'reference/since', + ], 'sort' => false, 'update_count_callback' => '_update_post_term_count', + 'show_in_rest' => true, ] ); } + // Namespaces if (!taxonomy_exists('wp-parser-namespace')) { register_taxonomy( 'wp-parser-namespace', @@ -189,15 +281,20 @@ public function register_taxonomies() { $object_types, [ 'hierarchical' => true, - 'label' => __('Source Type', 'wp-parser'), + 'label' => __('Source Type', 'wporg'), 'public' => true, - 'rewrite' => ['slug' => 'source-type'], + 'rewrite' => [ + 'with_front' => false, + 'slug' => 'reference/source-type', + ], 'sort' => false, 'update_count_callback' => '_update_post_term_count', + 'show_in_rest' => true, ] ); } + // Add default source-type terms if (!term_exists('plugin', self::SOURCE_TYPE_TAX_SLUG)) { wp_insert_term( __('Plugin', 'wp-parser'), @@ -224,19 +321,43 @@ public function register_taxonomies() { } /** - * @param string $link - * @param \WP_Post $post + * Filters the permalink for a wp-parser-method post. * - * @return string|void + * @param string $link The post's permalink. + * @param \WP_Post $post The post in question. + * @return string */ public function method_permalink($link, $post) { - if ('wp-parser-method' !== $post->post_type || 0 == $post->post_parent) { + global $wp_rewrite; + + if (!$wp_rewrite->using_permalinks() || ('wp-parser-method' !== $post->post_type)) { return $link; } - list( $class, $method ) = explode('-', $post->post_name); - $link = home_url(user_trailingslashit("method/$class/$method")); + $parts = explode('-', $post->post_name); + $method = array_pop($parts); + $class = implode('-', $parts); + return home_url(user_trailingslashit("reference/classes/$class/$method")); + } + + public function taxonomy_permalink($link, $term, $taxonomy) { + global $wp_rewrite; + + if (!$wp_rewrite->using_permalinks()) { + return $link; + } + + if ($taxonomy === 'wp-parser-source-file') { + $slug = $term->slug; + if (substr($slug, -4) === '-php') { + $slug = substr($slug, 0, -4) . '.php'; + $slug = str_replace('_', '/', $slug); + } + $link = home_url(user_trailingslashit("reference/files/$slug")); + } elseif ($taxonomy === 'wp-parser-since') { + $link = str_replace($term->slug, str_replace('-', '.', $term->slug), $link); + } return $link; } diff --git a/lib/class-relationships.php b/lib/class-relationships.php index 5ba7b8e..6fe1525 100644 --- a/lib/class-relationships.php +++ b/lib/class-relationships.php @@ -76,10 +76,19 @@ public function register_post_relationships() { 'name' => 'functions_to_functions', 'from' => 'wp-parser-function', 'to' => 'wp-parser-function', - 'self_connections' => 'true', + 'can_create_post' => false, + 'self_connections' => true, + 'from_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], + 'to_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], 'title' => [ - 'from' => 'Uses Functions', - 'to' => 'Used by Functions', + 'from' => __('Uses Functions', 'wporg'), + 'to' => __('Used by Functions', 'wporg'), ], ]); @@ -87,9 +96,18 @@ public function register_post_relationships() { 'name' => 'functions_to_methods', 'from' => 'wp-parser-function', 'to' => 'wp-parser-method', + 'can_create_post' => false, + 'from_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], + 'to_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], 'title' => [ - 'from' => 'Uses Methods', - 'to' => 'Used by Functions', + 'from' => __('Uses Methods', 'wporg'), + 'to' => __('Used by Functions', 'wporg'), ], ]); @@ -97,9 +115,18 @@ public function register_post_relationships() { 'name' => 'functions_to_hooks', 'from' => 'wp-parser-function', 'to' => 'wp-parser-hook', + 'can_create_post' => false, + 'from_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], + 'to_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], 'title' => [ - 'from' => 'Uses Hooks', - 'to' => 'Used by Functions', + 'from' => __('Uses Hooks', 'wporg'), + 'to' => __('Used by Functions', 'wporg'), ], ]); @@ -110,9 +137,18 @@ public function register_post_relationships() { 'name' => 'methods_to_functions', 'from' => 'wp-parser-method', 'to' => 'wp-parser-function', + 'can_create_post' => false, + 'from_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], + 'to_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], 'title' => [ - 'from' => 'Uses Functions', - 'to' => 'Used by Methods', + 'from' => __('Uses Functions', 'wporg'), + 'to' => __('Used by Methods', 'wporg'), ], ]); @@ -120,10 +156,19 @@ public function register_post_relationships() { 'name' => 'methods_to_methods', 'from' => 'wp-parser-method', 'to' => 'wp-parser-method', - 'self_connections' => 'true', + 'can_create_post' => false, + 'self_connections' => true, + 'from_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], + 'to_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], 'title' => [ - 'from' => 'Uses Methods', - 'to' => 'Used by Methods', + 'from' => __('Uses Methods', 'wporg'), + 'to' => __('Used by Methods', 'wporg'), ], ]); @@ -131,9 +176,18 @@ public function register_post_relationships() { 'name' => 'methods_to_hooks', 'from' => 'wp-parser-method', 'to' => 'wp-parser-hook', + 'can_create_post' => false, + 'from_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], + 'to_query_vars' => [ + 'orderby' => 'post_title', + 'order' => 'ASC', + ], 'title' => [ - 'from' => 'Used by Methods', - 'to' => 'Uses Hooks', + 'from' => __('Used by Methods', 'wporg'), + 'to' => __('Uses Hooks', 'wporg'), ], ]); } diff --git a/plugin.php b/plugin.php index 4815cb1..22a4b74 100644 --- a/plugin.php +++ b/plugin.php @@ -6,11 +6,15 @@ * Author: Ryan McCue, Paul Gibbs, Andrey "Rarst" Savchenko and Contributors * Author URI: https://github.com/WordPress/phpdoc-parser/graphs/contributors * Plugin URI: https://github.com/WordPress/phpdoc-parser - * Version: + * Version: %%VERSION%% * Text Domain: wp-parser */ define('AVC_WP_PARSER', true); +define('AVCPDP_VERSION', '%%VERSION%%'); +define('AVCPDP_LANG_DIR', __DIR__ . '/languages'); +define('AVCPDP_PLUGIN_DIR', ABSPATH . 'wp-content/plugins/' . plugin_basename(dirname(__FILE__))); +define('AVCPDP_PLUGIN_URL', site_url() . '/wp-content/plugins/' . plugin_basename(dirname(__FILE__))); if (file_exists(__DIR__ . '/vendor/autoload.php')) { require __DIR__ . '/vendor/autoload.php'; @@ -20,6 +24,8 @@ $wp_parser = new WP_Parser\Plugin(); $wp_parser->on_load(); +Aivec\Plugins\DocParser\Master::init(); + add_filter('wp_parser_exclude_directories', function () { return ['vendor', 'dist', 'tests', 'semantic', 'node_modules']; }); diff --git a/src/Admin.php b/src/Admin.php new file mode 100644 index 0000000..5e17041 --- /dev/null +++ b/src/Admin.php @@ -0,0 +1,133 @@ +id, $screen_ids))) { + wp_enqueue_style('wporg-admin', AVCPDP_PLUGIN_URL . '/src/styles/admin.css', [], '20181101'); + } + } + + /** + * Appends the user nicename to the user display name shown for comment authors. + * + * Facilitates discovery of @-mention name for users. + * + * @param string $author_name The comment author's display name. + * @param int $comment_id The comment ID. + * @return string + */ + public static function append_user_nicename($author_name, $comment_id) { + $comment = get_comment($comment_id); + + if ($comment->user_id) { + $username = get_user_by('id', $comment->user_id)->user_nicename; + + $author_name .= '
@' . $username . '
'; + } + + return $author_name; + } + + /** + * Adds a checkbox for resetting the contributor note votes in the comment submit meta box. + * + * Only displays the checkbox if the vote score is not zero. + * + * @param string $html Html in the submit meta box. + * @param object $comment Current comment object. + * @return string Output html. + */ + public static function add_reset_votes_form_field($html, $comment) { + $count = (int)DevHub_User_Contributed_Notes_Voting::count_votes($comment->comment_ID, 'difference'); + + if (0 !== $count) { + $html .= '
'; + $html .= ''; + $html .= ''; + $html .= '
'; + } + + return $html; + } + + /** + * Reset votes before the user is redirected from the wp-admin (after editing a comment). + * + * @param string $location The URI the user will be redirected to. + * @param int $comment_id The ID of the comment being edited. + * @return string The redirect URI. + */ + public static function comment_edit_redirect($location, $comment_id) { + if (isset($_REQUEST['reset_votes']) && $_REQUEST['reset_votes']) { + DevHub_User_Contributed_Notes_Voting::reset_votes($comment_id); + } + + return $location; + } +} diff --git a/src/Explanations.php b/src/Explanations.php new file mode 100644 index 0000000..6de53bb --- /dev/null +++ b/src/Explanations.php @@ -0,0 +1,650 @@ +post_types = avcpdp_get_parsed_post_types(); + $this->screen_ids = [$this->exp_post_type, "edit-{$this->exp_post_type}"]; + } + + public function init() { + // Setup. + add_action('init', [$this, 'register_post_type'], 0); + add_action('init', [$this, 'remove_editor_support'], 100); + + // Admin. + add_action('edit_form_after_title', [$this, 'post_to_expl_controls']); + add_action('edit_form_top', [$this, 'expl_to_post_controls']); + add_action('admin_bar_menu', [$this, 'toolbar_edit_link'], 100); + add_action('admin_menu', [$this, 'admin_menu']); + add_action('load-post-new.php', [$this, 'prevent_direct_creation']); + // Add admin post listing column for explanations indicator. + add_filter('manage_posts_columns', [$this, 'add_post_column']); + // Output checkmark in explanations column if post has an explanation. + add_action('manage_posts_custom_column', [$this, 'handle_column_data'], 10, 2); + + add_filter('preview_post_link', [$this, 'preview_post_link'], 10, 2); + + // Permissions. + add_action('after_switch_theme', [$this, 'add_roles']); + add_filter('user_has_cap', [$this, 'grant_caps']); + add_filter('post_row_actions', [$this, 'expl_row_action'], 10, 2); + + // Script and styles. + add_filter('devhub-admin_enqueue_scripts', [$this, 'admin_enqueue_base_scripts']); + add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_scripts']); + + // AJAX. + add_action('wp_ajax_new_explanation', [$this, 'new_explanation']); + add_action('wp_ajax_un_publish', [$this, 'un_publish_explanation']); + } + + /** + * Register the Explanations post type. + * + * @access public + */ + public function register_post_type() { + register_post_type($this->exp_post_type, [ + 'labels' => [ + 'name' => __('Explanations', 'wporg'), + 'singular_name' => __('Explanation', 'wporg'), + 'all_items' => __('Explanations', 'wporg'), + 'edit_item' => __('Edit Explanation', 'wporg'), + 'view_item' => __('View Explanation', 'wporg'), + 'search_items' => __('Search Explanations', 'wporg'), + 'not_found' => __('No Explanations found', 'wporg'), + 'not_found_in_trash' => __('No Explanations found in trash', 'wporg'), + ], + 'public' => false, + 'publicly_queryable' => true, + 'hierarchical' => false, + 'show_ui' => true, + 'show_in_menu' => true, + 'menu_icon' => 'dashicons-info', + 'show_in_admin_bar' => false, + 'show_in_nav_menus' => false, + 'capability_type' => 'explanation', + 'map_meta_cap' => true, + 'supports' => ['editor', 'revisions'], + 'rewrite' => false, + 'query_var' => false, + ]); + } + + /** + * Remove 'editor' support for the function, hook, class, and method post types. + * + * @access public + */ + public function remove_editor_support() { + foreach ($this->post_types as $type) { + remove_post_type_support($type, 'editor'); + } + } + + /** + * Override preview post links for explanations to preview the explanation + * within the context of its associated function/hook/method/class. + * + * The associated post's preview link is amended with query parameters used + * by `get_explanation_content()` to use the explanation being previewed + * instead of the published explanation currently associated with the post. + * + * @access public + * @see 'preview_post_link' filter + * + * @param string $preview_link URL used for the post preview. + * @param WP_Post $post Post object. + * @return string + **/ + public function preview_post_link($preview_link, $post) { + if ($this->exp_post_type !== $post->post_type) { + return $preview_link; + } + + if (false !== strpos($preview_link, 'preview_nonce=')) { + $url = parse_url($preview_link); + $url_query = []; + parse_str($url['query'], $url_query); + + $preview_link = get_preview_post_link( + $post->post_parent, + [ + 'wporg_explanations_preview_id' => $url_query['preview_id'], + 'wporg_explanations_preview_nonce' => $url_query['preview_nonce'], + ] + ); + } + + return $preview_link; + } + + /** + * Customizes admin menu. + * + * - Removes "Add new". + * - Adds count of pending explanations. + * + * @access public + */ + public function admin_menu() { + global $menu; + + $menu_slug = 'edit.php?post_type=' . $this->exp_post_type; + + // Remove 'Add New' from submenu. + remove_submenu_page($menu_slug, 'post-new.php?post_type=' . $this->exp_post_type); + + // Add pending posts count. + $counts = wp_count_posts($this->exp_post_type); + $count = $counts->pending; + if ($count) { + // Find the explanations menu item. + foreach ($menu as $i => $item) { + if ($menu_slug == $item[2]) { + // Modify it to include the pending count. + $menu[$i][0] = sprintf( + __('Explanations %s', 'wporg'), + "" . number_format_i18n($count) . '' + ); + break; + } + } + } + } + + /** + * Prevents direct access to the admin page for creating a new explanation. + * + * Only prevents admin UI access to directly create a new explanation. It does + * not attempt to prevent direct programmatic creation of a new explanation. + * + * @access public + */ + public function prevent_direct_creation() { + if (isset($_GET['post_type']) && $this->exp_post_type == $_GET['post_type']) { + wp_safe_redirect(admin_url()); + exit; + } + } + + /** + * Output the Post-to-Explanation controls in the post editor for functions, + * hooks, classes, and methods. + * + * @access public + * + * @param WP_Post $post Current post object. + */ + public function post_to_expl_controls($post) { + if (!in_array($post->post_type, $this->post_types)) { + return; + } + + $explanation = avcpdp_get_explanation($post); + $date_format = get_option('date_format') . ', ' . get_option('time_format'); + ?> +
+
+

+
+ + + + + + + + + + + + + +
+ + + +
+ + +

ID); ?>

+
+
+
+
+ exp_post_type !== $post->post_type) { + return; + } + ?> +
+
+
+ + %2$s', + esc_url(get_permalink($post->post_parent)), + str_replace('Explanation: ', '', get_the_title($post->post_parent)) + ); + ?> +
+
+
+ get_queried_object(); + + if (is_admin() || empty($screen->post_type) || !is_singular($this->post_types)) { + return; + } + + // Proceed only if there's an explanation for the current reference post type. + if (!empty($screen->post_type) && $explanation = avcpdp_get_explanation($screen)) { + // Must be able to edit the explanation. + if (is_user_member_of_blog() && current_user_can('edit_explanation', $explanation->ID)) { + $post_type = get_post_type_object($this->exp_post_type); + + $wp_admin_bar->add_menu([ + 'id' => 'edit-explanation', + 'title' => $post_type->labels->edit_item, + 'href' => get_edit_post_link($explanation), + ]); + } + } + } + + /** + * Adds the 'Explanation Editor' role. + * + * @access public + */ + public function add_roles() { + add_role( + 'expl_editor', + __('Explanation Editor', 'wporg'), + [ + 'unfiltered_html' => true, + 'read' => true, + 'edit_explanations' => true, + 'edit_others_explanations' => true, + 'edit_published_explanations' => true, + 'edit_private_explanations' => true, + 'read_private_explanations' => true, + ] + ); + } + + /** + * Grants explanation capabilities to users. + * + * @access public + * + * @param array $caps Capabilities. + * @return array Modified capabilities array. + */ + public function grant_caps($caps) { + if (!is_user_member_of_blog()) { + return $caps; + } + + $role = wp_get_current_user()->roles[0]; + + // Only grant explanation post type caps for admins, editors, and explanation editors. + if (in_array($role, ['administrator', 'editor', 'expl_editor'])) { + $base_caps = [ + 'edit_explanations', + 'edit_others_explanations', + 'edit_published_explanations', + 'edit_posts', + ]; + + foreach ($base_caps as $cap) { + $caps[$cap] = true; + } + + $editor_caps = [ + 'publish_explanations', + 'delete_explanations', + 'delete_others_explanations', + 'delete_published_explanations', + 'delete_private_explanations', + 'edit_private_explanations', + 'read_private_explanations', + ]; + + if (!empty($caps['edit_pages'])) { + foreach ($editor_caps as $cap) { + $caps[$cap] = true; + } + } + } + + return $caps; + } + + /** + * Adds the 'Add/Edit Explanation' row actions to the parsed post type list tables. + * + * @access public + * + * @param array $actions Row actions. + * @param \WP_Post $post Parsed post object. + * @return array (Maybe) filtered row actions. + */ + public function expl_row_action($actions, $post) { + if (!in_array($post->post_type, avcpdp_get_parsed_post_types())) { + return $actions; + } + + $expl = avcpdp_get_explanation($post); + + $expl_action = []; + + if ($expl) { + if (!current_user_can('edit_posts', $expl->ID)) { + return $actions; + } + + $expl_action['edit-expl'] = sprintf( + '%3$s', + esc_url(get_edit_post_link($expl->ID)), + esc_attr__('Edit Explanation', 'wporg'), + __('Edit Explanation', 'wporg') + ); + } else { + $expl_action['add-expl'] = sprintf( + '%3$s', + esc_attr(wp_create_nonce('create-expl')), + esc_attr($post->ID), + __('Add Explanation', 'wporg') + ); + } + + return array_merge($expl_action, $actions); + } + + /** + * Output the Explanation status controls. + * + * @access public + * + * @param int|WP_Post Post ID or WP_Post object. + */ + public function status_controls($post) { + $explanation = avcpdp_get_explanation($post); + + if ($explanation) : + echo $this->get_status_label($explanation->ID); + ?> + + + + + + + + + + + +

+ + + + + + post_status) { + case 'draft': + $label = __('Draft', 'wporg'); + break; + case 'pending': + $label = __('Pending Review', 'wporg'); + break; + case 'publish': + $label = __('Published', 'wporg'); + break; + default: + $status = ''; + $label = __('None', 'wporg'); + break; + } + + return '

' . $label . '

'; + } + + /** + * Enables enqueuing of admin.css for explanation pages. + * + * @access public + * + * @param bool $do_enqueue Should admin.css be enqueued? + * @return bool True if admin.css should be enqueued, false otherwise. + */ + public function admin_enqueue_base_scripts($do_enqueue) { + return $do_enqueue || in_array(get_current_screen()->id, $this->screen_ids); + } + + /** + * Enqueue JS and CSS for all parsed post types and explanation pages. + * + * @access public + */ + public function admin_enqueue_scripts() { + $parsed_post_types_screen_ids = Admin::get_parsed_post_types_screen_ids(); + + if ( + in_array(get_current_screen()->id, array_merge( + $parsed_post_types_screen_ids, + $this->screen_ids + )) + ) { + wp_enqueue_script('wporg-explanations', AVCPDP_PLUGIN_URL . '/src/js/explanations.js', ['jquery', 'wp-util'], '20160630', true); + + wp_localize_script('wporg-explanations', 'wporg', [ + 'editContentLabel' => __('Edit Explanation', 'wporg'), + 'statusLabel' => [ + 'draft' => __('Draft', 'wporg'), + 'pending' => __('Pending Review', 'wporg'), + 'publish' => __('Published', 'wporg'), + ], + ]); + } + } + + /** + * AJAX handler for creating and associating a new explanation. + * + * @access public + */ + public function new_explanation() { + check_ajax_referer('create-expl', 'nonce'); + + $post_id = empty($_REQUEST['post_id']) ? 0 : absint($_REQUEST['post_id']); + $context = empty($_REQUEST['context']) ? '' : sanitize_text_field($_REQUEST['context']); + + if (avcpdp_get_explanation($post_id)) { + wp_send_json_error(new WP_Error('post_exists', __('Explanation already exists.', 'wporg'))); + } else { + $title = get_post_field('post_title', $post_id); + + $explanation = wp_insert_post([ + 'post_type' => 'wporg_explanations', + 'post_title' => "Explanation: $title", + 'ping_status' => false, + 'post_parent' => $post_id, + ]); + + if (!is_wp_error($explanation) && 0 !== $explanation) { + wp_send_json_success([ + 'post_id' => $explanation, + 'parent_id' => $post_id, + 'context' => $context, + ]); + } else { + wp_send_json_error( + new WP_Error('post_error', __('Explanation could not be created.', 'wporg')) + ); + } + } + } + + /** + * AJAX handler for un-publishing an explanation. + * + * @access public + */ + public function un_publish_explanation() { + check_ajax_referer('unpublish-expl', 'nonce'); + + $post_id = empty($_REQUEST['post_id']) ? 0 : absint($_REQUEST['post_id']); + + if ($explanation = avcpdp_get_explanation($post_id)) { + $update = wp_update_post([ + 'ID' => $explanation->ID, + 'post_status' => 'draft', + ]); + + if (!is_wp_error($update) && 0 !== $update) { + wp_send_json_success(['post_id' => $update]); + } else { + wp_send_json_error( + new WP_Error('unpublish_error', __('Explanation could not be un-published.', 'wporg')) + ); + } + } + } + + /** + * Adds a column in the admin listing of posts for parsed post types to + * indicate if they have an explanation. + * + * Inserted as first column after title column. + * + * @access public + * + * @param array $columns Associative array of post column ids and labels. + * @return array + */ + public function add_post_column($columns) { + if (!empty($_GET['post_type']) && avcpdp_is_parsed_post_type($_GET['post_type'])) { + $index = array_search('title', array_keys($columns)); + $pos = false === $index ? count($columns) : $index + 1; + + $col_data = [ + 'has_explanation' => sprintf( + '%s', + esc_attr__('Has explanation?', 'wporg'), + esc_html__('Explanation?', 'wporg') + ), + ]; + $columns = array_merge(array_slice($columns, 0, $pos), $col_data, array_slice($columns, $pos)); + } + + return $columns; + } + + /** + * Outputs an indicator for the explanations column if post has an explanation. + * + * @access public + * + * @param string $column_name The name of the column. + * @param int $post_id The ID of the post. + */ + public function handle_column_data($column_name, $post_id) { + if ('has_explanation' === $column_name) { + if ($explanation = avcpdp_get_explanation($post_id)) { + printf( + '%s%s', + get_edit_post_link($explanation), + '', + '' . __('Post has an explanation.', 'wporg') . '' + ); + } + } + } +} diff --git a/src/Master.php b/src/Master.php new file mode 100644 index 0000000..bffc579 --- /dev/null +++ b/src/Master.php @@ -0,0 +1,43 @@ + + * @return void + */ + public static function init() { + add_action('init', function () { + add_action('pre_get_posts', [get_class(), 'preGetPosts'], 10, 1); + }); + + (new Explanations())->init(); + (new ParsedContent())->init(); + if (is_admin()) { + Admin::init(); + } + } + + /** + * @param \WP_Query $query + */ + public static function preGetPosts($query) { + if ($query->is_main_query() && $query->is_post_type_archive()) { + $query->set('orderby', 'title'); + $query->set('order', 'ASC'); + } + + if ($query->is_main_query() && $query->is_tax() && $query->get('wp-parser-source-file')) { + $query->set('wp-parser-source-file', str_replace(['.php', '/'], ['-php', '_'], $query->query['wp-parser-source-file'])); + } + + // For search query modifications see DevHub_Search. + } +} diff --git a/src/ParsedContent.php b/src/ParsedContent.php new file mode 100644 index 0000000..735e74c --- /dev/null +++ b/src/ParsedContent.php @@ -0,0 +1,276 @@ +post_types = avcpdp_get_parsed_post_types(); + } + + /** + * Registers hooks + * + * @author Evan D Shaw + * @return void + */ + public function init() { + // Data. + add_action('add_meta_boxes', [$this, 'add_meta_boxes']); + add_action('save_post', [$this, 'save_post']); + + // Script and styles. + add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_scripts']); + + // AJAX. + add_action('wp_ajax_wporg_attach_ticket', [$this, 'attach_ticket']); + add_action('wp_ajax_wporg_detach_ticket', [$this, 'detach_ticket']); + + // Register meta fields. + register_meta('post', 'wporg_ticket_number', 'absint', '__return_false'); + register_meta('post', 'wporg_ticket_title', 'sanitize_text_field', '__return_false'); + register_meta('post', 'wporg_parsed_content', 'wp_kses_post', '__return_false'); + } + + /** + * Add meta boxes. + * + * @access public + */ + public function add_meta_boxes() { + if (in_array($screen = get_current_screen()->id, $this->post_types)) { + remove_meta_box('postexcerpt', $screen, 'normal'); + add_meta_box('wporg_parsed_content', __('Parsed Content', 'wporg'), [$this, 'parsed_meta_box_cb'], $screen, 'normal'); + } + } + + /** + * Parsed content meta box display callback. + * + * @access public + * + * @param WP_Post $post Current post object. + */ + public function parsed_meta_box_cb($post) { + $ticket = get_post_meta($post->ID, 'wporg_ticket_number', true); + $ticket_label = get_post_meta($post->ID, 'wporg_ticket_title', true); + $ticket_info = get_post_meta($post->ID, 'wporg_parsed_ticket_info', true); + $content = $post->post_content; + + if ($ticket) { + $src = "https://core.trac.wordpress.org/ticket/{$ticket}"; + $ticket_message = sprintf('%2$s', esc_url($src), apply_filters('the_title', $ticket_label)); + } else { + $link = sprintf('%s', __('Core Trac', 'wporg')); + $ticket_message = sprintf(__('A valid, open ticket from %s is required to edit parsed content.', 'wporg'), $link); + } + wp_nonce_field('wporg-parsed-content', 'wporg-parsed-content-nonce'); + ?> + + + + + + + + + + + + + + + + + +
+ + +
post_excerpt); ?>
+ +
+ + +
+
+ false, + 'tinymce' => false, + 'quicktags' => true, + 'textarea_rows' => 10, + 'textarea_name' => 'content', + ]); + ?> +
+
+ + + + + + + + + + + + +
+ + +
+
+ id, $this->post_types)) { + wp_enqueue_script('wporg-parsed-content', AVCPDP_PLUGIN_URL . '/src/js/parsed-content.js', ['jquery', 'utils'], '20150824', true); + + wp_localize_script('wporg-parsed-content', 'wporgParsedContent', [ + 'ajaxURL' => admin_url('admin-ajax.php'), + 'searchText' => __('Searching ...', 'wporg'), + 'retryText' => __('Invalid ticket number, please try again.', 'wporg'), + ]); + } + } + + /** + * AJAX handler for fetching the title of a Core Trac ticket and 'attaching' it to the post. + * + * @access public + */ + public function attach_ticket() { + check_ajax_referer('wporg-attach-ticket', 'nonce'); + + $ticket_no = empty($_REQUEST['ticket']) ? 0 : absint($_REQUEST['ticket']); + $ticket_url = "https://core.trac.wordpress.org/ticket/{$ticket_no}"; + + // Fetch the ticket. + $resp = wp_remote_get(esc_url($ticket_url)); + $status_code = wp_remote_retrieve_response_code($resp); + $body = wp_remote_retrieve_body($resp); + + // Anything other than 200 is invalid. + if (200 === $status_code && null !== $body) { + $title = ''; + + // Snag the page title from the ticket HTML. + if (class_exists('DOMDocument')) { + $doc = new DOMDocument(); + @$doc->loadHTML($body); + + $nodes = $doc->getElementsByTagName('title'); + $title = $nodes->item(0)->nodeValue; + + // Strip off the site name. + $title = str_ireplace(' – WordPress Trac', '', $title); + } else { + die(-1); + } + + $post_id = empty($_REQUEST['post_id']) ? 0 : absint($_REQUEST['post_id']); + + update_post_meta($post_id, 'wporg_ticket_number', $ticket_no); + update_post_meta($post_id, 'wporg_ticket_title', $title); + + $link = sprintf('%2$s', esc_url($ticket_url), apply_filters('the_title', $title)); + + // Can haz success. + wp_send_json_success([ + 'message' => $link, + 'new_nonce' => wp_create_nonce('wporg-attach-ticket'), + ]); + } else { + // Ticket number is invalid. + wp_send_json_error([ + 'message' => __('Invalid ticket number.', 'wporg'), + 'new_nonce' => wp_create_nonce('wporg-attach-ticket'), + ]); + } + + die(0); + } + + /** + * AJAX handler for 'detaching' a ticket from the post. + * + * @access public + */ + public function detach_ticket() { + check_ajax_referer('wporg-detach-ticket', 'nonce'); + + $post_id = empty($_REQUEST['post_id']) ? 0 : absint($_REQUEST['post_id']); + + // Attempt to detach the ticket. + if ( + delete_post_meta($post_id, 'wporg_ticket_number') + && delete_post_meta($post_id, 'wporg_ticket_title') + ) { + // Success! + wp_send_json_success([ + 'message' => __('Ticket detached.', 'wporg'), + 'new_nonce' => wp_create_nonce('wporg-detach-ticket'), + ]); + } else { + // Still attached. + wp_send_json_error([ + 'message' => __('Ticket still attached.', 'wporg'), + 'new_nonce' => wp_create_nonce('wporg-detach-ticket'), + ]); + } + + die(0); + } +} diff --git a/src/api-functions.php b/src/api-functions.php new file mode 100644 index 0000000..8457aab --- /dev/null +++ b/src/api-functions.php @@ -0,0 +1,211 @@ + __('Classes', 'wp-parser'), + 'wp-parser-function' => __('Functions', 'wp-parser'), + 'wp-parser-hook' => __('Hooks', 'wp-parser'), + 'wp-parser-method' => __('Methods', 'wp-parser'), + ]; + + if ('labels' !== $labels) { + return array_keys($post_types); + } + + return $post_types; +} + +/** + * Checks if given post type is one of the parsed post types. + * + * @param null|string $post_type Optional. The post type. Default null. + * @return bool True if post has a parsed post type + */ +function avcpdp_is_parsed_post_type($post_type = null) { + $post_type = $post_type ? $post_type : get_post_type(); + + return in_array($post_type, avcpdp_get_parsed_post_types()); +} + +/** + * Returns source type "type" and "name" terms for the current post + * + * @author Evan D Shaw + * @param int|null $post_id + * @return array|null + */ +function avcpdp_get_post_source_type_terms($post_id = null) { + if ($post_id === null) { + $post_id = get_the_ID(); + } + + if (empty($post_id)) { + return null; + } + + $terms = wp_get_post_terms($post_id, WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); + if (empty($terms)) { + return null; + } + + $res = []; + foreach ($terms as $term) { + if ($term->parent === 0) { + $res['type'] = $term; + } else { + $res['name'] = $term; + } + } + + if (empty($res['type']) || empty($res['name'])) { + return null; + } + + return $res; +} + +/** + * Retrieve the root directory of the parsed WP code. + * + * If the option 'wp_parser_root_import_dir' (as set by the parser) is not + * set, then assume ABSPATH. + * + * @param int|null $post_id + * @return string + */ +function avcpdp_get_source_code_root_dir($post_id = null) { + $root_dir = get_option('wp_parser_root_import_dir'); + if (empty($post_id)) { + $post_id = get_the_ID(); + if (!empty($post_id)) { + $sourceterms = avcpdp_get_post_source_type_terms($post_id); + if (!empty($sourceterms['name'])) { + $dir = get_term_meta( + $sourceterms['name']->term_id, + 'wp_parser_root_import_dir', + true + ); + $root_dir = !empty($dir) ? $dir : $root_dir; + } + } + } + if (isset($_ENV['AVC_NODE_ENV']) && $_ENV['AVC_NODE_ENV'] === 'development') { + $root_dir = str_replace('/app/', '/var/www/html/', $root_dir); + } + + return $root_dir ? trailingslashit($root_dir) : ABSPATH; +} + +/** + * Retrieve an explanation for the given post. + * + * @param int|WP_Post $post Post ID or WP_Post object. + * @param bool $published Optional. Whether to only retrieve the explanation if it's published. + * Default false. + * @return WP_Post|null WP_Post object for the Explanation, null otherwise. + */ +function avcpdp_get_explanation($post, $published = false) { + if (!$post = get_post($post)) { + return null; + } + + $args = [ + 'post_type' => 'wporg_explanations', + 'post_parent' => $post->ID, + 'no_found_rows' => true, + 'posts_per_page' => 1, + ]; + + if (true === $published) { + $args['post_status'] = 'publish'; + } + + $explanation = get_children($args, OBJECT); + + if (empty($explanation)) { + return null; + } + + $explanation = reset($explanation); + + if (!$explanation) { + return null; + } + return $explanation; +} + +/** + * Retrieve data from an explanation post field. + * + * Works only for published explanations. + * + * @see get_post_field() + * + * @param string $field Post field name. + * @param int|WP_Post $post Post ID or object for the function, hook, class, or method post + * to retrieve an explanation field for. + * @param string $context Optional. How to filter the field. Accepts 'raw', 'edit', 'db', + * or 'display'. Default 'display'. + * @return string The value of the post field on success, empty string on failure. + */ +function avcpdp_get_explanation_field($field, $post, $context = 'display') { + if (!$explanation = avcpdp_get_explanation($post, $published = true)) { + return ''; + } + + return get_post_field($field, $explanation, $context); +} + +/** + * Retrieve the post content from an explanation post. + * + * @param int|WP_Post $_post Post ID or object for the function, hook, class, or method post + * to retrieve an explanation field for. + * @return string The post content of the explanation. + */ +function avcpdp_get_explanation_content($_post) { + global $post; + + // Temporarily remove filter. + remove_filter('the_content', ['DevHub_Formatting', 'fix_unintended_markdown'], 1); + + // Store original global post. + $orig = $post; + + // Set global post to the explanation post. + $post = avcpdp_get_explanation($_post); + + // Get explanation's raw post content. + $content = ''; + if ( + !empty($_GET['wporg_explanations_preview_nonce']) + && + false !== wp_verify_nonce($_GET['wporg_explanations_preview_nonce'], 'post_preview_' . $post->ID) + ) { + $preview = wp_get_post_autosave($post->ID); + + if (is_object($preview)) { + $post = $preview; + $content = get_post_field('post_content', $preview, 'display'); + } + } else { + $content = avcpdp_get_explanation_field('post_content', $_post); + } + + // Pass the content through expected content filters. + $content = apply_filters('the_content', apply_filters('get_the_content', $content)); + + // Restore original global post. + $post = $orig; + + // Restore filter. + add_filter('the_content', ['DevHub_Formatting', 'fix_unintended_markdown'], 1); + + return $content; +} diff --git a/src/js/explanations.js b/src/js/explanations.js new file mode 100644 index 0000000..0b2b572 --- /dev/null +++ b/src/js/explanations.js @@ -0,0 +1,108 @@ +/** + * Explanations JS. + */ + +(function ($) { + // + // Explanations AJAX handlers. + // + + var statusLabel = $("#status-label"), + createLink = $("#create-expl"), + unPublishLink = $("#unpublish-expl"), + rowActions = $("#expl-row-actions"); + + var rowCreateLink = $(".create-expl"); + + /** + * AJAX handler for creating and associating a new explanation post. + * + * @param {object} event Event object. + */ + function createExplanation(event) { + event.preventDefault(); + + wp.ajax.send("new_explanation", { + success: createExplSuccess, + error: createExplError, + data: { + nonce: $(this).data("nonce"), + post_id: $(this).data("id"), + context: event.data.context, + }, + }); + } + + /** + * Success callback for creating a new explanation via AJAX. + * + * @param {object} data Data response object. + */ + function createExplSuccess(data) { + var editLink = + '' + + wporg.editContentLabel + + ""; + + if ("edit" == data.context) { + // Action in the parsed post type edit screen. + createLink.hide(); + rowActions.html(editLink); + statusLabel.text(wporg.statusLabel.draft); + } else { + // Row link in the list table. + $("#post-" + data.parent_id + " .add-expl").html(editLink + " | "); + } + } + + /** + * Error callback for creating a new explanation via AJAX. + * + * @param {object} data Data response object. + */ + function createExplError(data) {} + + /** + * Handler for un-publishing an existing Explanation. + * + * @param {object} event Event object. + */ + function unPublishExplantaion(event) { + event.preventDefault(); + + wp.ajax.send("un_publish", { + success: unPublishSuccess, + error: unPublishError, + data: { + nonce: $(this).data("nonce"), + post_id: $(this).data("id"), + }, + }); + } + + /** + * Success callback for un-publishing an explanation via AJAX. + * + * @param {object} data Data response object. + */ + function unPublishSuccess(data) { + if (statusLabel.hasClass("pending") || statusLabel.hasClass("publish")) { + statusLabel.removeClass("pending publish").text(wporg.statusLabel.draft); + } + unPublishLink.hide(); + } + + /** + * Error callback for un-publishing an explanation via AJAX. + * + * @param {object} data Data response object. + */ + function unPublishError(data) {} + + // Events. + createLink.on("click", { context: "edit" }, createExplanation); + rowCreateLink.on("click", { context: "list" }, createExplanation); + unPublishLink.on("click", unPublishExplantaion); +})(jQuery); diff --git a/src/js/parsed-content.js b/src/js/parsed-content.js new file mode 100644 index 0000000..e08b57c --- /dev/null +++ b/src/js/parsed-content.js @@ -0,0 +1,90 @@ +/** + * Admin extras backend JS. + */ + +(function ($) { + var ticketNumber = $("#wporg_parsed_ticket"), + attachButton = $("#wporg_ticket_attach"), + detachButton = $("#wporg_ticket_detach"), + ticketInfo = $("#wporg_ticket_info"), + spinner = $(".attachment_controls .spinner"); + + var handleTicket = function (event) { + event.preventDefault(); + + var $this = $(this), + attachAction = "attach" == event.data.action; + + spinner.addClass("is-active"); + + // Searching ... text. + if (attachAction) { + ticketInfo.text(wporgParsedContent.searchText); + } + + var request = wp.ajax.post( + attachAction ? "wporg_attach_ticket" : "wporg_detach_ticket", + { + ticket: ticketNumber.val(), + nonce: $this.data("nonce"), + post_id: $this.data("id"), + } + ); + + // Success. + request.done(function (response) { + // Refresh the nonce. + $this.data("nonce", response.new_nonce); + + // Hide or show the parsed content boxes. + $(".wporg_parsed_content").each(function () { + attachAction ? $(this).show() : $(this).hide(); + }); + + $(".wporg_parsed_readonly").each(function () { + attachAction ? $(this).hide() : $(this).show(); + }); + + var otherButton = attachAction ? detachButton : attachButton; + + // Toggle the buttons. + $this.hide(); + otherButton.css("display", "inline-block"); + + // Update the ticket info text. + ticketInfo.html(response.message).show(); + + // Clear the ticket number when detaching. + if (!attachAction) { + ticketNumber.val(""); + } + + spinner.removeClass("is-active"); + + // Set or unset the ticket link icon. + $(".ticket_info_icon").toggleClass( + "dashicons dashicons-external", + attachAction + ); + + // Set the ticket number to readonly when a ticket is attached. + attachAction + ? ticketNumber.prop("readonly", "readonly") + : ticketNumber.removeAttr("readonly"); + }); + + // Error. + request.fail(function (response) { + // Refresh the nonce. + $this.data("nonce", response.new_nonce); + + // Retry text. + ticketInfo.text(wporgParsedContent.retryText); + + spinner.removeClass("is-active"); + }); + }; + + attachButton.on("click", { action: "attach" }, handleTicket); + detachButton.on("click", { action: "detach" }, handleTicket); +})(jQuery); diff --git a/src/styles/admin.css b/src/styles/admin.css new file mode 100644 index 0000000..83cf799 --- /dev/null +++ b/src/styles/admin.css @@ -0,0 +1,123 @@ +/* =Admin CSS +----------------------------------------------- */ +#wporg_parsed_ticket { + width: 100px; +} + +#ticket_info_icon { + font-size: 14px; + color: #a00; +} + +.attachment_controls .spinner { + position: relative; + margin-top: 3px; + bottom: 4px; + float: none; +} + +.attachment_controls { + margin-bottom: 10px; + display: block; +} + +/* Explanations */ +.fixed .column-has_explanation { + width: 2em; +} + +.fixed .column-has_explanation .dashicons { + width: 30px; +} + +.fixed tbody .column-has_explanation a { + color: #72777c; + display: inline-block; + margin-top: 4px; +} + +.fixed tbody .column-has_explanation a:focus, .fixed tbody .column-has_explanation a:hover { + color: #0073aa; +} + +.fixed tbody .column-has_explanation a .dashicons { + font-size: 26px; +} + +@media screen and (max-width: 782px) { + .fixed tbody .column-has_explanation a .screen-reader-text { + position: static; + -webkit-clip-path: none; + clip-path: none; + width: auto; + height: auto; + margin: 0; + } +} + +@media screen and (max-width: 782px) { + .fixed tbody .column-has_explanation a [aria-hidden="true"] { + display: none; + } +} + +.post-type-wporg_explanations .page-title-action { + display: none; +} + +.expl-row-actions { + display: block; +} + +.expl-row-actions a { + display: inline-block; +} + +.expl-row-actions a:first-child { + padding-right: 6px; + padding-left: 0; +} + +.expl-row-actions a:nth-child(n+2) { + padding-left: 8px; + border-left: 1px solid #ccc; +} + +.status { + font-weight: bold; +} + +.status.pending { + color: red; +} + +.status.publish { + color: green; +} + +.post-type-wp-parser-function .form-table th, +.post-type-wp-parser-class .form-table th, +.post-type-wp-parser-method .form-table th, +.post-type-wp-parser-hook .form-table th { + padding-top: 10px; + padding-bottom: 10px; +} + +.post-type-wp-parser-function .form-table td, +.post-type-wp-parser-class .form-table td, +.post-type-wp-parser-method .form-table td, +.post-type-wp-parser-hook .form-table td { + padding: 10px; +} + +.post-type-wp-parser-function .form-table td p, +.post-type-wp-parser-class .form-table td p, +.post-type-wp-parser-method .form-table td p, +.post-type-wp-parser-hook .form-table td p { + margin-top: 0; +} + +/* Parsed Content Meta Box */ +.wporg_parsed_content { + width: 100%; +} diff --git a/lib/template-functions.php b/src/template-functions.php similarity index 100% rename from lib/template-functions.php rename to src/template-functions.php From e3bc4845b5f5cf64a1e59001a3fce88353223eb1 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Mon, 23 Aug 2021 14:17:28 +0900 Subject: [PATCH 06/66] fix: fix hierarchical taxonomy cache for source-type not being cleared by force deleting during import --- lib/class-importer.php | 1 + src/api-functions.php | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/class-importer.php b/lib/class-importer.php index 673c40f..bb760cd 100644 --- a/lib/class-importer.php +++ b/lib/class-importer.php @@ -283,6 +283,7 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio * https://core.trac.wordpress.org/ticket/14485 * http://wordpress.stackexchange.com/questions/8357/inserting-terms-in-an-hierarchical-taxonomy */ + delete_option("{$this->taxonomy_source_type}_children"); delete_option("{$this->taxonomy_package}_children"); delete_option("{$this->taxonomy_since_version}_children"); diff --git a/src/api-functions.php b/src/api-functions.php index 8457aab..b10754d 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -70,6 +70,29 @@ function avcpdp_get_post_source_type_terms($post_id = null) { return $res; } +/** + * Returns list of child terms for the source type taxonomy "plugin" term + * + * @author Evan D Shaw + * @return array + */ +function avcpdp_get_source_type_plugin_terms() { + $term = get_term_by('slug', 'plugin', WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); + if (empty($term)) { + return []; + } + + $pterms = get_terms([ + 'parent' => $term->term_id, + 'taxonomy' => WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG, + ]); + if (empty($pterms) || $pterms instanceof WP_Error) { + return []; + } + + return $pterms; +} + /** * Retrieve the root directory of the parsed WP code. * From 023614c11c34116fb558cb587681d21f0155af70 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Mon, 23 Aug 2021 17:41:00 +0900 Subject: [PATCH 07/66] feat: add function that returns the 'plugin' source type term --- src/api-functions.php | 22 +++++++++++++++++++++- src/template-functions.php | 10 ---------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/api-functions.php b/src/api-functions.php index b10754d..dae8faf 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -1,5 +1,15 @@ + * @return string + */ +function avcpdp_get_source_type_taxonomy_slug() { + return WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG; +} + /** * Get an array of all parsed post types. * @@ -70,6 +80,16 @@ function avcpdp_get_post_source_type_terms($post_id = null) { return $res; } +/** + * Returns source type taxonomy "plugin" term + * + * @author Evan D Shaw + * @return WP_Term|false + */ +function avcpdp_get_source_type_plugin_term() { + return get_term_by('slug', 'plugin', WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); +} + /** * Returns list of child terms for the source type taxonomy "plugin" term * @@ -77,7 +97,7 @@ function avcpdp_get_post_source_type_terms($post_id = null) { * @return array */ function avcpdp_get_source_type_plugin_terms() { - $term = get_term_by('slug', 'plugin', WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); + $term = avcpdp_get_source_type_plugin_term(); if (empty($term)) { return []; } diff --git a/src/template-functions.php b/src/template-functions.php index be1749c..b3d9bbc 100644 --- a/src/template-functions.php +++ b/src/template-functions.php @@ -1,11 +1 @@ - * @return string - */ -function avcpdp_get_source_type_taxonomy_slug() { - return WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG; -} From 2f3be9466dcff778cf9ba2799755a533ededc511 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 25 Aug 2021 12:40:14 +0900 Subject: [PATCH 08/66] feat: add rewrite rules for all wp-parser-* post types. Force 404 redirects for permalinks with the wrong source type terms --- lib/class-plugin.php | 108 +++++++++++++++++++++++++++++++++--- lib/class-relationships.php | 6 +- plugin.php | 8 +++ src/Master.php | 66 ++++++++++++++++++++++ 4 files changed, 180 insertions(+), 8 deletions(-) diff --git a/lib/class-plugin.php b/lib/class-plugin.php index 15f6b4c..9bce1b9 100644 --- a/lib/class-plugin.php +++ b/lib/class-plugin.php @@ -8,6 +8,21 @@ class Plugin { const SOURCE_TYPE_TAX_SLUG = 'wp-parser-source-type'; + const SOURCE_TYPE_TERM_SLUGS = ['composer-package', 'plugin', 'theme']; + const WP_PARSER_PT_MAP = [ + 'wp-parser-function' => [ + 'urlpiece' => 'functions', + 'post_type' => 'wp-parser-function', + ], + 'wp-parser-class' => [ + 'urlpiece' => 'classes', + 'post_type' => 'wp-parser-class', + ], + 'wp-parser-hook' => [ + 'urlpiece' => 'hooks', + 'post_type' => 'wp-parser-hook', + ], + ]; /** * @var \WP_Parser\Relationships @@ -30,6 +45,50 @@ public function on_load() { add_filter('term_link', [$this, 'taxonomy_permalink'], 10, 3); } + /** + * Adds rewrite rules for the `wp-parser-(function|method|class|hook)` post + * types. + * + * Rewrites URLs to be unique on a per source-type basis. + * + * For example, given a source type of `plugin`, a `plugin` child term slug of `my-plugin`, + * and a function named `my-function`, the URL would be `/reference/plugin/my-plugin/functions/my-function`. + * + * @author Evan D Shaw + * @return void + */ + public static function addRewriteRules() { + // Add rewrite rules for Functions, Classes, and Hooks + $sttax = self::SOURCE_TYPE_TAX_SLUG; + $stterms = implode('|', self::SOURCE_TYPE_TERM_SLUGS); + foreach (self::WP_PARSER_PT_MAP as $key => $info) { + $urlpiece = $info['urlpiece']; + $ptype = $info['post_type']; + add_rewrite_rule( + "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/([^/]+)/?", + "index.php?post_type={$ptype}&taxonomy={$sttax}&term=\$matches[1],\$matches[2]&name=\$matches[3]", + 'top' + ); + add_rewrite_rule( + "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/?", + "index.php?post_type={$ptype}&taxonomy={$sttax}&term=\$matches[1],\$matches[2]", + 'top' + ); + } + + // Add rewrite rules for Methods + add_rewrite_rule( + "reference/($stterms)/([a-z_\-]{1,32})/classes/page/([0-9]{1,})/?\$", + "index.php?post_type=wp-parser-class&taxonomy={$sttax}&term=\$matches[1],\$matches[2]&paged=\$matches[3]", + 'top' + ); + add_rewrite_rule( + "reference/($stterms)/([a-z_\-]{1,32})/classes/([^/]+)/([^/]+)/?\$", + "index.php?post_type=wp-parser-method&taxonomy={$sttax}&term=\$matches[1],\$matches[2]&name=\$matches[3]-\$matches[4]", + 'top' + ); + } + /** * Register the function and class post types */ @@ -43,6 +102,8 @@ public function register_post_types() { 'title', ]; + self::addRewriteRules(); + // Functions if (!post_type_exists('wp-parser-function')) { register_post_type('wp-parser-function', [ @@ -77,8 +138,6 @@ public function register_post_types() { // Methods if (!post_type_exists('wp-parser-method')) { - add_rewrite_rule('reference/classes/page/([0-9]{1,})/?$', 'index.php?post_type=wp-parser-class&paged=$matches[1]', 'top'); - add_rewrite_rule('reference/classes/([^/]+)/([^/]+)/?$', 'index.php?post_type=wp-parser-method&name=$matches[1]-$matches[2]', 'top'); register_post_type('wp-parser-method', [ 'has_archive' => 'reference/methods', 'label' => __('Methods', 'wporg'), @@ -330,15 +389,50 @@ public function register_taxonomies() { public function method_permalink($link, $post) { global $wp_rewrite; - if (!$wp_rewrite->using_permalinks() || ('wp-parser-method' !== $post->post_type)) { + if (!$wp_rewrite->using_permalinks()) { return $link; } - $parts = explode('-', $post->post_name); - $method = array_pop($parts); - $class = implode('-', $parts); + $post_types = ['wp-parser-function', 'wp-parser-hook', 'wp-parser-class', 'wp-parser-method']; + + $stterm = null; + $stchildterm = null; + if (in_array($post->post_type, $post_types, true)) { + $stterms = wp_get_post_terms($post->ID, self::SOURCE_TYPE_TAX_SLUG); + foreach ($stterms as $t) { + if ( + $t->parent === 0 && + in_array($t->slug, self::SOURCE_TYPE_TERM_SLUGS, true) + ) { + $stterm = $t; + } else { + $stchildterm = $t; + } + } + } + + if ($stterm === null || $stchildterm === null) { + return $link; + } - return home_url(user_trailingslashit("reference/classes/$class/$method")); + if ('wp-parser-method' === $post->post_type) { + $parts = explode('-', $post->post_name); + $method = array_pop($parts); + $class = implode('-', $parts); + return home_url(user_trailingslashit( + "reference/{$stterm->slug}/{$stchildterm->slug}/classes/{$class}/{$method}" + )); + } + + array_pop($post_types); + if (in_array($post->post_type, $post_types, true)) { + $urlpiece = self::WP_PARSER_PT_MAP[$post->post_type]['urlpiece']; + return home_url(user_trailingslashit( + "reference/{$stterm->slug}/{$stchildterm->slug}/{$urlpiece}/{$post->post_name}" + )); + } + + return $link; } public function taxonomy_permalink($link, $term, $taxonomy) { diff --git a/lib/class-relationships.php b/lib/class-relationships.php index 6fe1525..085dd99 100644 --- a/lib/class-relationships.php +++ b/lib/class-relationships.php @@ -317,7 +317,7 @@ public function wp_parser_ending_import(Importer $importer) { WP_CLI::log('Removing current relationships...'); } - /** + /* * The following lines delete connections for ALL sources which * is why we delete with a custom query below. */ @@ -343,6 +343,10 @@ public function wp_parser_ending_import(Importer $importer) { 'methods_to_hooks', ] as $p2p_type ) { + /* + * This query deletes only associations for the current plugin/theme/composer-package + * being imported. + */ $wpdb->query( $wpdb->prepare( "DELETE p2p, p2p_meta FROM {$p2p} p2p diff --git a/plugin.php b/plugin.php index 22a4b74..b318a77 100644 --- a/plugin.php +++ b/plugin.php @@ -36,6 +36,14 @@ register_activation_hook(__FILE__, ['P2P_Storage', 'init']); register_activation_hook(__FILE__, ['P2P_Storage', 'install']); +register_activation_hook(__FILE__, function () { + (new WP_Parser\Plugin())->register_post_types(); + flush_rewrite_rules(); +}); + +register_deactivation_hook(__FILE__, function () { + flush_rewrite_rules(); +}); // TODO safer handling for uninstall // register_uninstall_hook( __FILE__, array( 'P2P_Storage', 'uninstall' ) ); diff --git a/src/Master.php b/src/Master.php index bffc579..9b646fd 100644 --- a/src/Master.php +++ b/src/Master.php @@ -14,6 +14,7 @@ class Master * @return void */ public static function init() { + add_filter('pre_handle_404', [get_class(), 'force404onWrongSourceType'], 10, 2); add_action('init', function () { add_action('pre_get_posts', [get_class(), 'preGetPosts'], 10, 1); }); @@ -40,4 +41,69 @@ public static function preGetPosts($query) { // For search query modifications see DevHub_Search. } + + /** + * 404s for `wp-parser-{function|class|method|hook}` post types for single pages + * if the source-type taxonomy term slug and it's child term slug are not set for the post. + * + * For example, given this URL: `/reference/plugin/my-plugin/functions/my-function`, + * a 404 will be forced if the `my-function` post, which is of the `wp-parser-function` + * post type, is not associated with the `plugin` and `my-plugin` terms, which both belong + * to the `wp-parser-source-type` taxonomy, where `plugin` is one of the three default terms + * and `my-plugin` is a child term of `plugin`. + * + * This hook is used because WordPress' `get_posts` function does not process taxonomy queries + * for singular pages. + * + * Note that WordPress will try to guess the URL and redirect to the correct permalink for + * the post even if we return a 404. Whether the guess succeeds depends partially on the + * URL rewrite rules. Our rewrite rules cause the redirect to succeed as long as the source + * type provided is one of the three defaults (plugin, theme, composer-package). The source + * type child term slug can be **anything**, however. + * + * It should be investigated whether it's worth short-circuiting guess redirect behavior or not. + * + * @see wp-includes/canonical.php redirect_canonical() + * @todo Investigate if there is a more elegant way of accomplishing this. Investigate + * whether guess redirects are more or less SEO compliant + * @author Evan D Shaw + * @param bool $bool + * @param \WP_Query $query + * @return bool + */ + public static function force404onWrongSourceType($bool, $query) { + if (!$query->is_main_query()) { + return $bool; + } + if (!$query->is_singular) { + return $bool; + } + if ($query->post_count < 1) { + return $bool; + } + if (!in_array($query->post->post_type, avcpdp_get_parsed_post_types(), true)) { + return $bool; + } + if (empty($query->query['taxonomy']) || empty($query->query['term'])) { + return $bool; + } + $tax = $query->query['taxonomy']; + if ($tax !== \WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG) { + return $bool; + } + $terms = explode(',', $query->query['term']); + if (count($terms) < 2) { + return $bool; + } + $stterms = avcpdp_get_post_source_type_terms($query->post->ID); + if ($terms[0] === $stterms['type']->slug && $terms[1] === $stterms['name']->slug) { + return $bool; + } + + $query->set_404(); + status_header(404); + nocache_headers(); + + return true; + } } From 6212668bf88b9f18d30110326f9f27e997a43d29 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 25 Aug 2021 14:34:11 +0900 Subject: [PATCH 09/66] =?UTF-8?q?feat:=20add=20Role=20taxonomy=20(?= =?UTF-8?q?=E5=8C=BA=E5=88=86)=20for=20functions/methods.=20Fix=20rewrite?= =?UTF-8?q?=20rules=20for=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/class-plugin.php | 63 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/lib/class-plugin.php b/lib/class-plugin.php index 9bce1b9..703e618 100644 --- a/lib/class-plugin.php +++ b/lib/class-plugin.php @@ -7,6 +7,7 @@ */ class Plugin { + const ROLE_TAX_SLUG = 'wp-parser-role'; const SOURCE_TYPE_TAX_SLUG = 'wp-parser-source-type'; const SOURCE_TYPE_TERM_SLUGS = ['composer-package', 'plugin', 'theme']; const WP_PARSER_PT_MAP = [ @@ -58,9 +59,22 @@ public function on_load() { * @return void */ public static function addRewriteRules() { - // Add rewrite rules for Functions, Classes, and Hooks $sttax = self::SOURCE_TYPE_TAX_SLUG; $stterms = implode('|', self::SOURCE_TYPE_TERM_SLUGS); + + // Add rewrite rules for Methods + add_rewrite_rule( + "reference/($stterms)/([a-z_\-]{1,32})/classes/page/([0-9]{1,})/?\$", + "index.php?post_type=wp-parser-class&taxonomy={$sttax}&term=\$matches[1],\$matches[2]&paged=\$matches[3]", + 'top' + ); + add_rewrite_rule( + "reference/($stterms)/([a-z_\-]{1,32})/classes/([^/]+)/([^/]+)/?\$", + "index.php?post_type=wp-parser-method&taxonomy={$sttax}&term=\$matches[1],\$matches[2]&name=\$matches[3]-\$matches[4]", + 'top' + ); + + // Add rewrite rules for Functions, Classes, and Hooks foreach (self::WP_PARSER_PT_MAP as $key => $info) { $urlpiece = $info['urlpiece']; $ptype = $info['post_type']; @@ -75,18 +89,6 @@ public static function addRewriteRules() { 'top' ); } - - // Add rewrite rules for Methods - add_rewrite_rule( - "reference/($stterms)/([a-z_\-]{1,32})/classes/page/([0-9]{1,})/?\$", - "index.php?post_type=wp-parser-class&taxonomy={$sttax}&term=\$matches[1],\$matches[2]&paged=\$matches[3]", - 'top' - ); - add_rewrite_rule( - "reference/($stterms)/([a-z_\-]{1,32})/classes/([^/]+)/([^/]+)/?\$", - "index.php?post_type=wp-parser-method&taxonomy={$sttax}&term=\$matches[1],\$matches[2]&name=\$matches[3]-\$matches[4]", - 'top' - ); } /** @@ -334,6 +336,7 @@ public function register_taxonomies() { ); } + // Source Type if (!taxonomy_exists(self::SOURCE_TYPE_TAX_SLUG)) { register_taxonomy( self::SOURCE_TYPE_TAX_SLUG, @@ -377,6 +380,40 @@ public function register_taxonomies() { ['slug' => 'composer-package'] ); } + + // Role + if (!taxonomy_exists(self::ROLE_TAX_SLUG)) { + register_taxonomy( + self::ROLE_TAX_SLUG, + ['wp-parser-function', 'wp-parser-method'], + [ + 'hierarchical' => true, + 'label' => __('Role', 'wporg'), + 'public' => true, + 'rewrite' => [ + 'with_front' => false, + 'slug' => 'reference/role', + ], + 'sort' => false, + 'update_count_callback' => '_update_post_term_count', + 'show_in_rest' => true, + ] + ); + } + + // Add default role terms + $roles = [ + 'display' => __('Display', 'wp-parser'), + 'condition' => __('Condition', 'wp-parser'), + 'utility' => __('Utility', 'wp-parser'), + 'setter' => __('Setter', 'wp-parser'), + 'getter' => __('Getter', 'wp-parser'), + ]; + foreach ($roles as $slug => $label) { + if (!term_exists($slug, self::ROLE_TAX_SLUG)) { + wp_insert_term($label, self::ROLE_TAX_SLUG, ['slug' => $slug]); + } + } } /** From cc31b2344d5c31faeda183fdba3901424f0c7fb0 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 25 Aug 2021 18:34:44 +0900 Subject: [PATCH 10/66] fix: prevent namespace backslashes from being stripped by update_post_meta's invokation of wp_unslash --- lib/class-importer.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/class-importer.php b/lib/class-importer.php index bb760cd..f79acfa 100644 --- a/lib/class-importer.php +++ b/lib/class-importer.php @@ -509,6 +509,20 @@ protected function import_class(array $data, $import_ignored = false) { update_post_meta($class_id, '_wp-parser_abstract', (string)$data['abstract']); update_post_meta($class_id, '_wp-parser_extends', $data['extends']); update_post_meta($class_id, '_wp-parser_implements', $data['implements']); + + // Add slashes to types so that wp_unslash in update_post_meta doesnt remove them. + // Without the slashes it's impossible to create the reference page link + foreach ($data['properties'] as &$prop) { + if (!empty($prop['doc']) && !empty($prop['doc']['tags'])) { + foreach ($prop['doc']['tags'] as &$tag) { + if (!empty($tag['types'])) { + foreach ($tag['types'] as &$type) { + $type = addslashes($type); + } + } + } + } + } update_post_meta($class_id, '_wp-parser_properties', $data['properties']); // Now add the methods @@ -832,6 +846,18 @@ public function import_item(array $data, $parent_post_id = 0, $import_ignored = $anything_updated[] = update_post_meta($post_id, '_wp_parser_namespace', (string)addslashes($data['namespace'])); } + // Add slashes to types so that wp_unslash in update_post_meta doesnt remove them. + // Without the slashes it's impossible to create the reference page link + if (!empty($data['doc']) && !empty($data['doc']['tags'])) { + foreach ($data['doc']['tags'] as &$tag) { + if (!empty($tag['types'])) { + foreach ($tag['types'] as &$type) { + $type = addslashes($type); + } + } + } + } + $anything_updated[] = update_post_meta($post_id, '_wp-parser_line_num', (string)$data['line']); $anything_updated[] = update_post_meta($post_id, '_wp-parser_end_line_num', (string)$data['end_line']); $anything_updated[] = update_post_meta($post_id, '_wp-parser_tags', $data['doc']['tags']); From d11d440747309e7180dfa4aba8e52d299d2ee46c Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Thu, 26 Aug 2021 17:39:08 +0900 Subject: [PATCH 11/66] fix: use PR proposed in #213 to fix namespace child terms not being displayed on the namespace taxonomy page --- lib/class-importer.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/class-importer.php b/lib/class-importer.php index f79acfa..ca0e81e 100644 --- a/lib/class-importer.php +++ b/lib/class-importer.php @@ -14,7 +14,7 @@ class Importer implements LoggerAwareInterface use LoggerAwareTrait; /** - * + * */ const PROPERTY_MAP = [ 'post_type_class' => 'wp-parser-class', @@ -286,6 +286,7 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio delete_option("{$this->taxonomy_source_type}_children"); delete_option("{$this->taxonomy_package}_children"); delete_option("{$this->taxonomy_since_version}_children"); + delete_option("{$this->taxonomy_namespace}_children"); /* * Action at the end of a complete import @@ -846,7 +847,7 @@ public function import_item(array $data, $parent_post_id = 0, $import_ignored = $anything_updated[] = update_post_meta($post_id, '_wp_parser_namespace', (string)addslashes($data['namespace'])); } - // Add slashes to types so that wp_unslash in update_post_meta doesnt remove them. + // Add extra namespace slashes to types so that wp_unslash in update_post_meta doesnt remove them. // Without the slashes it's impossible to create the reference page link if (!empty($data['doc']) && !empty($data['doc']['tags'])) { foreach ($data['doc']['tags'] as &$tag) { From f9d82626168c955d49b1a6ed4c7d9fd7ca5d6ff9 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Fri, 27 Aug 2021 21:05:01 +0900 Subject: [PATCH 12/66] feat: add code-reference post_type landing pages for plugin/theme/composer-package. Add child landing pages on import --- lib/class-importer.php | 52 ++++++++++-- lib/class-plugin.php | 184 ++++++++++++++++++++++++++++++++++------- src/Master.php | 28 ++++++- 3 files changed, 223 insertions(+), 41 deletions(-) diff --git a/lib/class-importer.php b/lib/class-importer.php index ca0e81e..2ce1cfa 100644 --- a/lib/class-importer.php +++ b/lib/class-importer.php @@ -201,23 +201,40 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio } } - $parent_term = get_term_by('slug', $this->source_type_meta['type'], $this->taxonomy_source_type); - if (empty($parent_term)) { + $parent_term = get_terms([ + 'fields' => 'ids', + 'parent' => 0, + 'hide_empty' => false, + 'slug' => $this->source_type_meta['type'], + 'taxonomy' => $this->taxonomy_source_type, + ]); + if (empty($parent_term) || ($parent_term instanceof \WP_Error)) { $this->logger->error(sprintf( "Missing term for {$this->taxonomy_source_type}; check that '%1\$s' is registered.", $this->source_type_meta['type'] )); exit; } + $parent_term_id = $parent_term[0]; // Create a child term for the corresponding `wp-parser-source-type` taxonomy default term, if necessary $source_term_id = null; - $source_type_term = get_term_by('slug', $this->source_type_meta['name'], $this->taxonomy_source_type); + $source_type_term = get_terms([ + 'fields' => 'ids', + 'parent' => $parent_term_id, + 'hide_empty' => false, + 'slug' => $this->source_type_meta['name'], + 'taxonomy' => $this->taxonomy_source_type, + ]); + if ($source_type_term instanceof \WP_Error) { + $this->logger->error("An error occured getting the {$this->source_type_meta['name']} term."); + exit; + } if (empty($source_type_term)) { $source_type_term = wp_insert_term( $this->source_type_meta['name'], $this->taxonomy_source_type, - ['parent' => $parent_term->term_id] + ['parent' => $parent_term_id] ); if ($source_type_term instanceof \WP_Error) { @@ -229,12 +246,35 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio } $source_term_id = $source_type_term['term_id']; } else { - $source_term_id = $source_type_term->term_id; + $source_term_id = $source_type_term[0]; } // Set term data so we can create relationships later $this->source_type_meta['type_term_id'] = $source_term_id; - $this->source_type_meta['type_parent_term_id'] = $parent_term->term_id; + $this->source_type_meta['type_parent_term_id'] = $parent_term_id; + + // Create code-reference child page for the current plugin/theme/composer-package + $pageslug = $this->source_type_meta['type']; + $parentpostmap = Plugin::getCodeReferenceSourceTypePostMap(); + if (!empty($parentpostmap[$pageslug]['post_id'])) { + $post_id = wp_insert_post([ + 'post_parent' => $parentpostmap[$pageslug]['post_id'], + 'post_name' => $this->source_type_meta['name'], + 'post_title' => $this->source_type_meta['name'], + 'post_content' => '', + 'post_status' => 'publish', + 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, + ]); + + if (!empty($post_id) && !($post_id instanceof \WP_Error)) { + // Assign `wp-parser-source-type` term + wp_set_object_terms( + $post_id, + [$this->source_type_meta['type_parent_term_id'], $this->source_type_meta['type_term_id']], + $this->taxonomy_source_type + ); + } + } // Specifically import WP version file first to get version number. $ver_file = array_filter($data, function ($f) { diff --git a/lib/class-plugin.php b/lib/class-plugin.php index 703e618..77fc3c4 100644 --- a/lib/class-plugin.php +++ b/lib/class-plugin.php @@ -8,6 +8,7 @@ class Plugin { const ROLE_TAX_SLUG = 'wp-parser-role'; + const CODE_REFERENCE_POST_TYPE = 'code-reference'; const SOURCE_TYPE_TAX_SLUG = 'wp-parser-source-type'; const SOURCE_TYPE_TERM_SLUGS = ['composer-package', 'plugin', 'theme']; const WP_PARSER_PT_MAP = [ @@ -42,7 +43,7 @@ public function on_load() { add_filter('wp_parser_get_arguments', [$this, 'make_args_safe']); add_filter('wp_parser_return_type', [$this, 'humanize_separator']); - add_filter('post_type_link', [$this, 'method_permalink'], 10, 2); + add_filter('post_type_link', [$this, 'post_permalink'], 10, 2); add_filter('term_link', [$this, 'taxonomy_permalink'], 10, 3); } @@ -61,16 +62,22 @@ public function on_load() { public static function addRewriteRules() { $sttax = self::SOURCE_TYPE_TAX_SLUG; $stterms = implode('|', self::SOURCE_TYPE_TERM_SLUGS); + $stterms = str_replace('-', '\-', $stterms); // Add rewrite rules for Methods add_rewrite_rule( - "reference/($stterms)/([a-z_\-]{1,32})/classes/page/([0-9]{1,})/?\$", - "index.php?post_type=wp-parser-class&taxonomy={$sttax}&term=\$matches[1],\$matches[2]&paged=\$matches[3]", + "reference/($stterms)/([a-z_\-]{1,32})/methods/page/([0-9]{1,})/?", + "index.php?post_type=wp-parser-method&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&paged=\$matches[3]", 'top' ); add_rewrite_rule( "reference/($stterms)/([a-z_\-]{1,32})/classes/([^/]+)/([^/]+)/?\$", - "index.php?post_type=wp-parser-method&taxonomy={$sttax}&term=\$matches[1],\$matches[2]&name=\$matches[3]-\$matches[4]", + "index.php?post_type=wp-parser-method&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&name=\$matches[3]-\$matches[4]", + 'top' + ); + add_rewrite_rule( + "reference/($stterms)/([a-z_\-]{1,32})/methods/?\$", + "index.php?post_type=wp-parser-method&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]", 'top' ); @@ -79,13 +86,18 @@ public static function addRewriteRules() { $urlpiece = $info['urlpiece']; $ptype = $info['post_type']; add_rewrite_rule( - "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/([^/]+)/?", - "index.php?post_type={$ptype}&taxonomy={$sttax}&term=\$matches[1],\$matches[2]&name=\$matches[3]", + "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/page/([0-9]{1,})/?", + "index.php?post_type={$ptype}&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&paged=\$matches[3]", + 'top' + ); + add_rewrite_rule( + "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/([^/]+)/?\$", + "index.php?post_type={$ptype}&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&name=\$matches[3]", 'top' ); add_rewrite_rule( - "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/?", - "index.php?post_type={$ptype}&taxonomy={$sttax}&term=\$matches[1],\$matches[2]", + "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/?\$", + "index.php?post_type={$ptype}&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]", 'top' ); } @@ -107,7 +119,7 @@ public function register_post_types() { self::addRewriteRules(); // Functions - if (!post_type_exists('wp-parser-function')) { + // if (!post_type_exists('wp-parser-function')) { register_post_type('wp-parser-function', [ 'has_archive' => 'reference/functions', 'label' => __('Functions', 'wporg'), @@ -136,10 +148,10 @@ public function register_post_types() { 'supports' => $supports, 'show_in_rest' => true, ]); - } + // } // Methods - if (!post_type_exists('wp-parser-method')) { + // if (!post_type_exists('wp-parser-method')) { register_post_type('wp-parser-method', [ 'has_archive' => 'reference/methods', 'label' => __('Methods', 'wporg'), @@ -162,16 +174,16 @@ public function register_post_types() { 'public' => true, 'rewrite' => [ 'feeds' => false, - 'slug' => 'classes', + 'slug' => 'reference/methods', 'with_front' => false, ], 'supports' => $supports, 'show_in_rest' => true, ]); - } + // } // Classes - if (!post_type_exists('wp-parser-class')) { + // if (!post_type_exists('wp-parser-class')) { register_post_type('wp-parser-class', [ 'has_archive' => 'reference/classes', 'label' => __('Classes', 'wporg'), @@ -200,10 +212,10 @@ public function register_post_types() { 'supports' => $supports, 'show_in_rest' => true, ]); - } + // } // Hooks - if (!post_type_exists('wp-parser-hook')) { + // if (!post_type_exists('wp-parser-hook')) { register_post_type('wp-parser-hook', [ 'has_archive' => 'reference/hooks', 'label' => __('Hooks', 'wporg'), @@ -232,6 +244,62 @@ public function register_post_types() { 'supports' => $supports, 'show_in_rest' => true, ]); + // } + + // Reference Landing Pages + // if (!post_type_exists('code-reference')) { + register_post_type('code-reference', [ + 'has_archive' => false, + 'exclude_from_search' => true, + 'publicly_queryable' => true, + 'hierarchical' => true, + 'label' => __('Reference Landing Pages', 'wporg'), + 'labels' => [ + 'name' => __('Reference Landing Pages', 'wporg'), + 'singular_name' => __('Reference Landing Page', 'wporg'), + 'all_items' => __('Reference Landing Pages', 'wporg'), + 'new_item' => __('New Reference Landing Page', 'wporg'), + 'add_new' => __('Add New', 'wporg'), + 'add_new_item' => __('Add New Reference Landing Page', 'wporg'), + 'edit_item' => __('Edit Reference Landing Page', 'wporg'), + 'view_item' => __('View Reference Landing Page', 'wporg'), + 'search_items' => __('Search Reference Landing Pages', 'wporg'), + 'not_found' => __('No Pages found', 'wporg'), + 'not_found_in_trash' => __('No Pages found in trash', 'wporg'), + 'menu_name' => __('Reference Landing Pages', 'wporg'), + ], + 'menu_icon' => 'dashicons-admin-page', + 'menu_position' => 20, + 'public' => true, + 'rewrite' => [ + 'slug' => 'reference', + 'with_front' => false, + 'pages' => false, + ], + 'supports' => [ + 'page-attributes', + 'custom-fields', + 'editor', + 'excerpt', + 'revisions', + 'title', + ], + 'show_in_rest' => false, + ]); + // } + + // Add default source-type landing pages + $parentpostmap = self::getCodeReferenceSourceTypePostMap(); + foreach ($parentpostmap as $slug => $info) { + if (empty($parentpostmap[$slug]['post_id'])) { + wp_insert_post([ + 'post_name' => $slug, + 'post_title' => $info['title'], + 'post_content' => '', + 'post_status' => 'publish', + 'post_type' => self::CODE_REFERENCE_POST_TYPE, + ]); + } } } @@ -242,7 +310,7 @@ public function register_taxonomies() { $object_types = avcpdp_get_parsed_post_types(); // Files - if (!taxonomy_exists('wp-parser-source-file')) { + // if (!taxonomy_exists('wp-parser-source-file')) { register_taxonomy( 'wp-parser-source-file', $object_types, @@ -278,10 +346,10 @@ public function register_taxonomies() { 'show_in_rest' => true, ] ); - } + // } // Package - if (!taxonomy_exists('wp-parser-package')) { + // if (!taxonomy_exists('wp-parser-package')) { register_taxonomy( 'wp-parser-package', $object_types, @@ -298,10 +366,10 @@ public function register_taxonomies() { 'show_in_rest' => true, ] ); - } + // } // @since - if (!taxonomy_exists('wp-parser-since')) { + // if (!taxonomy_exists('wp-parser-since')) { register_taxonomy( 'wp-parser-since', $object_types, @@ -318,10 +386,10 @@ public function register_taxonomies() { 'show_in_rest' => true, ] ); - } + // } // Namespaces - if (!taxonomy_exists('wp-parser-namespace')) { + // if (!taxonomy_exists('wp-parser-namespace')) { register_taxonomy( 'wp-parser-namespace', $object_types, @@ -334,13 +402,13 @@ public function register_taxonomies() { 'update_count_callback' => '_update_post_term_count', ] ); - } + // } // Source Type - if (!taxonomy_exists(self::SOURCE_TYPE_TAX_SLUG)) { + // if (!taxonomy_exists(self::SOURCE_TYPE_TAX_SLUG)) { register_taxonomy( self::SOURCE_TYPE_TAX_SLUG, - $object_types, + array_merge($object_types, ['code-reference']), [ 'hierarchical' => true, 'label' => __('Source Type', 'wporg'), @@ -348,13 +416,14 @@ public function register_taxonomies() { 'rewrite' => [ 'with_front' => false, 'slug' => 'reference/source-type', + 'hierarchical' => false, ], 'sort' => false, 'update_count_callback' => '_update_post_term_count', 'show_in_rest' => true, ] ); - } + // } // Add default source-type terms if (!term_exists('plugin', self::SOURCE_TYPE_TAX_SLUG)) { @@ -382,7 +451,7 @@ public function register_taxonomies() { } // Role - if (!taxonomy_exists(self::ROLE_TAX_SLUG)) { + // if (!taxonomy_exists(self::ROLE_TAX_SLUG)) { register_taxonomy( self::ROLE_TAX_SLUG, ['wp-parser-function', 'wp-parser-method'], @@ -399,7 +468,7 @@ public function register_taxonomies() { 'show_in_rest' => true, ] ); - } + // } // Add default role terms $roles = [ @@ -414,16 +483,69 @@ public function register_taxonomies() { wp_insert_term($label, self::ROLE_TAX_SLUG, ['slug' => $slug]); } } + + $parentpostmap = self::getCodeReferenceSourceTypePostMap(); + foreach ($parentpostmap as $slug => $info) { + if (empty($parentpostmap[$slug]['post_id'])) { + continue; + } + + $parent_term = get_terms([ + 'fields' => 'ids', + 'parent' => 0, + 'hide_empty' => false, + 'slug' => $slug, + 'taxonomy' => self::SOURCE_TYPE_TAX_SLUG, + ]); + if (empty($parent_term) || ($parent_term instanceof \WP_Error)) { + continue; + } + $parent_term_id = $parent_term[0]; + // Assign `wp-parser-source-type` term + wp_set_object_terms( + $parentpostmap[$slug]['post_id'], + [$parent_term_id], + self::SOURCE_TYPE_TAX_SLUG + ); + } + } + + public static function getCodeReferenceSourceTypePostMap() { + $parentpostmap = [ + 'plugin' => [ + 'title' => __('Plugin', 'wp-parser'), + 'post_id' => null, + ], + 'theme' => [ + 'title' => __('Theme', 'wp-parser'), + 'post_id' => null, + ], + 'composer-package' => [ + 'title' => __('Composer Package', 'wp-parser'), + 'post_id' => null, + ], + ]; + foreach ($parentpostmap as $slug => $info) { + $posts = get_posts([ + 'name' => $slug, + 'post_type' => self::CODE_REFERENCE_POST_TYPE, + ]); + if (!empty($posts)) { + $parentpostmap[$slug]['post_id'] = $posts[0]->ID; + } + } + + return $parentpostmap; } /** - * Filters the permalink for a wp-parser-method post. + * Filters the permalink for a wp-parser-* post. * * @param string $link The post's permalink. * @param \WP_Post $post The post in question. * @return string */ - public function method_permalink($link, $post) { + public function post_permalink($link, $post) { global $wp_rewrite; if (!$wp_rewrite->using_permalinks()) { diff --git a/src/Master.php b/src/Master.php index 9b646fd..3bc3c5a 100644 --- a/src/Master.php +++ b/src/Master.php @@ -14,6 +14,7 @@ class Master * @return void */ public static function init() { + add_action('parse_tax_query', [get_class(), 'taxQueryNoChildren'], 10, 1); add_filter('pre_handle_404', [get_class(), 'force404onWrongSourceType'], 10, 2); add_action('init', function () { add_action('pre_get_posts', [get_class(), 'preGetPosts'], 10, 1); @@ -42,6 +43,24 @@ public static function preGetPosts($query) { // For search query modifications see DevHub_Search. } + public static function taxQueryNoChildren(\WP_Query $query) { + if (!$query->tax_query) { + return; + } + if (empty($query->query['taxonomy']) || $query->query['taxonomy'] !== \WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG) { + return; + } + if (empty($query->tax_query->queries)) { + return; + } + if ($query->tax_query->queries[0]['taxonomy'] !== \WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG) { + return; + } + + $query->tax_query->queries[0]['operator'] = 'AND'; + $query->tax_query->queries[0]['include_children'] = false; + } + /** * 404s for `wp-parser-{function|class|method|hook}` post types for single pages * if the source-type taxonomy term slug and it's child term slug are not set for the post. @@ -84,14 +103,15 @@ public static function force404onWrongSourceType($bool, $query) { if (!in_array($query->post->post_type, avcpdp_get_parsed_post_types(), true)) { return $bool; } - if (empty($query->query['taxonomy']) || empty($query->query['term'])) { + $taxslug = \WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG; + if (empty($query->query['taxonomy']) || empty($query->query[$taxslug])) { return $bool; } - $tax = $query->query['taxonomy']; - if ($tax !== \WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG) { + $qtax = $query->query['taxonomy']; + if ($qtax !== $taxslug) { return $bool; } - $terms = explode(',', $query->query['term']); + $terms = explode(',', $query->query[$taxslug]); if (count($terms) < 2) { return $bool; } From df60ab09a6756b7dee756e523fabfea9263d517c Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Mon, 30 Aug 2021 11:37:08 +0900 Subject: [PATCH 13/66] fix: only create reference landing page on import if it doesn't exist already --- lib/class-importer.php | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/lib/class-importer.php b/lib/class-importer.php index 2ce1cfa..88ce8e3 100644 --- a/lib/class-importer.php +++ b/lib/class-importer.php @@ -257,22 +257,29 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio $pageslug = $this->source_type_meta['type']; $parentpostmap = Plugin::getCodeReferenceSourceTypePostMap(); if (!empty($parentpostmap[$pageslug]['post_id'])) { - $post_id = wp_insert_post([ + $refpage = get_posts([ + 'name' => $this->source_type_meta['name'], 'post_parent' => $parentpostmap[$pageslug]['post_id'], - 'post_name' => $this->source_type_meta['name'], - 'post_title' => $this->source_type_meta['name'], - 'post_content' => '', - 'post_status' => 'publish', 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, ]); - - if (!empty($post_id) && !($post_id instanceof \WP_Error)) { - // Assign `wp-parser-source-type` term - wp_set_object_terms( - $post_id, - [$this->source_type_meta['type_parent_term_id'], $this->source_type_meta['type_term_id']], - $this->taxonomy_source_type - ); + if (empty($refpage)) { + $post_id = wp_insert_post([ + 'post_parent' => $parentpostmap[$pageslug]['post_id'], + 'post_name' => $this->source_type_meta['name'], + 'post_title' => $this->source_type_meta['name'], + 'post_content' => '', + 'post_status' => 'publish', + 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, + ]); + + if (!empty($post_id) && !($post_id instanceof \WP_Error)) { + // Assign `wp-parser-source-type` term + wp_set_object_terms( + $post_id, + [$this->source_type_meta['type_parent_term_id'], $this->source_type_meta['type_term_id']], + $this->taxonomy_source_type + ); + } } } From ff1c792609d63577e8b842f8883b119b71f6fbc8 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Mon, 30 Aug 2021 18:10:27 +0900 Subject: [PATCH 14/66] feat: move some utility functions from wporg theme to api-functions.php --- src/api-functions.php | 208 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) diff --git a/src/api-functions.php b/src/api-functions.php index dae8faf..40d544f 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -43,6 +43,19 @@ function avcpdp_is_parsed_post_type($post_type = null) { return in_array($post_type, avcpdp_get_parsed_post_types()); } +/** + * Checks if given post type is the code reference landing page post type. + * + * @author Evan D Shaw + * @param int|null $post_id Optional. The post ID. + * @return bool True if post has a parsed post type + */ +function avcpdp_is_reference_landing_page_post_type($post_id = null) { + $post_type = get_post_type($post_id); + + return $post_type === WP_Parser\Plugin::CODE_REFERENCE_POST_TYPE; +} + /** * Returns source type "type" and "name" terms for the current post * @@ -113,6 +126,40 @@ function avcpdp_get_source_type_plugin_terms() { return $pterms; } +/** + * Returns list of reference post type posts for a given role slug + * + * @author Evan D Shaw + * @param string $role + * @param int $posts_per_page + * @return int[] + */ +function avcpdp_get_reference_post_list_by_role($role, $posts_per_page = 20) { + return get_posts([ + 'fields' => 'ids', + 'post_type' => avcpdp_get_parsed_post_types(), + 'posts_per_page' => $posts_per_page, + 'tax_query' => [ + [ + 'taxonomy' => WP_Parser\Plugin::ROLE_TAX_SLUG, + 'field' => 'slug', + 'terms' => $role, + ], + ], + ]); +} + +/** + * Returns a role term given a role slug + * + * @author Evan D Shaw + * @param string $slug + * @return WP_Term|false + */ +function avcpdp_get_role_term_by_slug($slug) { + return get_term_by('slug', $slug, WP_Parser\Plugin::ROLE_TAX_SLUG); +} + /** * Retrieve the root directory of the parsed WP code. * @@ -145,6 +192,167 @@ function avcpdp_get_source_code_root_dir($post_id = null) { return $root_dir ? trailingslashit($root_dir) : ABSPATH; } +/** + * Retrieve name of source file + * + * @param int $post_id + * @return string + */ +function avcpdp_get_source_file($post_id = null) { + $source_file_object = wp_get_post_terms(empty($post_id) ? get_the_ID() : $post_id, 'wp-parser-source-file', ['fields' => 'names']); + + return empty($source_file_object) ? '' : esc_html($source_file_object[0]); +} + +/** + * Retrieve URL to source file archive. + * + * @param string $name + * @param int $post_id Optional. The post ID. + * @return string + */ +function avcpdp_get_source_file_archive_link($name = null, $post_id = null) { + $source_file_object = get_term_by('name', empty($name) ? avcpdp_get_source_file($post_id) : $name, 'wp-parser-source-file'); + + return empty($source_file_object) ? '' : esc_url(get_term_link($source_file_object)); +} + +/** + * Retrieve either the starting or ending line number. + * + * @param int $post_id Optional. The post ID. + * @param string $type Optional. Either 'start' for starting line number, or 'end' for ending line number. + * @return int + */ +function avcpdp_get_line_number($post_id = null, $type = 'start') { + $post_id = empty($post_id) ? get_the_ID() : $post_id; + $meta_key = ('end' == $type) ? '_wp-parser_end_line_num' : '_wp-parser_line_num'; + + return (int)get_post_meta($post_id, $meta_key, true); +} + +/** + * Returns `true` if the function/method/hook has usage info, `false` otherwise + * + * @author Evan D Shaw + * @param int $post_id Optional. The post ID. + * @return bool + */ +function avcpdp_show_usage_info($post_id = null) { + $p2p_enabled = function_exists('p2p_register_connection_type'); + + return $p2p_enabled && avcpdp_post_type_has_usage_info(get_post_type($post_id)); +} + +/** + * Does the post type support usage information? + * + * @param string $post_type Optional. The post type name. If blank, assumes current post type. + * @param int $post_id Optional. The post ID. + * @return boolean + */ +function avcpdp_post_type_has_usage_info($post_type = null, $post_id = null) { + $post_type = $post_type ? $post_type : get_post_type($post_id); + $post_types_with_usage = ['wp-parser-function', 'wp-parser-method', 'wp-parser-hook', 'wp-parser-class']; + + return in_array($post_type, $post_types_with_usage); +} + +/** + * Does the post type support uses information? + * + * @param string $post_type Optional. The post type name. If blank, assumes current post type. + * @param int $post_id Optional. The post ID. + * @return boolean + */ +function avcpdp_post_type_has_uses_info($post_type = null, $post_id = null) { + $post_type = $post_type ? $post_type : get_post_type($post_id); + $post_types_with_uses = ['wp-parser-function', 'wp-parser-method', 'wp-parser-class']; + + return in_array($post_type, $post_types_with_uses); +} + +/** + * Retrieves a WP_Query object for the posts that use the specified post. + * + * @param int|WP_Post|null $post Optional. Post ID or post object. Default is global $post. + * @return WP_Query|null The WP_Query if the post's post type supports 'used by', null otherwise. + */ +function avcpdp_get_used_by($post = null) { + switch (get_post_type($post)) { + case 'wp-parser-function': + $connection_types = ['functions_to_functions', 'methods_to_functions']; + break; + + case 'wp-parser-method': + $connection_types = ['functions_to_methods', 'methods_to_methods']; + break; + + case 'wp-parser-hook': + $connection_types = ['functions_to_hooks', 'methods_to_hooks']; + break; + + case 'wp-parser-class': + $connected = new WP_Query([ + 'post_type' => ['wp-parser-class'], + 'meta_key' => '_wp-parser_extends', + 'meta_value' => get_post_field('post_name', $post), + ]); + return $connected; + break; + + default: + return; + } + + $connected = new WP_Query([ + 'post_type' => ['wp-parser-function', 'wp-parser-method'], + 'connected_type' => $connection_types, + 'connected_direction' => ['to', 'to'], + 'connected_items' => get_post_field('ID', $post), + 'nopaging' => true, + ]); + + return $connected; +} + +/** + * Retrieves a WP_Query object for the posts that the current post uses. + * + * @param int|WP_Post|null $post Optional. Post ID or post object. Default is global $post. + * @return WP_Query|null The WP_Query if the post's post type supports 'uses', null otherwise. + */ +function avcpdp_get_uses($post = null) { + $post_id = get_post_field('ID', $post); + $post_type = get_post_type($post); + + if ('wp-parser-class' === $post_type) { + $extends = get_post_meta($post_id, '_wp-parser_extends', true); + if (!$extends) { + return null; + } + $connected = new WP_Query([ + 'post_type' => ['wp-parser-class'], + 'name' => $extends, + ]); + return $connected; + } elseif ('wp-parser-function' === $post_type) { + $connection_types = ['functions_to_functions', 'functions_to_methods', 'functions_to_hooks']; + } else { + $connection_types = ['methods_to_functions', 'methods_to_methods', 'methods_to_hooks']; + } + + $connected = new WP_Query([ + 'post_type' => ['wp-parser-function', 'wp-parser-method', 'wp-parser-hook'], + 'connected_type' => $connection_types, + 'connected_direction' => ['from', 'from', 'from'], + 'connected_items' => $post_id, + 'nopaging' => true, + ]); + + return $connected; +} + /** * Retrieve an explanation for the given post. * From 9c7b639fb02517ff49e6f2f4eb8b2ce9a911e46e Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 1 Sep 2021 18:34:45 +0900 Subject: [PATCH 15/66] feat: add landing pages for functions, hooks, and the source itself. Add more utility functions --- lib/class-importer.php | 41 ++++++++++ lib/class-plugin.php | 5 ++ src/api-functions.php | 175 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 221 insertions(+) diff --git a/lib/class-importer.php b/lib/class-importer.php index 88ce8e3..d1d5892 100644 --- a/lib/class-importer.php +++ b/lib/class-importer.php @@ -280,6 +280,47 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio $this->taxonomy_source_type ); } + } else { + $post_id = $refpage[0]->ID; + } + + // Create Functions/Methods and Hooks landing pages + if (!empty($post_id)) { + $childpages = [ + [ + 'slug' => 'functions-home', + 'title' => __('Functions Reference', 'wp-parser'), + ], + [ + 'slug' => 'hooks-home', + 'title' => __('Hooks Reference', 'wp-parser'), + ], + ]; + foreach ($childpages as $childpage) { + $childrefpage = get_posts([ + 'name' => $childpage['slug'], + 'post_parent' => $post_id, + 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, + ]); + if (empty($childrefpage)) { + $childlandingpageid = wp_insert_post([ + 'post_parent' => $post_id, + 'post_name' => $childpage['slug'], + 'post_title' => $childpage['title'], + 'post_content' => '', + 'post_status' => 'publish', + 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, + ]); + } + if (!empty($childlandingpageid) && !($childlandingpageid instanceof \WP_Error)) { + // Assign `wp-parser-source-type` term + wp_set_object_terms( + $childlandingpageid, + [$this->source_type_meta['type_parent_term_id'], $this->source_type_meta['type_term_id']], + $this->taxonomy_source_type + ); + } + } } } diff --git a/lib/class-plugin.php b/lib/class-plugin.php index 77fc3c4..fc0e50a 100644 --- a/lib/class-plugin.php +++ b/lib/class-plugin.php @@ -508,6 +508,11 @@ public function register_taxonomies() { self::SOURCE_TYPE_TAX_SLUG ); } + + // Link tags to reference post types + foreach (avcpdp_get_parsed_post_types() as $post_type) { + register_taxonomy_for_object_type('post_tag', $post_type); + } } public static function getCodeReferenceSourceTypePostMap() { diff --git a/src/api-functions.php b/src/api-functions.php index 40d544f..175a84f 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -93,6 +93,93 @@ function avcpdp_get_post_source_type_terms($post_id = null) { return $res; } +/** + * Checks whether the source type terms are valid for a post + * + * @author Evan D Shaw + * @param int|null $post_id + * @return bool + */ +function avcpdp_source_type_terms_are_valid_for_post($post_id = null) { + if ($post_id === null) { + $post_id = get_the_ID(); + } + + if (empty($post_id)) { + return false; + } + + $terms = wp_get_post_terms($post_id, WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); + + return avcpdp_source_type_terms_are_valid($terms); +} + +/** + * Checks whether an array of source type term slugs is a valid combination + * + * @author Evan D Shaw + * @param array $termslugs + * @return bool + */ +function avcpdp_source_type_term_slugs_are_valid($termslugs) { + if (empty($termslugs)) { + return false; + } + + if (count($termslugs) > 2) { + // a post can only have one source type and one source type name + return false; + } + $terms = []; + foreach ($termslugs as $termslug) { + $term = get_term_by('slug', $termslug, WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); + if (empty($term)) { + return false; + } + $terms[] = $term; + } + + return avcpdp_source_type_terms_are_valid($terms); +} + +/** + * Checks whether an array of source types is a valid combination + * + * @author Evan D Shaw + * @param array $terms + * @return bool + */ +function avcpdp_source_type_terms_are_valid($terms) { + if (empty($terms)) { + return false; + } + + if (count($terms) > 2) { + // a post can only have one source type and one source type name + return false; + } + $res = []; + foreach ($terms as $term) { + if ($term->parent === 0) { + $res['type'] = $term; + } else { + $res['name'] = $term; + } + } + + if (empty($res['type']) || empty($res['name'])) { + // source type and source type name are required + return false; + } + + if ($res['name']->parent !== $res['type']->term_id) { + // source type name must be a child of source type + return false; + } + + return true; +} + /** * Returns source type taxonomy "plugin" term * @@ -149,6 +236,94 @@ function avcpdp_get_reference_post_list_by_role($role, $posts_per_page = 20) { ]); } +/** + * Returns list of role terms + * + * @author Evan D Shaw + * @param string $fields + * @param bool $hide_empty + * @return WP_Term[] + */ +function avcpdp_get_role_terms($fields = 'all', $hide_empty = true) { + $terms = get_terms([ + 'taxonomy' => WP_Parser\Plugin::ROLE_TAX_SLUG, + 'hide_empty' => $hide_empty, + 'fields' => $fields, + ]); + if ($terms instanceof WP_Error) { + return []; + } + + return $terms; +} + +/** + * Returns list of reference post type posts that have at least one role assigned to them + * + * @author Evan D Shaw + * @param int $posts_per_page + * @return int[] + */ +function avcpdp_get_reference_post_list_having_roles($posts_per_page = 50) { + return get_posts([ + 'fields' => 'ids', + 'post_type' => avcpdp_get_parsed_post_types(), + 'posts_per_page' => $posts_per_page, + 'tax_query' => [ + [ + 'taxonomy' => WP_Parser\Plugin::ROLE_TAX_SLUG, + 'field' => 'slug', + 'terms' => avcpdp_get_role_terms('slugs'), + ], + ], + ]); +} + +/** + * Returns list of hook reference post IDs + * + * @author Evan D Shaw + * @param string $hook_type + * @param int $posts_per_page + * @return int[] + */ +function avcpdp_get_hook_reference_posts($hook_type = 'all', $posts_per_page = 50) { + $params = [ + 'fields' => 'ids', + 'post_type' => 'wp-parser-hook', + 'posts_per_page' => $posts_per_page, + ]; + if ($hook_type === 'filter' || $hook_type === 'action') { + $params['meta_key'] = '_wp-parser_hook_type'; + $params['meta_value'] = $hook_type; + } + + return get_posts($params); +} + +/** + * Returns list of reference post type posts that have at least one role assigned to them + * + * @author Evan D Shaw + * @param int|null $post_id + * @return WP_Term[] + */ +function avcpdp_get_reference_post_roles($post_id = null) { + if (empty($post_id)) { + $post_id = get_the_ID(); + } + if (empty($post_id)) { + return []; + } + + $terms = wp_get_post_terms($post_id, WP_Parser\Plugin::ROLE_TAX_SLUG); + if ($terms instanceof WP_Error) { + return []; + } + + return $terms; +} + /** * Returns a role term given a role slug * From d497eccb9e66cd186607f2bf81a7e43d618aead4 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Thu, 2 Sep 2021 13:56:14 +0900 Subject: [PATCH 16/66] feat: add functions for getting the reference baseurl when on single/archive pages. Add query var for filtering by hook type --- lib/class-plugin.php | 7 +++++ src/Master.php | 20 +++++++++++++ src/api-functions.php | 68 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+) diff --git a/lib/class-plugin.php b/lib/class-plugin.php index fc0e50a..346bb19 100644 --- a/lib/class-plugin.php +++ b/lib/class-plugin.php @@ -12,6 +12,10 @@ class Plugin const SOURCE_TYPE_TAX_SLUG = 'wp-parser-source-type'; const SOURCE_TYPE_TERM_SLUGS = ['composer-package', 'plugin', 'theme']; const WP_PARSER_PT_MAP = [ + 'wp-parser-method' => [ + 'urlpiece' => 'methods', + 'post_type' => 'wp-parser-method', + ], 'wp-parser-function' => [ 'urlpiece' => 'functions', 'post_type' => 'wp-parser-function', @@ -83,6 +87,9 @@ public static function addRewriteRules() { // Add rewrite rules for Functions, Classes, and Hooks foreach (self::WP_PARSER_PT_MAP as $key => $info) { + if ($key === 'wp-parser-method') { + continue; + } $urlpiece = $info['urlpiece']; $ptype = $info['post_type']; add_rewrite_rule( diff --git a/src/Master.php b/src/Master.php index 3bc3c5a..8d2ecd9 100644 --- a/src/Master.php +++ b/src/Master.php @@ -15,6 +15,7 @@ class Master */ public static function init() { add_action('parse_tax_query', [get_class(), 'taxQueryNoChildren'], 10, 1); + add_filter('query_vars', [get_class(), 'addHookTypeQueryVar'], 10, 1); add_filter('pre_handle_404', [get_class(), 'force404onWrongSourceType'], 10, 2); add_action('init', function () { add_action('pre_get_posts', [get_class(), 'preGetPosts'], 10, 1); @@ -27,6 +28,18 @@ public static function init() { } } + /** + * Adds `hook_type` query var for filtering hooks by type + * + * @author Evan D Shaw + * @param array $qvars + * @return array + */ + public static function addHookTypeQueryVar($qvars) { + $qvars[] = 'hook_type'; + return $qvars; + } + /** * @param \WP_Query $query */ @@ -34,6 +47,13 @@ public static function preGetPosts($query) { if ($query->is_main_query() && $query->is_post_type_archive()) { $query->set('orderby', 'title'); $query->set('order', 'ASC'); + // $query->set('posts_per_page', 20); + $ptype = !empty($query->query['post_type']) ? $query->query['post_type'] : ''; + $hook_type = !empty($query->query['hook_type']) ? $query->query['hook_type'] : ''; + if ($ptype === 'wp-parser-hook' && ($hook_type === 'filter' || $hook_type === 'action')) { + $query->query_vars['meta_key'] = '_wp-parser_hook_type'; + $query->query_vars['meta_value'] = $hook_type; + } } if ($query->is_main_query() && $query->is_tax() && $query->get('wp-parser-source-file')) { diff --git a/src/api-functions.php b/src/api-functions.php index 175a84f..b026790 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -56,6 +56,74 @@ function avcpdp_is_reference_landing_page_post_type($post_id = null) { return $post_type === WP_Parser\Plugin::CODE_REFERENCE_POST_TYPE; } +/** + * Returns the base URL for the `wp-parser-*` post type currently being queried + * + * This function will return an empty string if the current main query is not related + * to a reference post type + * + * @author Evan D Shaw + * @return string + */ +function avcpdp_get_reference_archive_base_url() { + if (!is_archive()) { + // not a code reference archive, cannot determine URL + return ''; + } + $ptype = get_query_var('post_type'); + if (!in_array($ptype, avcpdp_get_parsed_post_types(), true)) { + // only show filter by category section for `wp-parser-*` post types + return ''; + } + $stype = get_query_var(\WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); + if (empty($stype)) { + // source type not queried for, cannot determine URL + return ''; + } + $stypepieces = explode(',', $stype); + if (!avcpdp_source_type_term_slugs_are_valid($stypepieces)) { + // the combination of source type terms are not valid + return ''; + } + + $type = $stypepieces[0]; + $name = $stypepieces[1]; + $parsertype = \WP_Parser\Plugin::WP_PARSER_PT_MAP[$ptype]['urlpiece']; + $baseurl = home_url("/reference/{$type}/{$name}/{$parsertype}"); + + return $baseurl; +} + +/** + * Returns the base URL for the current reference single post. + * + * The URL is constructed from the source type terms assigned to the post. The + * `wp-parser-*` post type URL piece is **not appended**. + * + * Example: `/reference/plugin/my-plugin` + * + * @author Evan D Shaw + * @param int|null $pid Optional. Post ID. Defaults to current post + * @return string Returns an empty string if the URL cannot be determined + */ +function avcpdp_get_reference_single_base_url($pid = null) { + if (!is_single($pid)) { + return ''; + } + if (empty($pid)) { + $pid = get_the_ID(); + } + if (!avcpdp_source_type_terms_are_valid_for_post($pid)) { + return ''; + } + $stterms = avcpdp_get_post_source_type_terms($pid); + $type = $stterms['type']->slug; + $name = $stterms['name']->slug; + $baseurl = home_url("/reference/{$type}/{$name}"); + + return $baseurl; +} + /** * Returns source type "type" and "name" terms for the current post * From c315160110184fca7eb760f8023798d009d7dba8 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Thu, 2 Sep 2021 18:21:40 +0900 Subject: [PATCH 17/66] feat: add more utility functions --- lib/class-plugin.php | 4 + src/api-functions.php | 168 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) diff --git a/lib/class-plugin.php b/lib/class-plugin.php index 346bb19..e46aa25 100644 --- a/lib/class-plugin.php +++ b/lib/class-plugin.php @@ -42,6 +42,7 @@ public function on_load() { $this->relationships = new Relationships(); + // add_filter('rewrite_rules_array', [$this, 'removeDefaultParserPostTypeRewriteRules'], 10, 1); add_action('init', [$this, 'register_post_types'], 11); add_action('init', [$this, 'register_taxonomies'], 11); add_filter('wp_parser_get_arguments', [$this, 'make_args_safe']); @@ -51,6 +52,8 @@ public function on_load() { add_filter('term_link', [$this, 'taxonomy_permalink'], 10, 3); } + // public static function removeDefaultParserPostTypeRewriteRules($rules) + /** * Adds rewrite rules for the `wp-parser-(function|method|class|hook)` post * types. @@ -540,6 +543,7 @@ public static function getCodeReferenceSourceTypePostMap() { foreach ($parentpostmap as $slug => $info) { $posts = get_posts([ 'name' => $slug, + 'post_status' => 'any', 'post_type' => self::CODE_REFERENCE_POST_TYPE, ]); if (!empty($posts)) { diff --git a/src/api-functions.php b/src/api-functions.php index b026790..1c5060d 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -56,6 +56,43 @@ function avcpdp_is_reference_landing_page_post_type($post_id = null) { return $post_type === WP_Parser\Plugin::CODE_REFERENCE_POST_TYPE; } +/** + * Get the specific type of hook. + * + * @param int|WP_Post|null $post Optional. Post ID or post object. Default is global $post. + * @return string Either 'action', 'filter', or an empty string if not a hook post type. + */ +function avcpdp_get_hook_type($post = null) { + $hook = ''; + + if ('wp-parser-hook' === get_post_type($post)) { + $hook = get_post_meta(get_post_field('ID', $post), '_wp-parser_hook_type', true); + } + + return $hook; +} + +/** + * Returns the array of post types that have source code. + * + * @return array + */ +function avcpdp_get_post_types_with_source_code() { + return ['wp-parser-class', 'wp-parser-method', 'wp-parser-function']; +} + +/** + * Does the post type have source code? + * + * @param null|string $post_type Optional. The post type name. If null, assumes current post type. Default null. + * @return bool + */ +function avcpdp_post_type_has_source_code($post_type = null) { + $post_type = $post_type ? $post_type : get_post_type(); + + return in_array($post_type, avcpdp_get_post_types_with_source_code()); +} + /** * Returns the base URL for the `wp-parser-*` post type currently being queried * @@ -124,6 +161,75 @@ function avcpdp_get_reference_single_base_url($pid = null) { return $baseurl; } +/** + * Returns hierarchical descending array of reference landing page posts tied to the current reference + * single post via the source type taxonomy + * + * @author Evan D Shaw + * @param int|null $pid Optional. Post ID. Defaults to current post + * @return array + */ +function avcpdp_get_reference_landing_page_posts_from_reference_single_post($pid = null) { + if (empty($pid)) { + $pid = get_the_ID(); + } + if (empty($pid)) { + return []; + } + if (!is_single($pid)) { + return []; + } + if (!avcpdp_is_parsed_post_type()) { + return []; + } + if (!avcpdp_source_type_terms_are_valid_for_post($pid)) { + return []; + } + + $trail = []; + $stterms = avcpdp_get_post_source_type_terms($pid); + $stypelanding = get_posts([ + 'order' => 'ASC', + 'orderby' => 'parent', + 'post_status' => ['publish', 'private'], + 'post_type' => WP_Parser\Plugin::CODE_REFERENCE_POST_TYPE, + 'tax_query' => [ + [ + 'taxonomy' => WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG, + 'field' => 'term_id', + 'terms' => $stterms['type']->term_id, + 'include_children' => false, + ], + ], + ]); + if (!empty($stypelanding)) { + if ($stypelanding[0]->post_status === 'publish') { + $trail[] = $stypelanding[0]; + } + + $sourcelanding = get_posts([ + 'post_parent' => $stypelanding[0]->ID, + 'post_status' => 'publish', + 'post_type' => WP_Parser\Plugin::CODE_REFERENCE_POST_TYPE, + 'tax_query' => [ + [ + 'taxonomy' => WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG, + 'field' => 'term_id', + 'terms' => $stterms['name']->term_id, + 'include_children' => false, + ], + ], + ]); + if (!empty($sourcelanding)) { + $trail[] = $sourcelanding[0]; + } + + $parsertype = \WP_Parser\Plugin::WP_PARSER_PT_MAP[get_post_type()]['urlpiece']; + } + + return $trail; +} + /** * Returns source type "type" and "name" terms for the current post * @@ -474,6 +580,68 @@ function avcpdp_get_line_number($post_id = null, $type = 'start') { return (int)get_post_meta($post_id, $meta_key, true); } +/** + * Retrieve source code for a function or method. + * + * @param int $post_id Optional. The post ID. + * @param bool $force_parse Optional. Ignore potential value in post meta and reparse source file for source code? + * + * @return string The source code. + */ +function avcpdp_get_source_code($post_id = null, $force_parse = false) { + if (empty($post_id)) { + $post_id = get_the_ID(); + } + + // Get the source code stored in post meta. + $meta_key = '_wp-parser_source_code'; + if (!$force_parse && $source_code = get_post_meta($post_id, $meta_key, true)) { + return $source_code; + } + + /* Source code hasn't been stored in post meta, so parse source file to get it. */ + + // Get the name of the source file. + $source_file = avcpdp_get_source_file($post_id); + + // Get the start and end lines. + $start_line = intval(get_post_meta($post_id, '_wp-parser_line_num', true)) - 1; + $end_line = intval(get_post_meta($post_id, '_wp-parser_end_line_num', true)); + + // Sanity check to ensure proper conditions exist for parsing + if (!$source_file || !$start_line || !$end_line || ($start_line > $end_line)) { + return ''; + } + + // Find just the relevant source code + $source_code = ''; + $handle = @fopen(avcpdp_get_source_code_root_dir() . $source_file, 'r'); + if ($handle) { + $line = -1; + while (!feof($handle)) { + $line++; + $source_line = fgets($handle); + + // Stop reading file once end_line is reached. + if ($line >= $end_line) { + break; + } + + // Skip lines until start_line is reached. + if ($line < $start_line) { + continue; + } + + $source_code .= $source_line; + } + fclose($handle); + } + + update_post_meta($post_id, $meta_key, addslashes($source_code)); + + return $source_code; +} + /** * Returns `true` if the function/method/hook has usage info, `false` otherwise * From 542e873c66de7c4e7ecdea06713a6a61bc3ab898 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Mon, 6 Sep 2021 16:01:08 +0900 Subject: [PATCH 18/66] fix: only create default reference landing pages on import to avoid create/delete race conditions. Add translations --- composer.json | 8 + composer.lock | 706 +++++++++++++++++++++++++++++++++++- languages/messages.pot | 572 +++++++++++++++++++++++++++++ languages/wp-parser-en.mo | Bin 0 -> 2601 bytes languages/wp-parser-en.po | 568 +++++++++++++++++++++++++++++ languages/wp-parser-ja.mo | Bin 0 -> 6660 bytes languages/wp-parser-ja.po | 542 +++++++++++++++++++++++++++ lib/class-importer.php | 12 + lib/class-plugin.php | 188 +++++----- lib/class-relationships.php | 24 +- plugin.php | 8 +- src/Admin.php | 2 +- src/Explanations.php | 70 ++-- src/ParsedContent.php | 30 +- src/api-functions.php | 113 +++++- 15 files changed, 2659 insertions(+), 184 deletions(-) create mode 100644 languages/messages.pot create mode 100644 languages/wp-parser-en.mo create mode 100644 languages/wp-parser-en.po create mode 100644 languages/wp-parser-ja.mo create mode 100644 languages/wp-parser-ja.po diff --git a/composer.json b/composer.json index d321be4..e7f9f7b 100644 --- a/composer.json +++ b/composer.json @@ -30,6 +30,9 @@ "scribu/scb-framework": "dev-master@dev", "psr/log": "~1.0" }, + "require-dev": { + "wp-cli/i18n-command": "^2.2" + }, "autoload": { "classmap": [ "lib" @@ -43,5 +46,10 @@ "psr-4": { "Aivec\\Plugins\\DocParser\\": "src" } + }, + "scripts": { + "i18n:create-pot": "./vendor/bin/wp i18n make-pot . languages/messages.pot", + "i18n:update-pos": "@composer i18n:create-pot && find ./languages -name \"*.po\" | xargs -I % msgmerge -o % % languages/messages.pot", + "i18n:make-mo": "./vendor/bin/wp i18n make-mo languages" } } diff --git a/composer.lock b/composer.lock index 00db30b..9ace13c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6702889e0a9f2aec0b235a17dad1def6", + "content-hash": "4b8595be9077523c1780ddc65ed3a95a", "packages": [ { "name": "composer/installers", @@ -490,7 +490,707 @@ "time": "2020-03-15T20:51:58+00:00" } ], - "packages-dev": [], + "packages-dev": [ + { + "name": "gettext/gettext", + "version": "v4.8.5", + "source": { + "type": "git", + "url": "https://github.com/php-gettext/Gettext.git", + "reference": "ef2e312dff383fc0e4cd62dd39042e1157f137d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/ef2e312dff383fc0e4cd62dd39042e1157f137d4", + "reference": "ef2e312dff383fc0e4cd62dd39042e1157f137d4", + "shasum": "" + }, + "require": { + "gettext/languages": "^2.3", + "php": ">=5.4.0" + }, + "require-dev": { + "illuminate/view": "^5.0.x-dev", + "phpunit/phpunit": "^4.8|^5.7|^6.5", + "squizlabs/php_codesniffer": "^3.0", + "symfony/yaml": "~2", + "twig/extensions": "*", + "twig/twig": "^1.31|^2.0" + }, + "suggest": { + "illuminate/view": "Is necessary if you want to use the Blade extractor", + "symfony/yaml": "Is necessary if you want to use the Yaml extractor/generator", + "twig/extensions": "Is necessary if you want to use the Twig extractor", + "twig/twig": "Is necessary if you want to use the Twig extractor" + }, + "type": "library", + "autoload": { + "psr-4": { + "Gettext\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", + "role": "Developer" + } + ], + "description": "PHP gettext manager", + "homepage": "https://github.com/oscarotero/Gettext", + "keywords": [ + "JS", + "gettext", + "i18n", + "mo", + "po", + "translation" + ], + "support": { + "email": "oom@oscarotero.com", + "issues": "https://github.com/oscarotero/Gettext/issues", + "source": "https://github.com/php-gettext/Gettext/tree/v4.8.5" + }, + "funding": [ + { + "url": "https://paypal.me/oscarotero", + "type": "custom" + }, + { + "url": "https://github.com/oscarotero", + "type": "github" + }, + { + "url": "https://www.patreon.com/misteroom", + "type": "patreon" + } + ], + "time": "2021-07-13T16:45:53+00:00" + }, + { + "name": "gettext/languages", + "version": "2.8.1", + "source": { + "type": "git", + "url": "https://github.com/php-gettext/Languages.git", + "reference": "4ad818b6341e177b7c508ec4c37e18932a7b788a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/4ad818b6341e177b7c508ec4c37e18932a7b788a", + "reference": "4ad818b6341e177b7c508ec4c37e18932a7b788a", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" + }, + "bin": [ + "bin/export-plural-rules" + ], + "type": "library", + "autoload": { + "psr-4": { + "Gettext\\Languages\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michele Locati", + "email": "mlocati@gmail.com", + "role": "Developer" + } + ], + "description": "gettext languages with plural rules", + "homepage": "https://github.com/php-gettext/Languages", + "keywords": [ + "cldr", + "i18n", + "internationalization", + "l10n", + "language", + "languages", + "localization", + "php", + "plural", + "plural rules", + "plurals", + "translate", + "translations", + "unicode" + ], + "support": { + "issues": "https://github.com/php-gettext/Languages/issues", + "source": "https://github.com/php-gettext/Languages/tree/2.8.1" + }, + "funding": [ + { + "url": "https://paypal.me/mlocati", + "type": "custom" + }, + { + "url": "https://github.com/mlocati", + "type": "github" + } + ], + "time": "2021-07-14T15:03:58+00:00" + }, + { + "name": "mck89/peast", + "version": "v1.13.6", + "source": { + "type": "git", + "url": "https://github.com/mck89/peast.git", + "reference": "67566e6d594ffb70057fee7adceac9300998cc95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mck89/peast/zipball/67566e6d594ffb70057fee7adceac9300998cc95", + "reference": "67566e6d594ffb70057fee7adceac9300998cc95", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13.6-dev" + } + }, + "autoload": { + "psr-4": { + "Peast\\": "lib/Peast/", + "Peast\\test\\": "test/Peast/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Marco Marchiò", + "email": "marco.mm89@gmail.com" + } + ], + "description": "Peast is PHP library that generates AST for JavaScript code", + "support": { + "issues": "https://github.com/mck89/peast/issues", + "source": "https://github.com/mck89/peast/tree/v1.13.6" + }, + "time": "2021-08-23T10:30:32+00:00" + }, + { + "name": "mustache/mustache", + "version": "v2.13.0", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/mustache.php.git", + "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e95c5a008c23d3151d59ea72484d4f72049ab7f4", + "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.11", + "phpunit/phpunit": "~3.7|~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Mustache": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "A Mustache implementation in PHP.", + "homepage": "https://github.com/bobthecow/mustache.php", + "keywords": [ + "mustache", + "templating" + ], + "support": { + "issues": "https://github.com/bobthecow/mustache.php/issues", + "source": "https://github.com/bobthecow/mustache.php/tree/master" + }, + "time": "2019-11-23T21:40:31+00:00" + }, + { + "name": "rmccue/requests", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/WordPress/Requests.git", + "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/Requests/zipball/82e6936366eac3af4d836c18b9d8c31028fe4cd5", + "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "php-parallel-lint/php-console-highlighter": "^0.5.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcompatibility/php-compatibility": "^9.0", + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5", + "requests/test-server": "dev-master", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Requests": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Ryan McCue", + "homepage": "http://ryanmccue.info" + } + ], + "description": "A HTTP library written in PHP, for human beings.", + "homepage": "http://github.com/WordPress/Requests", + "keywords": [ + "curl", + "fsockopen", + "http", + "idna", + "ipv6", + "iri", + "sockets" + ], + "support": { + "issues": "https://github.com/WordPress/Requests/issues", + "source": "https://github.com/WordPress/Requests/tree/v1.8.1" + }, + "time": "2021-06-04T09:56:25+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "wp-cli/i18n-command", + "version": "v2.2.9", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/i18n-command.git", + "reference": "26e171c5708060b6d7cede9af934b946f5ec3a59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/i18n-command/zipball/26e171c5708060b6d7cede9af934b946f5ec3a59", + "reference": "26e171c5708060b6d7cede9af934b946f5ec3a59", + "shasum": "" + }, + "require": { + "gettext/gettext": "^4.8", + "mck89/peast": "^1.13", + "wp-cli/wp-cli": "^2.5" + }, + "require-dev": { + "wp-cli/scaffold-command": "^1.2 || ^2", + "wp-cli/wp-cli-tests": "^3.0.11" + }, + "suggest": { + "ext-mbstring": "Used for calculating include/exclude matches in code extraction" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "bundled": true, + "commands": [ + "i18n", + "i18n make-pot", + "i18n make-json" + ] + }, + "autoload": { + "psr-4": { + "WP_CLI\\I18n\\": "src/" + }, + "files": [ + "i18n-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pascal Birchler", + "homepage": "https://pascalbirchler.com/" + } + ], + "description": "Provides internationalization tools for WordPress projects.", + "homepage": "https://github.com/wp-cli/i18n-command", + "support": { + "issues": "https://github.com/wp-cli/i18n-command/issues", + "source": "https://github.com/wp-cli/i18n-command/tree/v2.2.9" + }, + "time": "2021-07-20T21:25:54+00:00" + }, + { + "name": "wp-cli/mustangostang-spyc", + "version": "0.6.3", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/spyc.git", + "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "shasum": "" + }, + "require": { + "php": ">=5.3.1" + }, + "require-dev": { + "phpunit/phpunit": "4.3.*@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Mustangostang\\": "src/" + }, + "files": [ + "includes/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "mustangostang", + "email": "vlad.andersen@gmail.com" + } + ], + "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)", + "homepage": "https://github.com/mustangostang/spyc/", + "support": { + "source": "https://github.com/wp-cli/spyc/tree/autoload" + }, + "time": "2017-04-25T11:26:20+00:00" + }, + { + "name": "wp-cli/php-cli-tools", + "version": "v0.11.13", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/php-cli-tools.git", + "reference": "a2866855ac1abc53005c102e901553ad5772dc04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/a2866855ac1abc53005c102e901553ad5772dc04", + "reference": "a2866855ac1abc53005c102e901553ad5772dc04", + "shasum": "" + }, + "require": { + "php": ">= 5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "cli": "lib/" + }, + "files": [ + "lib/cli/cli.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@handbuilt.co", + "role": "Maintainer" + }, + { + "name": "James Logsdon", + "email": "jlogsdon@php.net", + "role": "Developer" + } + ], + "description": "Console utilities for PHP", + "homepage": "http://github.com/wp-cli/php-cli-tools", + "keywords": [ + "cli", + "console" + ], + "support": { + "issues": "https://github.com/wp-cli/php-cli-tools/issues", + "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.13" + }, + "time": "2021-07-01T15:08:16+00:00" + }, + { + "name": "wp-cli/wp-cli", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/wp-cli.git", + "reference": "0bcf0c54f4d35685211d435e25219cc7acbe6d48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/0bcf0c54f4d35685211d435e25219cc7acbe6d48", + "reference": "0bcf0c54f4d35685211d435e25219cc7acbe6d48", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "mustache/mustache": "~2.13", + "php": "^5.6 || ^7.0 || ^8.0", + "rmccue/requests": "^1.8", + "symfony/finder": ">2.7", + "wp-cli/mustangostang-spyc": "^0.6.3", + "wp-cli/php-cli-tools": "~0.11.2" + }, + "require-dev": { + "roave/security-advisories": "dev-master", + "wp-cli/db-command": "^1.3 || ^2", + "wp-cli/entity-command": "^1.2 || ^2", + "wp-cli/extension-command": "^1.1 || ^2", + "wp-cli/package-command": "^1 || ^2", + "wp-cli/wp-cli-tests": "^3.0.7" + }, + "suggest": { + "ext-readline": "Include for a better --prompt implementation", + "ext-zip": "Needed to support extraction of ZIP archives when doing downloads or updates" + }, + "bin": [ + "bin/wp", + "bin/wp.bat" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5.x-dev" + } + }, + "autoload": { + "psr-0": { + "WP_CLI\\": "php/" + }, + "classmap": [ + "php/class-wp-cli.php", + "php/class-wp-cli-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "WP-CLI framework", + "homepage": "https://wp-cli.org", + "keywords": [ + "cli", + "wordpress" + ], + "support": { + "docs": "https://make.wordpress.org/cli/handbook/", + "issues": "https://github.com/wp-cli/wp-cli/issues", + "source": "https://github.com/wp-cli/wp-cli" + }, + "time": "2021-05-14T13:44:51+00:00" + } + ], "aliases": [], "minimum-stability": "stable", "stability-flags": { @@ -503,5 +1203,5 @@ "php": ">=5.4" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } diff --git a/languages/messages.pot b/languages/messages.pot new file mode 100644 index 0000000..d0ddbb0 --- /dev/null +++ b/languages/messages.pot @@ -0,0 +1,572 @@ +# Copyright (C) 2021 Evan Shaw, Ryan McCue, Paul Gibbs, Andrey "Rarst" Savchenko and Contributors +# This file is distributed under the same license as the AVC WP Parser plugin. +msgid "" +msgstr "" +"Project-Id-Version: AVC WP Parser %%VERSION%%\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-phpdoc-parser\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2021-09-06T11:47:24+09:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"X-Generator: WP-CLI 2.5.0\n" +"X-Domain: wp-parser\n" + +#. Plugin Name of the plugin +msgid "AVC WP Parser" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://github.com/aivec/phpdoc-parser" +msgstr "" + +#. Description of the plugin +msgid "Create a plugin/theme/composer-package source reference site powered by WordPress" +msgstr "" + +#. Author of the plugin +msgid "Evan Shaw, Ryan McCue, Paul Gibbs, Andrey \"Rarst\" Savchenko and Contributors" +msgstr "" + +#. Author URI of the plugin +msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" +msgstr "" + +#: lib/class-importer.php:292 +msgid "Functions Reference" +msgstr "" + +#: lib/class-importer.php:296 +msgid "Hooks Reference" +msgstr "" + +#: lib/class-plugin.php:135 +#: lib/class-plugin.php:137 +#: lib/class-plugin.php:139 +#: lib/class-plugin.php:149 +#: src/api-functions.php:22 +msgid "Functions" +msgstr "" + +#: lib/class-plugin.php:138 +msgid "Function" +msgstr "" + +#: lib/class-plugin.php:140 +msgid "New Function" +msgstr "" + +#: lib/class-plugin.php:141 +#: lib/class-plugin.php:173 +#: lib/class-plugin.php:205 +#: lib/class-plugin.php:237 +#: lib/class-plugin.php:272 +msgid "Add New" +msgstr "" + +#: lib/class-plugin.php:142 +msgid "Add New Function" +msgstr "" + +#: lib/class-plugin.php:143 +msgid "Edit Function" +msgstr "" + +#: lib/class-plugin.php:144 +msgid "View Function" +msgstr "" + +#: lib/class-plugin.php:145 +msgid "Search Functions" +msgstr "" + +#: lib/class-plugin.php:146 +msgid "No Functions found" +msgstr "" + +#: lib/class-plugin.php:147 +msgid "No Functions found in trash" +msgstr "" + +#: lib/class-plugin.php:148 +msgid "Parent Function" +msgstr "" + +#: lib/class-plugin.php:167 +#: lib/class-plugin.php:169 +#: lib/class-plugin.php:171 +#: lib/class-plugin.php:181 +#: src/api-functions.php:24 +msgid "Methods" +msgstr "" + +#: lib/class-plugin.php:170 +msgid "Method" +msgstr "" + +#: lib/class-plugin.php:172 +msgid "New Method" +msgstr "" + +#: lib/class-plugin.php:174 +msgid "Add New Method" +msgstr "" + +#: lib/class-plugin.php:175 +msgid "Edit Method" +msgstr "" + +#: lib/class-plugin.php:176 +msgid "View Method" +msgstr "" + +#: lib/class-plugin.php:177 +msgid "Search Methods" +msgstr "" + +#: lib/class-plugin.php:178 +msgid "No Methods found" +msgstr "" + +#: lib/class-plugin.php:179 +msgid "No Methods found in trash" +msgstr "" + +#: lib/class-plugin.php:180 +msgid "Parent Method" +msgstr "" + +#: lib/class-plugin.php:199 +#: lib/class-plugin.php:201 +#: lib/class-plugin.php:203 +#: lib/class-plugin.php:213 +#: src/api-functions.php:21 +msgid "Classes" +msgstr "" + +#: lib/class-plugin.php:202 +msgid "Class" +msgstr "" + +#: lib/class-plugin.php:204 +msgid "New Class" +msgstr "" + +#: lib/class-plugin.php:206 +msgid "Add New Class" +msgstr "" + +#: lib/class-plugin.php:207 +msgid "Edit Class" +msgstr "" + +#: lib/class-plugin.php:208 +msgid "View Class" +msgstr "" + +#: lib/class-plugin.php:209 +msgid "Search Classes" +msgstr "" + +#: lib/class-plugin.php:210 +msgid "No Classes found" +msgstr "" + +#: lib/class-plugin.php:211 +msgid "No Classes found in trash" +msgstr "" + +#: lib/class-plugin.php:212 +msgid "Parent Class" +msgstr "" + +#: lib/class-plugin.php:231 +#: lib/class-plugin.php:233 +#: lib/class-plugin.php:235 +#: lib/class-plugin.php:245 +#: src/api-functions.php:23 +msgid "Hooks" +msgstr "" + +#: lib/class-plugin.php:234 +msgid "Hook" +msgstr "" + +#: lib/class-plugin.php:236 +msgid "New Hook" +msgstr "" + +#: lib/class-plugin.php:238 +msgid "Add New Hook" +msgstr "" + +#: lib/class-plugin.php:239 +msgid "Edit Hook" +msgstr "" + +#: lib/class-plugin.php:240 +msgid "View Hook" +msgstr "" + +#: lib/class-plugin.php:241 +msgid "Search Hooks" +msgstr "" + +#: lib/class-plugin.php:242 +msgid "No Hooks found" +msgstr "" + +#: lib/class-plugin.php:243 +msgid "No Hooks found in trash" +msgstr "" + +#: lib/class-plugin.php:244 +msgid "Parent Hook" +msgstr "" + +#: lib/class-plugin.php:266 +#: lib/class-plugin.php:268 +#: lib/class-plugin.php:270 +#: lib/class-plugin.php:279 +msgid "Reference Landing Pages" +msgstr "" + +#: lib/class-plugin.php:269 +msgid "Reference Landing Page" +msgstr "" + +#: lib/class-plugin.php:271 +msgid "New Reference Landing Page" +msgstr "" + +#: lib/class-plugin.php:273 +msgid "Add New Reference Landing Page" +msgstr "" + +#: lib/class-plugin.php:274 +msgid "Edit Reference Landing Page" +msgstr "" + +#: lib/class-plugin.php:275 +msgid "View Reference Landing Page" +msgstr "" + +#: lib/class-plugin.php:276 +msgid "Search Reference Landing Pages" +msgstr "" + +#: lib/class-plugin.php:277 +msgid "No Pages found" +msgstr "" + +#: lib/class-plugin.php:278 +msgid "No Pages found in trash" +msgstr "" + +#: lib/class-plugin.php:328 +#: lib/class-plugin.php:330 +#: lib/class-plugin.php:344 +msgid "Files" +msgstr "" + +#: lib/class-plugin.php:331 +msgctxt "taxonomy general name" +msgid "File" +msgstr "" + +#: lib/class-plugin.php:332 +msgid "Search Files" +msgstr "" + +#: lib/class-plugin.php:334 +msgid "All Files" +msgstr "" + +#: lib/class-plugin.php:335 +msgid "Parent File" +msgstr "" + +#: lib/class-plugin.php:336 +msgid "Parent File:" +msgstr "" + +#: lib/class-plugin.php:337 +msgid "Edit File" +msgstr "" + +#: lib/class-plugin.php:338 +msgid "Update File" +msgstr "" + +#: lib/class-plugin.php:339 +#: lib/class-plugin.php:340 +msgid "New File" +msgstr "" + +#: lib/class-plugin.php:341 +msgid "Files separated by comma" +msgstr "" + +#: lib/class-plugin.php:342 +msgid "Add or remove Files" +msgstr "" + +#: lib/class-plugin.php:343 +msgid "Choose from the most used Files" +msgstr "" + +#: lib/class-plugin.php:388 +msgid "@since" +msgstr "" + +#: lib/class-plugin.php:408 +msgid "Namespaces" +msgstr "" + +#: lib/class-plugin.php:424 +msgid "Source Type" +msgstr "" + +#: lib/class-plugin.php:441 +#: lib/class-plugin.php:531 +msgid "Plugin" +msgstr "" + +#: lib/class-plugin.php:449 +#: lib/class-plugin.php:535 +msgid "Theme" +msgstr "" + +#: lib/class-plugin.php:457 +#: lib/class-plugin.php:539 +msgid "Composer Package" +msgstr "" + +#: lib/class-plugin.php:470 +msgid "Role" +msgstr "" + +#: lib/class-plugin.php:485 +msgid "Display" +msgstr "" + +#: lib/class-plugin.php:486 +msgid "Condition" +msgstr "" + +#: lib/class-plugin.php:487 +msgid "Utility" +msgstr "" + +#: lib/class-plugin.php:488 +msgid "Setter" +msgstr "" + +#: lib/class-plugin.php:489 +msgid "Getter" +msgstr "" + +#: lib/class-plugin.php:677 +msgctxt "separator" +msgid " or " +msgstr "" + +#: lib/class-relationships.php:90 +#: lib/class-relationships.php:150 +msgid "Uses Functions" +msgstr "" + +#: lib/class-relationships.php:91 +#: lib/class-relationships.php:110 +#: lib/class-relationships.php:129 +msgid "Used by Functions" +msgstr "" + +#: lib/class-relationships.php:109 +#: lib/class-relationships.php:170 +msgid "Uses Methods" +msgstr "" + +#: lib/class-relationships.php:128 +#: lib/class-relationships.php:190 +msgid "Uses Hooks" +msgstr "" + +#: lib/class-relationships.php:151 +#: lib/class-relationships.php:171 +#: lib/class-relationships.php:189 +msgid "Used by Methods" +msgstr "" + +#: src/Admin.php:112 +msgid "Reset votes (%d)" +msgstr "" + +#: src/Explanations.php:91 +#: src/Explanations.php:93 +msgid "Explanations" +msgstr "" + +#: src/Explanations.php:92 +#: src/Explanations.php:231 +msgid "Explanation" +msgstr "" + +#: src/Explanations.php:94 +#: src/Explanations.php:418 +#: src/Explanations.php:419 +#: src/Explanations.php:448 +#: src/Explanations.php:528 +msgid "Edit Explanation" +msgstr "" + +#: src/Explanations.php:95 +msgid "View Explanation" +msgstr "" + +#: src/Explanations.php:96 +msgid "Search Explanations" +msgstr "" + +#: src/Explanations.php:97 +msgid "No Explanations found" +msgstr "" + +#: src/Explanations.php:98 +msgid "No Explanations found in trash" +msgstr "" + +#: src/Explanations.php:189 +msgid "Explanations %s" +msgstr "" + +#: src/Explanations.php:237 +msgid "Status:" +msgstr "" + +#: src/Explanations.php:248 +msgid "Last Modified:" +msgstr "" + +#: src/Explanations.php:278 +msgid "Associated with: " +msgstr "" + +#: src/Explanations.php:331 +msgid "Explanation Editor" +msgstr "" + +#: src/Explanations.php:426 +#: src/Explanations.php:460 +msgid "Add Explanation" +msgstr "" + +#: src/Explanations.php:452 +msgid "Unpublish" +msgstr "" + +#: src/Explanations.php:457 +#: src/Explanations.php:492 +msgid "None" +msgstr "" + +#: src/Explanations.php:482 +#: src/Explanations.php:530 +msgid "Draft" +msgstr "" + +#: src/Explanations.php:485 +#: src/Explanations.php:531 +msgid "Pending Review" +msgstr "" + +#: src/Explanations.php:488 +#: src/Explanations.php:532 +msgid "Published" +msgstr "" + +#: src/Explanations.php:550 +msgid "Explanation already exists." +msgstr "" + +#: src/Explanations.php:569 +msgid "Explanation could not be created." +msgstr "" + +#: src/Explanations.php:595 +msgid "Explanation could not be un-published." +msgstr "" + +#: src/Explanations.php:620 +msgid "Has explanation?" +msgstr "" + +#: src/Explanations.php:621 +msgid "Explanation?" +msgstr "" + +#: src/Explanations.php:645 +msgid "Post has an explanation." +msgstr "" + +#: src/ParsedContent.php:68 +msgid "Parsed Content" +msgstr "" + +#: src/ParsedContent.php:89 +msgid "Core Trac" +msgstr "" + +#: src/ParsedContent.php:90 +msgid "A valid, open ticket from %s is required to edit parsed content." +msgstr "" + +#: src/ParsedContent.php:98 +msgid "Parsed Summary:" +msgstr "" + +#: src/ParsedContent.php:107 +msgid "Parsed Description:" +msgstr "" + +#: src/ParsedContent.php:127 +msgid "Trac Ticket Number:" +msgstr "" + +#: src/ParsedContent.php:132 +msgid "Attach a Core Trac ticket" +msgstr "" + +#: src/ParsedContent.php:133 +msgid "Attach Ticket" +msgstr "" + +#: src/ParsedContent.php:135 +msgid "Detach the Trac ticket" +msgstr "" + +#: src/ParsedContent.php:136 +msgid "Detach Ticket" +msgstr "" + +#: src/ParsedContent.php:183 +msgid "Searching ..." +msgstr "" + +#: src/ParsedContent.php:184 +msgid "Invalid ticket number, please try again." +msgstr "" + +#: src/ParsedContent.php:238 +msgid "Invalid ticket number." +msgstr "" + +#: src/ParsedContent.php:263 +msgid "Ticket detached." +msgstr "" + +#: src/ParsedContent.php:269 +msgid "Ticket still attached." +msgstr "" diff --git a/languages/wp-parser-en.mo b/languages/wp-parser-en.mo new file mode 100644 index 0000000000000000000000000000000000000000..4147538d0088025eba1088abcdec2d1a8c124384 GIT binary patch literal 2601 zcmc(fJ&YSg6vr142r)TGf`1X#L2h6eP8q5yq$Ru zP93?S;ZMi^Yxw`_8Im;Z__HZj@VWx|1b7;J4qO9|f*VS2fX5)e2fhz>mHiG#@!x_k zg5QHx@JH|k@YN%6+#BF4kk5k8gO@@4v?3mquL8adHbAm}3{w6bFax?E<)4Db!F`a{ z|5Dj+f>i%E;3@Dx$v=R!?(ZPg`6o#0KLTF@AA=OPf+9$M9V9yksjf{tPJ#wV>r_GV zyAD!ayCBsw2C3eCkn(&EQa^5jZ-KW#1N<4hg>P^aNyzUGf@og{AjRKPybn@czkp=_ z1EjwHrRic&f?dvBHC1}4Y{sz*%9)PsYL&d*A+TUX( zA44+AcM=bZKMj)qn~G;a{Ir~sFDkj9$@f6&`+bo5{t(piy#m{AvZfhG5omeaW_2-PTajypj^}EHktt>T6ri`~ zd+>w1wQCLp6t3;Wj)5>k!A$0lqJiV;;ZW=e-BJPEj{}(WqQDX?5IZ6eF5aYrDBqhv zv{`@3w!Oe^1_DWoj`T<7R4XAvTF^|YiE!xIT4`*$tUWX*YpgZJYt1S|VhzPbBUX0$ zeYwW+t{sReJJZ7c!ZWOGj;*0^cRgmhHbeDc;Pj)=3#2yRa`KX@Bx@!0YGo0IXw)^& z+nqgR{9N!*#l?_X-P{ur+eiDTvvEV0dQ8G>J$g~mbuac5lI?hrYim%<3rkfhiBjMr z3U{GbN>)oYXCFpu3p22W$?AzXUprAG<+tPgcIb0zT^WC*)H~56?vQ0#Ccl9yb|vmJL}u=9N<%rqMvUZ9JO=I|o!x4|~D8#$i6 zz_V|6ayeu39b;qjT=s&I&BB?t#Mq%mD&G%F`4+D=crnkeHH=#2+((UiX}%?c2{-cr zFAG-$aT~Uqyil#MjrC3J;a`&}J#w=fM8k+i)BiP;(sGg`{Zxk0!VH=Zs6(ca8bpVT zBdH~IF3h8(gXv~y45hA5+LJ}nh(x2N%i$qQgXGEhRI^+|S51o4o@7k!-qV{9{{X?f BvJ3zK literal 0 HcmV?d00001 diff --git a/languages/wp-parser-en.po b/languages/wp-parser-en.po new file mode 100644 index 0000000..780a408 --- /dev/null +++ b/languages/wp-parser-en.po @@ -0,0 +1,568 @@ +# Copyright (C) 2021 Aivec LLC. +# This file is distributed under the same license as the AVC WP Parser plugin. +msgid "" +msgstr "" +"Project-Id-Version: AVC WP Parser %%VERSION%%\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-phpdoc-parser\n" +"POT-Creation-Date: 2021-09-06T11:47:24+09:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: WP-CLI 2.4.0\n" + +#. Plugin Name of the plugin +msgid "AVC WP Parser" +msgstr "AVC WP Parser" + +#. Plugin URI of the plugin +msgid "https://github.com/aivec/phpdoc-parser" +msgstr "https://github.com/aivec/phpdoc-parser" + +#. Description of the plugin +msgid "" +"Create a plugin/theme/composer-package source reference site powered by " +"WordPress" +msgstr "" +"Create a plugin/theme/composer-package source reference site powered by " +"WordPress" + +#. Author of the plugin +msgid "" +"Evan Shaw, Ryan McCue, Paul Gibbs, Andrey \"Rarst\" Savchenko and " +"Contributors" +msgstr "" +"Evan Shaw, Ryan McCue, Paul Gibbs, Andrey \"Rarst\" Savchenko and " +"Contributors" + +#. Author URI of the plugin +msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" +msgstr "https://github.com/aivec/phpdoc-parser/graphs/contributors" + +#: lib/class-importer.php:292 +msgid "Functions Reference" +msgstr "Functions Reference" + +#: lib/class-importer.php:296 +msgid "Hooks Reference" +msgstr "Hooks Reference" + +#: lib/class-plugin.php:135 lib/class-plugin.php:137 lib/class-plugin.php:139 +#: lib/class-plugin.php:149 src/api-functions.php:22 +msgid "Functions" +msgstr "Functions" + +#: lib/class-plugin.php:138 +#, fuzzy +msgid "Function" +msgstr "Functions" + +#: lib/class-plugin.php:140 +#, fuzzy +msgid "New Function" +msgstr "Functions" + +#: lib/class-plugin.php:141 lib/class-plugin.php:173 lib/class-plugin.php:205 +#: lib/class-plugin.php:237 lib/class-plugin.php:272 +msgid "Add New" +msgstr "" + +#: lib/class-plugin.php:142 +#, fuzzy +msgid "Add New Function" +msgstr "Functions" + +#: lib/class-plugin.php:143 +#, fuzzy +msgid "Edit Function" +msgstr "Functions" + +#: lib/class-plugin.php:144 +#, fuzzy +msgid "View Function" +msgstr "Functions" + +#: lib/class-plugin.php:145 +#, fuzzy +msgid "Search Functions" +msgstr "Functions" + +#: lib/class-plugin.php:146 +#, fuzzy +msgid "No Functions found" +msgstr "Functions" + +#: lib/class-plugin.php:147 +msgid "No Functions found in trash" +msgstr "" + +#: lib/class-plugin.php:148 +#, fuzzy +msgid "Parent Function" +msgstr "Functions" + +#: lib/class-plugin.php:167 lib/class-plugin.php:169 lib/class-plugin.php:171 +#: lib/class-plugin.php:181 src/api-functions.php:24 +msgid "Methods" +msgstr "Methods" + +#: lib/class-plugin.php:170 +#, fuzzy +msgid "Method" +msgstr "Methods" + +#: lib/class-plugin.php:172 +#, fuzzy +msgid "New Method" +msgstr "Methods" + +#: lib/class-plugin.php:174 +msgid "Add New Method" +msgstr "" + +#: lib/class-plugin.php:175 +#, fuzzy +msgid "Edit Method" +msgstr "Methods" + +#: lib/class-plugin.php:176 +#, fuzzy +msgid "View Method" +msgstr "Methods" + +#: lib/class-plugin.php:177 +#, fuzzy +msgid "Search Methods" +msgstr "Methods" + +#: lib/class-plugin.php:178 +#, fuzzy +msgid "No Methods found" +msgstr "Methods" + +#: lib/class-plugin.php:179 +msgid "No Methods found in trash" +msgstr "" + +#: lib/class-plugin.php:180 +#, fuzzy +msgid "Parent Method" +msgstr "Methods" + +#: lib/class-plugin.php:199 lib/class-plugin.php:201 lib/class-plugin.php:203 +#: lib/class-plugin.php:213 src/api-functions.php:21 +msgid "Classes" +msgstr "Classes" + +#: lib/class-plugin.php:202 +#, fuzzy +msgid "Class" +msgstr "Classes" + +#: lib/class-plugin.php:204 +#, fuzzy +msgid "New Class" +msgstr "Classes" + +#: lib/class-plugin.php:206 +msgid "Add New Class" +msgstr "" + +#: lib/class-plugin.php:207 +msgid "Edit Class" +msgstr "" + +#: lib/class-plugin.php:208 +msgid "View Class" +msgstr "" + +#: lib/class-plugin.php:209 +#, fuzzy +msgid "Search Classes" +msgstr "Classes" + +#: lib/class-plugin.php:210 +#, fuzzy +msgid "No Classes found" +msgstr "Classes" + +#: lib/class-plugin.php:211 +msgid "No Classes found in trash" +msgstr "" + +#: lib/class-plugin.php:212 +msgid "Parent Class" +msgstr "" + +#: lib/class-plugin.php:231 lib/class-plugin.php:233 lib/class-plugin.php:235 +#: lib/class-plugin.php:245 src/api-functions.php:23 +msgid "Hooks" +msgstr "Hooks" + +#: lib/class-plugin.php:234 +#, fuzzy +msgid "Hook" +msgstr "Hooks" + +#: lib/class-plugin.php:236 +#, fuzzy +msgid "New Hook" +msgstr "Hooks" + +#: lib/class-plugin.php:238 +msgid "Add New Hook" +msgstr "" + +#: lib/class-plugin.php:239 +msgid "Edit Hook" +msgstr "" + +#: lib/class-plugin.php:240 +msgid "View Hook" +msgstr "" + +#: lib/class-plugin.php:241 +msgid "Search Hooks" +msgstr "" + +#: lib/class-plugin.php:242 +msgid "No Hooks found" +msgstr "" + +#: lib/class-plugin.php:243 +msgid "No Hooks found in trash" +msgstr "" + +#: lib/class-plugin.php:244 +msgid "Parent Hook" +msgstr "" + +#: lib/class-plugin.php:266 lib/class-plugin.php:268 lib/class-plugin.php:270 +#: lib/class-plugin.php:279 +msgid "Reference Landing Pages" +msgstr "" + +#: lib/class-plugin.php:269 +msgid "Reference Landing Page" +msgstr "" + +#: lib/class-plugin.php:271 +msgid "New Reference Landing Page" +msgstr "" + +#: lib/class-plugin.php:273 +msgid "Add New Reference Landing Page" +msgstr "" + +#: lib/class-plugin.php:274 +msgid "Edit Reference Landing Page" +msgstr "" + +#: lib/class-plugin.php:275 +msgid "View Reference Landing Page" +msgstr "" + +#: lib/class-plugin.php:276 +msgid "Search Reference Landing Pages" +msgstr "" + +#: lib/class-plugin.php:277 +msgid "No Pages found" +msgstr "" + +#: lib/class-plugin.php:278 +msgid "No Pages found in trash" +msgstr "" + +#: lib/class-plugin.php:328 lib/class-plugin.php:330 lib/class-plugin.php:344 +msgid "Files" +msgstr "" + +#: lib/class-plugin.php:331 +msgctxt "taxonomy general name" +msgid "File" +msgstr "" + +#: lib/class-plugin.php:332 +msgid "Search Files" +msgstr "" + +#: lib/class-plugin.php:334 +msgid "All Files" +msgstr "" + +#: lib/class-plugin.php:335 +msgid "Parent File" +msgstr "" + +#: lib/class-plugin.php:336 +msgid "Parent File:" +msgstr "" + +#: lib/class-plugin.php:337 +msgid "Edit File" +msgstr "" + +#: lib/class-plugin.php:338 +msgid "Update File" +msgstr "" + +#: lib/class-plugin.php:339 lib/class-plugin.php:340 +msgid "New File" +msgstr "" + +#: lib/class-plugin.php:341 +msgid "Files separated by comma" +msgstr "" + +#: lib/class-plugin.php:342 +msgid "Add or remove Files" +msgstr "" + +#: lib/class-plugin.php:343 +msgid "Choose from the most used Files" +msgstr "" + +#: lib/class-plugin.php:388 +msgid "@since" +msgstr "" + +#: lib/class-plugin.php:408 +msgid "Namespaces" +msgstr "Namespaces" + +#: lib/class-plugin.php:424 +msgid "Source Type" +msgstr "" + +#: lib/class-plugin.php:441 lib/class-plugin.php:531 +msgid "Plugin" +msgstr "Plugin" + +#: lib/class-plugin.php:449 lib/class-plugin.php:535 +msgid "Theme" +msgstr "Theme" + +#: lib/class-plugin.php:457 lib/class-plugin.php:539 +msgid "Composer Package" +msgstr "Composer Package" + +#: lib/class-plugin.php:470 +msgid "Role" +msgstr "" + +#: lib/class-plugin.php:485 +msgid "Display" +msgstr "Display" + +#: lib/class-plugin.php:486 +msgid "Condition" +msgstr "Condition" + +#: lib/class-plugin.php:487 +msgid "Utility" +msgstr "Utility" + +#: lib/class-plugin.php:488 +msgid "Setter" +msgstr "Setter" + +#: lib/class-plugin.php:489 +msgid "Getter" +msgstr "Getter" + +#: lib/class-plugin.php:677 +msgctxt "separator" +msgid " or " +msgstr "" + +#: lib/class-relationships.php:90 lib/class-relationships.php:150 +#, fuzzy +msgid "Uses Functions" +msgstr "Functions" + +#: lib/class-relationships.php:91 lib/class-relationships.php:110 +#: lib/class-relationships.php:129 +#, fuzzy +msgid "Used by Functions" +msgstr "Functions" + +#: lib/class-relationships.php:109 lib/class-relationships.php:170 +#, fuzzy +msgid "Uses Methods" +msgstr "Methods" + +#: lib/class-relationships.php:128 lib/class-relationships.php:190 +#, fuzzy +msgid "Uses Hooks" +msgstr "Hooks" + +#: lib/class-relationships.php:151 lib/class-relationships.php:171 +#: lib/class-relationships.php:189 +#, fuzzy +msgid "Used by Methods" +msgstr "Methods" + +#: src/Admin.php:112 +msgid "Reset votes (%d)" +msgstr "" + +#: src/Explanations.php:91 src/Explanations.php:93 +msgid "Explanations" +msgstr "" + +#: src/Explanations.php:92 src/Explanations.php:231 +msgid "Explanation" +msgstr "" + +#: src/Explanations.php:94 src/Explanations.php:418 src/Explanations.php:419 +#: src/Explanations.php:448 src/Explanations.php:528 +msgid "Edit Explanation" +msgstr "" + +#: src/Explanations.php:95 +msgid "View Explanation" +msgstr "" + +#: src/Explanations.php:96 +msgid "Search Explanations" +msgstr "" + +#: src/Explanations.php:97 +msgid "No Explanations found" +msgstr "" + +#: src/Explanations.php:98 +msgid "No Explanations found in trash" +msgstr "" + +#: src/Explanations.php:189 +msgid "Explanations %s" +msgstr "" + +#: src/Explanations.php:237 +msgid "Status:" +msgstr "" + +#: src/Explanations.php:248 +msgid "Last Modified:" +msgstr "" + +#: src/Explanations.php:278 +msgid "Associated with: " +msgstr "" + +#: src/Explanations.php:331 +msgid "Explanation Editor" +msgstr "" + +#: src/Explanations.php:426 src/Explanations.php:460 +msgid "Add Explanation" +msgstr "" + +#: src/Explanations.php:452 +msgid "Unpublish" +msgstr "" + +#: src/Explanations.php:457 src/Explanations.php:492 +msgid "None" +msgstr "" + +#: src/Explanations.php:482 src/Explanations.php:530 +msgid "Draft" +msgstr "" + +#: src/Explanations.php:485 src/Explanations.php:531 +msgid "Pending Review" +msgstr "" + +#: src/Explanations.php:488 src/Explanations.php:532 +msgid "Published" +msgstr "" + +#: src/Explanations.php:550 +msgid "Explanation already exists." +msgstr "" + +#: src/Explanations.php:569 +msgid "Explanation could not be created." +msgstr "" + +#: src/Explanations.php:595 +msgid "Explanation could not be un-published." +msgstr "" + +#: src/Explanations.php:620 +msgid "Has explanation?" +msgstr "" + +#: src/Explanations.php:621 +msgid "Explanation?" +msgstr "" + +#: src/Explanations.php:645 +msgid "Post has an explanation." +msgstr "" + +#: src/ParsedContent.php:68 +msgid "Parsed Content" +msgstr "" + +#: src/ParsedContent.php:89 +msgid "Core Trac" +msgstr "" + +#: src/ParsedContent.php:90 +msgid "A valid, open ticket from %s is required to edit parsed content." +msgstr "" + +#: src/ParsedContent.php:98 +msgid "Parsed Summary:" +msgstr "" + +#: src/ParsedContent.php:107 +msgid "Parsed Description:" +msgstr "" + +#: src/ParsedContent.php:127 +msgid "Trac Ticket Number:" +msgstr "" + +#: src/ParsedContent.php:132 +msgid "Attach a Core Trac ticket" +msgstr "" + +#: src/ParsedContent.php:133 +msgid "Attach Ticket" +msgstr "" + +#: src/ParsedContent.php:135 +msgid "Detach the Trac ticket" +msgstr "" + +#: src/ParsedContent.php:136 +msgid "Detach Ticket" +msgstr "" + +#: src/ParsedContent.php:183 +msgid "Searching ..." +msgstr "" + +#: src/ParsedContent.php:184 +msgid "Invalid ticket number, please try again." +msgstr "" + +#: src/ParsedContent.php:238 +msgid "Invalid ticket number." +msgstr "" + +#: src/ParsedContent.php:263 +msgid "Ticket detached." +msgstr "" + +#: src/ParsedContent.php:269 +msgid "Ticket still attached." +msgstr "" diff --git a/languages/wp-parser-ja.mo b/languages/wp-parser-ja.mo new file mode 100644 index 0000000000000000000000000000000000000000..a31836ac3612abbc2906670dd4aad8bb96506c08 GIT binary patch literal 6660 zcmcJSe{fV+6~}J}s5LDX+e$4hdaX@uEt`ah6}A;glO<%>4Qa9gs{Q9>_p$q6vv2#} zTS9c0>F#O>1cYiyq)-Z!28y)OLd$O$$C;}CIiq#_fmVHFllYIL9i~$|Q~jR%?%RED z6UOdLWtR83Kh8b(oO91T@8!?8&D_oKFM7bl6(Pt z9NYoo$KJuC1{?=T?q49u&A7?2b2do*yTO~mTJUagAs7ZDa{M{)HuOh9vimGZ{=Ef~ zJ--D%3tj>7W7qH?y&r<)&rRsSHFgg;6Z|4b>mC3}PaQ~cSPGI{1SI>TAld&Uh#yPf zLHeHp$&PQ!{uYqrc7gN2y&(DfCU_V4bMQ0ZUqOoVdm#BU7mLW>2SM6D1l|coL0X>z zY5it7KO*NxLGt4gNOt@Tr1LE2|MNcW~s&i@jm{P?wG5v2Xz2Pw|CB4{*U2Vx7>1TFy|2gBeH zNc;T`B>Vp+`yYT5*I8Ih`_2Ia;Cztuuas0k@~00Z{f9u(_qyZ-knDI1q_~ZN6vuZZ z{|%D98<0G-|D7P6M*~Q449oGSK$6=AQXCJ+`M-c<*Q`4n`LBS~Ukf&X10eZ(TF(Dd z&d-IiFJQa{B>UHaE5T>LDEKFk>}*8RlmAOV@^3ka(6ZGa*_)8_PlM$54v^$V^LPk29n;nI8?aK=1Vq!*pfAa6t5@b_$H9_4T0pxUOE1@Es~K(gyy$s18r$ez1E8ea^OJuAT_;J3j0!QCL;n+qVt z>phSyGqrR~WlgJ_`I-*ip%|uWu%>vNhc;zWN?NfrJuUj}YM)EqoKj4))LWiS$Gl>E zg|2TX%|=u!smDv*PIaAXsMwN+m2_N7C$MJ%`(sDl;D*|(Z&dkmEu}(#D&@9JQ;%ti zrN()mW+j81H79l5RQWnX@8wof<-NLT@vI2}XRTwQctTUN-kX8AfxTiIXuD<|dkdSJ z4HbI1!ZWFCLQB^}S+80jlM4bFX8||$tO1*ilJ%yBRT;ex&cu07KVPF8@eV^pSXwj_ zk?Ut6>>wj0n%;nl0kYJQDn(F?i|~n-jGbs-Cvc&SN}6{imA(bMvmeb!tU0SLfTP(I zZ`FEw%mutD9XHf|es3oZ*SeQ?DH~%+HN8RSH~@}FSccYC5&&dGY@J{<= zO-_DdC51{s#+EjP=tUUrf7O4!U|40qQ|v$ zni>x>86pQJYgc+z6NiRFN5abRQ%eL}G~8^Zj@XA9QVlgr#`rU|U3avpCSRv#({WZg zz_m2D48=^+j3<&F`KhD6Mdg5$cBmNgiHrD@jq!ASVlp&kLEnH+l&+%3Tu;|4mR1?+ zgqn7lqw4APG=nFSa&8) z6-R`tn<^IWNZAH=#N8Kt(?4yBtTmaKDT!HHO0)XeY7H6e6hG1Qc<;=)J2^dZ6hcrQ zglJFiBuiRW#thciCs2a3J$1O(^@_Gpjn!w8nYbQ9trRbhk0w^1FqBNvM5XoAA4}P! zr}f@`o>0@Op`>^k*LkLsScbk{jah-Vcwn_^n0PA%x$mXLYin1BI=k9dwb$0xbgCKM zumTY?p~VA_WfNu~st37iSs!Y3hH7=4ZY1i>Y=(sEL#*9(bA9bSdv0&eZ4!nJg~SdN4DTC8VIFhsDtT5 zkT34hteTEh(SUfJAvl2+G(b4esczIL zkW%)EP*Z0hvMSKh#8<2eM%o_w=BoBk$)zA)uhgs!w2FffVOY}xR#OTh6%NNJC9bmqWo&Sklc-hXMt(3A0yY2izyKs^u@~7>> z5z+RmBB4S-NcblvhYuBZpO~uixT_WoXg+J_UZw5PF2K$g#o!6M@SI(^VCTiq9Xsdj8F^ z!NbMjSJ=n@r89Bx==kAt<0sFTO+iS;PamD!JHWhWFNb_Sl?2`6s61uQBKLgdQ0Zh# zB2}NMT=}tnJ(WE6`hHYqRsJ&0q&y*8LHcs?h6RyC9^$v(&K()ser{|KIl1+EiQz8w z-;ioXk+XK8GI~(3g)*oxIJR?m?9zx(D9&KI*7Pchdr#q#7e`(y?#Tx!>2Vib*o7TJ z{QuEX75B1ibmc@Tkt+793`mtF!o8tbHvY!0;{JVh4i`Ib z=eOCpOLlIro&O=cJ!KbO7=QIO2wgq%ik(9>am(OT=~8M{r_!@*ssYm$*Xk^uUd6Oq zIaj!9^>W!1mGb1O(&w(3qHO97_#X#e)wb1ZpK4(4n4KG86QjpUNg_I)i&5DRdIl=W z1F6AE=R%_+FQ;7?5wBsqGVyXdiPzWh$>E{m8N8n^;|f)GC#qi{irs*}3LM@ye(F%U zXwvm{hP)+n%BbI6|Fn}&B|YT=;Oec;O|NoMGEwI9sHg?hPPlSWyod2!gHgm3g_H{3 zfEdNl*&xCsdWHRL^7;Kv#4%R>T%Zj^C1qoSFONTq4+_j7Kk!-M`AYD6JiVwqWmnC} zN7Uh$b8=>?j#3JZio!l%=kXndEOQzce5X1wim#a=->J$W>A2q;M8Grco}U~lonJ|$ T>hqH;-M\n" +"Language-Team: LANGUAGE \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: WP-CLI 2.4.0\n" + +#. Plugin Name of the plugin +msgid "AVC WP Parser" +msgstr "AVC WP Parser" + +#. Plugin URI of the plugin +msgid "https://github.com/aivec/phpdoc-parser" +msgstr "https://github.com/aivec/phpdoc-parser" + +#. Description of the plugin +msgid "" +"Create a plugin/theme/composer-package source reference site powered by " +"WordPress" +msgstr "" +"Create a plugin/theme/composer-package source reference site powered by " +"WordPress" + +#. Author of the plugin +msgid "" +"Evan Shaw, Ryan McCue, Paul Gibbs, Andrey \"Rarst\" Savchenko and " +"Contributors" +msgstr "" +"Evan Shaw, Ryan McCue, Paul Gibbs, Andrey \"Rarst\" Savchenko and " +"Contributors" + +#. Author URI of the plugin +msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" +msgstr "https://github.com/aivec/phpdoc-parser/graphs/contributors" + +#: lib/class-importer.php:292 +msgid "Functions Reference" +msgstr "ファンクション・レファレンス" + +#: lib/class-importer.php:296 +msgid "Hooks Reference" +msgstr "フック・レファレンス" + +#: lib/class-plugin.php:135 lib/class-plugin.php:137 lib/class-plugin.php:139 +#: lib/class-plugin.php:149 src/api-functions.php:22 +msgid "Functions" +msgstr "ファンクション" + +#: lib/class-plugin.php:138 +msgid "Function" +msgstr "ファンクション" + +#: lib/class-plugin.php:140 +msgid "New Function" +msgstr "ファンクションを新規追加" + +#: lib/class-plugin.php:141 lib/class-plugin.php:173 lib/class-plugin.php:205 +#: lib/class-plugin.php:237 lib/class-plugin.php:272 +msgid "Add New" +msgstr "新規追加" + +#: lib/class-plugin.php:142 +msgid "Add New Function" +msgstr "ファンクションを新規追加" + +#: lib/class-plugin.php:143 +msgid "Edit Function" +msgstr "ファンクションを編集" + +#: lib/class-plugin.php:144 +msgid "View Function" +msgstr "ファンクションを見る" + +#: lib/class-plugin.php:145 +msgid "Search Functions" +msgstr "ファンクションを検索" + +#: lib/class-plugin.php:146 +msgid "No Functions found" +msgstr "ファンクションの結果がありません" + +#: lib/class-plugin.php:147 +msgid "No Functions found in trash" +msgstr "ゴミ箱の中にファンクションがありません" + +#: lib/class-plugin.php:148 +msgid "Parent Function" +msgstr "親ファンクション" + +#: lib/class-plugin.php:167 lib/class-plugin.php:169 lib/class-plugin.php:171 +#: lib/class-plugin.php:181 src/api-functions.php:24 +msgid "Methods" +msgstr "関数" + +#: lib/class-plugin.php:170 +msgid "Method" +msgstr "関数" + +#: lib/class-plugin.php:172 +msgid "New Method" +msgstr "関数を新規追加" + +#: lib/class-plugin.php:174 +msgid "Add New Method" +msgstr "関数を新規追加" + +#: lib/class-plugin.php:175 +msgid "Edit Method" +msgstr "関数を編集" + +#: lib/class-plugin.php:176 +msgid "View Method" +msgstr "関数を見る" + +#: lib/class-plugin.php:177 +msgid "Search Methods" +msgstr "関数を検索" + +#: lib/class-plugin.php:178 +msgid "No Methods found" +msgstr "関数の結果がありません" + +#: lib/class-plugin.php:179 +msgid "No Methods found in trash" +msgstr "ゴミ箱の中に関数がありません" + +#: lib/class-plugin.php:180 +msgid "Parent Method" +msgstr "親関数" + +#: lib/class-plugin.php:199 lib/class-plugin.php:201 lib/class-plugin.php:203 +#: lib/class-plugin.php:213 src/api-functions.php:21 +msgid "Classes" +msgstr "クラス" + +#: lib/class-plugin.php:202 +msgid "Class" +msgstr "クラス" + +#: lib/class-plugin.php:204 +msgid "New Class" +msgstr "クラスを新規追加" + +#: lib/class-plugin.php:206 +msgid "Add New Class" +msgstr "クラスを新規追加" + +#: lib/class-plugin.php:207 +msgid "Edit Class" +msgstr "クラスを編集" + +#: lib/class-plugin.php:208 +msgid "View Class" +msgstr "クラスを見る" + +#: lib/class-plugin.php:209 +msgid "Search Classes" +msgstr "クラスを検索" + +#: lib/class-plugin.php:210 +msgid "No Classes found" +msgstr "クラスの結果がありません" + +#: lib/class-plugin.php:211 +msgid "No Classes found in trash" +msgstr "ゴミ箱の中にクラスがありません" + +#: lib/class-plugin.php:212 +msgid "Parent Class" +msgstr "親クラス" + +#: lib/class-plugin.php:231 lib/class-plugin.php:233 lib/class-plugin.php:235 +#: lib/class-plugin.php:245 src/api-functions.php:23 +msgid "Hooks" +msgstr "フック" + +#: lib/class-plugin.php:234 +msgid "Hook" +msgstr "フック" + +#: lib/class-plugin.php:236 +msgid "New Hook" +msgstr "フックを新規追加" + +#: lib/class-plugin.php:238 +msgid "Add New Hook" +msgstr "フックを新規追加" + +#: lib/class-plugin.php:239 +msgid "Edit Hook" +msgstr "フックを編集" + +#: lib/class-plugin.php:240 +msgid "View Hook" +msgstr "フックを見る" + +#: lib/class-plugin.php:241 +msgid "Search Hooks" +msgstr "フックを検索" + +#: lib/class-plugin.php:242 +msgid "No Hooks found" +msgstr "フックの結果がありません" + +#: lib/class-plugin.php:243 +msgid "No Hooks found in trash" +msgstr "ゴミ箱の中にフックがありません" + +#: lib/class-plugin.php:244 +msgid "Parent Hook" +msgstr "親フック" + +#: lib/class-plugin.php:266 lib/class-plugin.php:268 lib/class-plugin.php:270 +#: lib/class-plugin.php:279 +msgid "Reference Landing Pages" +msgstr "レファレンスのランディングページ" + +#: lib/class-plugin.php:269 +msgid "Reference Landing Page" +msgstr "レファレンスのランディングページ" + +#: lib/class-plugin.php:271 +msgid "New Reference Landing Page" +msgstr "レファレンスのランディングページを新規追加" + +#: lib/class-plugin.php:273 +msgid "Add New Reference Landing Page" +msgstr "レファレンスのランディングページを新規追加" + +#: lib/class-plugin.php:274 +msgid "Edit Reference Landing Page" +msgstr "レファレンスのランディングページを編集" + +#: lib/class-plugin.php:275 +msgid "View Reference Landing Page" +msgstr "レファレンスのランディングページを見る" + +#: lib/class-plugin.php:276 +msgid "Search Reference Landing Pages" +msgstr "レファレンスのランディングページを検索" + +#: lib/class-plugin.php:277 +msgid "No Pages found" +msgstr "レファレンスのランディングページの結果がありません" + +#: lib/class-plugin.php:278 +msgid "No Pages found in trash" +msgstr "ゴミ箱の中にレファレンスのランディングページがありません" + +#: lib/class-plugin.php:328 lib/class-plugin.php:330 lib/class-plugin.php:344 +msgid "Files" +msgstr "ファイル" + +#: lib/class-plugin.php:331 +msgctxt "taxonomy general name" +msgid "File" +msgstr "ファイル" + +#: lib/class-plugin.php:332 +msgid "Search Files" +msgstr "ファイルを検索" + +#: lib/class-plugin.php:334 +msgid "All Files" +msgstr "全てのファイル" + +#: lib/class-plugin.php:335 +msgid "Parent File" +msgstr "親ファイル" + +#: lib/class-plugin.php:336 +msgid "Parent File:" +msgstr "親ファイル:" + +#: lib/class-plugin.php:337 +msgid "Edit File" +msgstr "ファイルを編集" + +#: lib/class-plugin.php:338 +msgid "Update File" +msgstr "ファイルを更新" + +#: lib/class-plugin.php:339 lib/class-plugin.php:340 +msgid "New File" +msgstr "ファイルを新規追加" + +#: lib/class-plugin.php:341 +msgid "Files separated by comma" +msgstr "コンマで区切られているファイル" + +#: lib/class-plugin.php:342 +msgid "Add or remove Files" +msgstr "ファイルを新規追加・削除する" + +#: lib/class-plugin.php:343 +msgid "Choose from the most used Files" +msgstr "よく使われているファイルから選択" + +#: lib/class-plugin.php:388 +msgid "@since" +msgstr "@since" + +#: lib/class-plugin.php:408 +msgid "Namespaces" +msgstr "ネームスペース" + +#: lib/class-plugin.php:424 +msgid "Source Type" +msgstr "ソースタイプ" + +#: lib/class-plugin.php:441 lib/class-plugin.php:531 +msgid "Plugin" +msgstr "プラグイン" + +#: lib/class-plugin.php:449 lib/class-plugin.php:535 +msgid "Theme" +msgstr "テーマ" + +#: lib/class-plugin.php:457 lib/class-plugin.php:539 +msgid "Composer Package" +msgstr "Composerパッケージ" + +#: lib/class-plugin.php:470 +msgid "Role" +msgstr "区分" + +#: lib/class-plugin.php:485 +msgid "Display" +msgstr "表示系" + +#: lib/class-plugin.php:486 +msgid "Condition" +msgstr "条件判断" + +#: lib/class-plugin.php:487 +msgid "Utility" +msgstr "ユーティリティー" + +#: lib/class-plugin.php:488 +msgid "Setter" +msgstr "データセット" + +#: lib/class-plugin.php:489 +msgid "Getter" +msgstr "デート取得" + +#: lib/class-plugin.php:677 +msgctxt "separator" +msgid " or " +msgstr "" + +#: lib/class-relationships.php:90 lib/class-relationships.php:150 +msgid "Uses Functions" +msgstr "利用しているファンクション" + +#: lib/class-relationships.php:91 lib/class-relationships.php:110 +#: lib/class-relationships.php:129 +msgid "Used by Functions" +msgstr "利用されているファンクション" + +#: lib/class-relationships.php:109 lib/class-relationships.php:170 +msgid "Uses Methods" +msgstr "利用している関数" + +#: lib/class-relationships.php:128 lib/class-relationships.php:190 +msgid "Uses Hooks" +msgstr "利用しているフック" + +#: lib/class-relationships.php:151 lib/class-relationships.php:171 +#: lib/class-relationships.php:189 +msgid "Used by Methods" +msgstr "利用されている関数" + +#: src/Admin.php:112 +msgid "Reset votes (%d)" +msgstr "" + +#: src/Explanations.php:91 src/Explanations.php:93 +msgid "Explanations" +msgstr "説明文" + +#: src/Explanations.php:92 src/Explanations.php:231 +msgid "Explanation" +msgstr "説明文" + +#: src/Explanations.php:94 src/Explanations.php:418 src/Explanations.php:419 +#: src/Explanations.php:448 src/Explanations.php:528 +msgid "Edit Explanation" +msgstr "説明文を編集" + +#: src/Explanations.php:95 +msgid "View Explanation" +msgstr "説明文を見る" + +#: src/Explanations.php:96 +msgid "Search Explanations" +msgstr "説明文を検索" + +#: src/Explanations.php:97 +msgid "No Explanations found" +msgstr "説明文の結果がありません" + +#: src/Explanations.php:98 +msgid "No Explanations found in trash" +msgstr "ゴミ箱の中に説明文がありません" + +#: src/Explanations.php:189 +msgid "Explanations %s" +msgstr "説明: %s" + +#: src/Explanations.php:237 +msgid "Status:" +msgstr "ステータス:" + +#: src/Explanations.php:248 +msgid "Last Modified:" +msgstr "更新日時:" + +#: src/Explanations.php:278 +msgid "Associated with: " +msgstr "関連資料: " + +#: src/Explanations.php:331 +msgid "Explanation Editor" +msgstr "説明文エディター" + +#: src/Explanations.php:426 src/Explanations.php:460 +msgid "Add Explanation" +msgstr "説明文を新規追加" + +#: src/Explanations.php:452 +msgid "Unpublish" +msgstr "非公開" + +#: src/Explanations.php:457 src/Explanations.php:492 +msgid "None" +msgstr "なし" + +#: src/Explanations.php:482 src/Explanations.php:530 +msgid "Draft" +msgstr "" + +#: src/Explanations.php:485 src/Explanations.php:531 +msgid "Pending Review" +msgstr "" + +#: src/Explanations.php:488 src/Explanations.php:532 +msgid "Published" +msgstr "公開済み" + +#: src/Explanations.php:550 +msgid "Explanation already exists." +msgstr "" + +#: src/Explanations.php:569 +msgid "Explanation could not be created." +msgstr "" + +#: src/Explanations.php:595 +msgid "Explanation could not be un-published." +msgstr "" + +#: src/Explanations.php:620 +msgid "Has explanation?" +msgstr "" + +#: src/Explanations.php:621 +msgid "Explanation?" +msgstr "" + +#: src/Explanations.php:645 +msgid "Post has an explanation." +msgstr "" + +#: src/ParsedContent.php:68 +msgid "Parsed Content" +msgstr "" + +#: src/ParsedContent.php:89 +msgid "Core Trac" +msgstr "" + +#: src/ParsedContent.php:90 +msgid "A valid, open ticket from %s is required to edit parsed content." +msgstr "" + +#: src/ParsedContent.php:98 +msgid "Parsed Summary:" +msgstr "" + +#: src/ParsedContent.php:107 +msgid "Parsed Description:" +msgstr "" + +#: src/ParsedContent.php:127 +msgid "Trac Ticket Number:" +msgstr "" + +#: src/ParsedContent.php:132 +msgid "Attach a Core Trac ticket" +msgstr "" + +#: src/ParsedContent.php:133 +msgid "Attach Ticket" +msgstr "" + +#: src/ParsedContent.php:135 +msgid "Detach the Trac ticket" +msgstr "" + +#: src/ParsedContent.php:136 +msgid "Detach Ticket" +msgstr "" + +#: src/ParsedContent.php:183 +msgid "Searching ..." +msgstr "" + +#: src/ParsedContent.php:184 +msgid "Invalid ticket number, please try again." +msgstr "" + +#: src/ParsedContent.php:238 +msgid "Invalid ticket number." +msgstr "" + +#: src/ParsedContent.php:263 +msgid "Ticket detached." +msgstr "" + +#: src/ParsedContent.php:269 +msgid "Ticket still attached." +msgstr "" diff --git a/lib/class-importer.php b/lib/class-importer.php index d1d5892..667de25 100644 --- a/lib/class-importer.php +++ b/lib/class-importer.php @@ -256,9 +256,21 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio // Create code-reference child page for the current plugin/theme/composer-package $pageslug = $this->source_type_meta['type']; $parentpostmap = Plugin::getCodeReferenceSourceTypePostMap(); + if (empty($parentpostmap[$pageslug]['post_id'])) { + $toprefpid = wp_insert_post([ + 'post_name' => $pageslug, + 'post_title' => $parentpostmap[$pageslug]['title'], + 'post_content' => '', + 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, + ]); + if (!($toprefpid instanceof \WP_Error)) { + $parentpostmap[$pageslug]['post_id'] = $toprefpid; + } + } if (!empty($parentpostmap[$pageslug]['post_id'])) { $refpage = get_posts([ 'name' => $this->source_type_meta['name'], + 'post_status' => 'any', 'post_parent' => $parentpostmap[$pageslug]['post_id'], 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, ]); diff --git a/lib/class-plugin.php b/lib/class-plugin.php index e46aa25..f034942 100644 --- a/lib/class-plugin.php +++ b/lib/class-plugin.php @@ -132,21 +132,21 @@ public function register_post_types() { // if (!post_type_exists('wp-parser-function')) { register_post_type('wp-parser-function', [ 'has_archive' => 'reference/functions', - 'label' => __('Functions', 'wporg'), + 'label' => __('Functions', 'wp-parser'), 'labels' => [ - 'name' => __('Functions', 'wporg'), - 'singular_name' => __('Function', 'wporg'), - 'all_items' => __('Functions', 'wporg'), - 'new_item' => __('New Function', 'wporg'), - 'add_new' => __('Add New', 'wporg'), - 'add_new_item' => __('Add New Function', 'wporg'), - 'edit_item' => __('Edit Function', 'wporg'), - 'view_item' => __('View Function', 'wporg'), - 'search_items' => __('Search Functions', 'wporg'), - 'not_found' => __('No Functions found', 'wporg'), - 'not_found_in_trash' => __('No Functions found in trash', 'wporg'), - 'parent_item_colon' => __('Parent Function', 'wporg'), - 'menu_name' => __('Functions', 'wporg'), + 'name' => __('Functions', 'wp-parser'), + 'singular_name' => __('Function', 'wp-parser'), + 'all_items' => __('Functions', 'wp-parser'), + 'new_item' => __('New Function', 'wp-parser'), + 'add_new' => __('Add New', 'wp-parser'), + 'add_new_item' => __('Add New Function', 'wp-parser'), + 'edit_item' => __('Edit Function', 'wp-parser'), + 'view_item' => __('View Function', 'wp-parser'), + 'search_items' => __('Search Functions', 'wp-parser'), + 'not_found' => __('No Functions found', 'wp-parser'), + 'not_found_in_trash' => __('No Functions found in trash', 'wp-parser'), + 'parent_item_colon' => __('Parent Function', 'wp-parser'), + 'menu_name' => __('Functions', 'wp-parser'), ], 'menu_icon' => 'dashicons-editor-code', 'public' => true, @@ -164,21 +164,21 @@ public function register_post_types() { // if (!post_type_exists('wp-parser-method')) { register_post_type('wp-parser-method', [ 'has_archive' => 'reference/methods', - 'label' => __('Methods', 'wporg'), + 'label' => __('Methods', 'wp-parser'), 'labels' => [ - 'name' => __('Methods', 'wporg'), - 'singular_name' => __('Method', 'wporg'), - 'all_items' => __('Methods', 'wporg'), - 'new_item' => __('New Method', 'wporg'), - 'add_new' => __('Add New', 'wporg'), - 'add_new_item' => __('Add New Method', 'wporg'), - 'edit_item' => __('Edit Method', 'wporg'), - 'view_item' => __('View Method', 'wporg'), - 'search_items' => __('Search Methods', 'wporg'), - 'not_found' => __('No Methods found', 'wporg'), - 'not_found_in_trash' => __('No Methods found in trash', 'wporg'), - 'parent_item_colon' => __('Parent Method', 'wporg'), - 'menu_name' => __('Methods', 'wporg'), + 'name' => __('Methods', 'wp-parser'), + 'singular_name' => __('Method', 'wp-parser'), + 'all_items' => __('Methods', 'wp-parser'), + 'new_item' => __('New Method', 'wp-parser'), + 'add_new' => __('Add New', 'wp-parser'), + 'add_new_item' => __('Add New Method', 'wp-parser'), + 'edit_item' => __('Edit Method', 'wp-parser'), + 'view_item' => __('View Method', 'wp-parser'), + 'search_items' => __('Search Methods', 'wp-parser'), + 'not_found' => __('No Methods found', 'wp-parser'), + 'not_found_in_trash' => __('No Methods found in trash', 'wp-parser'), + 'parent_item_colon' => __('Parent Method', 'wp-parser'), + 'menu_name' => __('Methods', 'wp-parser'), ], 'menu_icon' => 'dashicons-editor-code', 'public' => true, @@ -196,21 +196,21 @@ public function register_post_types() { // if (!post_type_exists('wp-parser-class')) { register_post_type('wp-parser-class', [ 'has_archive' => 'reference/classes', - 'label' => __('Classes', 'wporg'), + 'label' => __('Classes', 'wp-parser'), 'labels' => [ - 'name' => __('Classes', 'wporg'), - 'singular_name' => __('Class', 'wporg'), - 'all_items' => __('Classes', 'wporg'), - 'new_item' => __('New Class', 'wporg'), - 'add_new' => __('Add New', 'wporg'), - 'add_new_item' => __('Add New Class', 'wporg'), - 'edit_item' => __('Edit Class', 'wporg'), - 'view_item' => __('View Class', 'wporg'), - 'search_items' => __('Search Classes', 'wporg'), - 'not_found' => __('No Classes found', 'wporg'), - 'not_found_in_trash' => __('No Classes found in trash', 'wporg'), - 'parent_item_colon' => __('Parent Class', 'wporg'), - 'menu_name' => __('Classes', 'wporg'), + 'name' => __('Classes', 'wp-parser'), + 'singular_name' => __('Class', 'wp-parser'), + 'all_items' => __('Classes', 'wp-parser'), + 'new_item' => __('New Class', 'wp-parser'), + 'add_new' => __('Add New', 'wp-parser'), + 'add_new_item' => __('Add New Class', 'wp-parser'), + 'edit_item' => __('Edit Class', 'wp-parser'), + 'view_item' => __('View Class', 'wp-parser'), + 'search_items' => __('Search Classes', 'wp-parser'), + 'not_found' => __('No Classes found', 'wp-parser'), + 'not_found_in_trash' => __('No Classes found in trash', 'wp-parser'), + 'parent_item_colon' => __('Parent Class', 'wp-parser'), + 'menu_name' => __('Classes', 'wp-parser'), ], 'menu_icon' => 'dashicons-editor-code', 'public' => true, @@ -228,21 +228,21 @@ public function register_post_types() { // if (!post_type_exists('wp-parser-hook')) { register_post_type('wp-parser-hook', [ 'has_archive' => 'reference/hooks', - 'label' => __('Hooks', 'wporg'), + 'label' => __('Hooks', 'wp-parser'), 'labels' => [ - 'name' => __('Hooks', 'wporg'), - 'singular_name' => __('Hook', 'wporg'), - 'all_items' => __('Hooks', 'wporg'), - 'new_item' => __('New Hook', 'wporg'), - 'add_new' => __('Add New', 'wporg'), - 'add_new_item' => __('Add New Hook', 'wporg'), - 'edit_item' => __('Edit Hook', 'wporg'), - 'view_item' => __('View Hook', 'wporg'), - 'search_items' => __('Search Hooks', 'wporg'), - 'not_found' => __('No Hooks found', 'wporg'), - 'not_found_in_trash' => __('No Hooks found in trash', 'wporg'), - 'parent_item_colon' => __('Parent Hook', 'wporg'), - 'menu_name' => __('Hooks', 'wporg'), + 'name' => __('Hooks', 'wp-parser'), + 'singular_name' => __('Hook', 'wp-parser'), + 'all_items' => __('Hooks', 'wp-parser'), + 'new_item' => __('New Hook', 'wp-parser'), + 'add_new' => __('Add New', 'wp-parser'), + 'add_new_item' => __('Add New Hook', 'wp-parser'), + 'edit_item' => __('Edit Hook', 'wp-parser'), + 'view_item' => __('View Hook', 'wp-parser'), + 'search_items' => __('Search Hooks', 'wp-parser'), + 'not_found' => __('No Hooks found', 'wp-parser'), + 'not_found_in_trash' => __('No Hooks found in trash', 'wp-parser'), + 'parent_item_colon' => __('Parent Hook', 'wp-parser'), + 'menu_name' => __('Hooks', 'wp-parser'), ], 'menu_icon' => 'dashicons-editor-code', 'public' => true, @@ -263,20 +263,20 @@ public function register_post_types() { 'exclude_from_search' => true, 'publicly_queryable' => true, 'hierarchical' => true, - 'label' => __('Reference Landing Pages', 'wporg'), + 'label' => __('Reference Landing Pages', 'wp-parser'), 'labels' => [ - 'name' => __('Reference Landing Pages', 'wporg'), - 'singular_name' => __('Reference Landing Page', 'wporg'), - 'all_items' => __('Reference Landing Pages', 'wporg'), - 'new_item' => __('New Reference Landing Page', 'wporg'), - 'add_new' => __('Add New', 'wporg'), - 'add_new_item' => __('Add New Reference Landing Page', 'wporg'), - 'edit_item' => __('Edit Reference Landing Page', 'wporg'), - 'view_item' => __('View Reference Landing Page', 'wporg'), - 'search_items' => __('Search Reference Landing Pages', 'wporg'), - 'not_found' => __('No Pages found', 'wporg'), - 'not_found_in_trash' => __('No Pages found in trash', 'wporg'), - 'menu_name' => __('Reference Landing Pages', 'wporg'), + 'name' => __('Reference Landing Pages', 'wp-parser'), + 'singular_name' => __('Reference Landing Page', 'wp-parser'), + 'all_items' => __('Reference Landing Pages', 'wp-parser'), + 'new_item' => __('New Reference Landing Page', 'wp-parser'), + 'add_new' => __('Add New', 'wp-parser'), + 'add_new_item' => __('Add New Reference Landing Page', 'wp-parser'), + 'edit_item' => __('Edit Reference Landing Page', 'wp-parser'), + 'view_item' => __('View Reference Landing Page', 'wp-parser'), + 'search_items' => __('Search Reference Landing Pages', 'wp-parser'), + 'not_found' => __('No Pages found', 'wp-parser'), + 'not_found_in_trash' => __('No Pages found in trash', 'wp-parser'), + 'menu_name' => __('Reference Landing Pages', 'wp-parser'), ], 'menu_icon' => 'dashicons-admin-page', 'menu_position' => 20, @@ -297,20 +297,6 @@ public function register_post_types() { 'show_in_rest' => false, ]); // } - - // Add default source-type landing pages - $parentpostmap = self::getCodeReferenceSourceTypePostMap(); - foreach ($parentpostmap as $slug => $info) { - if (empty($parentpostmap[$slug]['post_id'])) { - wp_insert_post([ - 'post_name' => $slug, - 'post_title' => $info['title'], - 'post_content' => '', - 'post_status' => 'publish', - 'post_type' => self::CODE_REFERENCE_POST_TYPE, - ]); - } - } } /** @@ -325,23 +311,23 @@ public function register_taxonomies() { 'wp-parser-source-file', $object_types, [ - 'label' => __('Files', 'wporg'), + 'label' => __('Files', 'wp-parser'), 'labels' => [ - 'name' => __('Files', 'wporg'), - 'singular_name' => _x('File', 'taxonomy general name', 'wporg'), - 'search_items' => __('Search Files', 'wporg'), + 'name' => __('Files', 'wp-parser'), + 'singular_name' => _x('File', 'taxonomy general name', 'wp-parser'), + 'search_items' => __('Search Files', 'wp-parser'), 'popular_items' => null, - 'all_items' => __('All Files', 'wporg'), - 'parent_item' => __('Parent File', 'wporg'), - 'parent_item_colon' => __('Parent File:', 'wporg'), - 'edit_item' => __('Edit File', 'wporg'), - 'update_item' => __('Update File', 'wporg'), - 'add_new_item' => __('New File', 'wporg'), - 'new_item_name' => __('New File', 'wporg'), - 'separate_items_with_commas' => __('Files separated by comma', 'wporg'), - 'add_or_remove_items' => __('Add or remove Files', 'wporg'), - 'choose_from_most_used' => __('Choose from the most used Files', 'wporg'), - 'menu_name' => __('Files', 'wporg'), + 'all_items' => __('All Files', 'wp-parser'), + 'parent_item' => __('Parent File', 'wp-parser'), + 'parent_item_colon' => __('Parent File:', 'wp-parser'), + 'edit_item' => __('Edit File', 'wp-parser'), + 'update_item' => __('Update File', 'wp-parser'), + 'add_new_item' => __('New File', 'wp-parser'), + 'new_item_name' => __('New File', 'wp-parser'), + 'separate_items_with_commas' => __('Files separated by comma', 'wp-parser'), + 'add_or_remove_items' => __('Add or remove Files', 'wp-parser'), + 'choose_from_most_used' => __('Choose from the most used Files', 'wp-parser'), + 'menu_name' => __('Files', 'wp-parser'), ], 'public' => true, // Hierarchical x 2 to enable (.+) rather than ([^/]+) for rewrites. @@ -385,7 +371,7 @@ public function register_taxonomies() { $object_types, [ 'hierarchical' => true, - 'label' => __('@since', 'wporg'), + 'label' => __('@since', 'wp-parser'), 'public' => true, 'rewrite' => [ 'with_front' => false, @@ -421,7 +407,7 @@ public function register_taxonomies() { array_merge($object_types, ['code-reference']), [ 'hierarchical' => true, - 'label' => __('Source Type', 'wporg'), + 'label' => __('Source Type', 'wp-parser'), 'public' => true, 'rewrite' => [ 'with_front' => false, @@ -467,7 +453,7 @@ public function register_taxonomies() { ['wp-parser-function', 'wp-parser-method'], [ 'hierarchical' => true, - 'label' => __('Role', 'wporg'), + 'label' => __('Role', 'wp-parser'), 'public' => true, 'rewrite' => [ 'with_front' => false, diff --git a/lib/class-relationships.php b/lib/class-relationships.php index 085dd99..0563896 100644 --- a/lib/class-relationships.php +++ b/lib/class-relationships.php @@ -87,8 +87,8 @@ public function register_post_relationships() { 'order' => 'ASC', ], 'title' => [ - 'from' => __('Uses Functions', 'wporg'), - 'to' => __('Used by Functions', 'wporg'), + 'from' => __('Uses Functions', 'wp-parser'), + 'to' => __('Used by Functions', 'wp-parser'), ], ]); @@ -106,8 +106,8 @@ public function register_post_relationships() { 'order' => 'ASC', ], 'title' => [ - 'from' => __('Uses Methods', 'wporg'), - 'to' => __('Used by Functions', 'wporg'), + 'from' => __('Uses Methods', 'wp-parser'), + 'to' => __('Used by Functions', 'wp-parser'), ], ]); @@ -125,8 +125,8 @@ public function register_post_relationships() { 'order' => 'ASC', ], 'title' => [ - 'from' => __('Uses Hooks', 'wporg'), - 'to' => __('Used by Functions', 'wporg'), + 'from' => __('Uses Hooks', 'wp-parser'), + 'to' => __('Used by Functions', 'wp-parser'), ], ]); @@ -147,8 +147,8 @@ public function register_post_relationships() { 'order' => 'ASC', ], 'title' => [ - 'from' => __('Uses Functions', 'wporg'), - 'to' => __('Used by Methods', 'wporg'), + 'from' => __('Uses Functions', 'wp-parser'), + 'to' => __('Used by Methods', 'wp-parser'), ], ]); @@ -167,8 +167,8 @@ public function register_post_relationships() { 'order' => 'ASC', ], 'title' => [ - 'from' => __('Uses Methods', 'wporg'), - 'to' => __('Used by Methods', 'wporg'), + 'from' => __('Uses Methods', 'wp-parser'), + 'to' => __('Used by Methods', 'wp-parser'), ], ]); @@ -186,8 +186,8 @@ public function register_post_relationships() { 'order' => 'ASC', ], 'title' => [ - 'from' => __('Used by Methods', 'wporg'), - 'to' => __('Uses Hooks', 'wporg'), + 'from' => __('Used by Methods', 'wp-parser'), + 'to' => __('Uses Hooks', 'wp-parser'), ], ]); } diff --git a/plugin.php b/plugin.php index b318a77..4465aa3 100644 --- a/plugin.php +++ b/plugin.php @@ -3,11 +3,12 @@ /** * Plugin Name: AVC WP Parser * Description: Create a plugin/theme/composer-package source reference site powered by WordPress - * Author: Ryan McCue, Paul Gibbs, Andrey "Rarst" Savchenko and Contributors - * Author URI: https://github.com/WordPress/phpdoc-parser/graphs/contributors - * Plugin URI: https://github.com/WordPress/phpdoc-parser + * Author: Evan Shaw, Ryan McCue, Paul Gibbs, Andrey "Rarst" Savchenko and Contributors + * Author URI: https://github.com/aivec/phpdoc-parser/graphs/contributors + * Plugin URI: https://github.com/aivec/phpdoc-parser * Version: %%VERSION%% * Text Domain: wp-parser + * Domain Path: /languages/ */ define('AVC_WP_PARSER', true); @@ -15,6 +16,7 @@ define('AVCPDP_LANG_DIR', __DIR__ . '/languages'); define('AVCPDP_PLUGIN_DIR', ABSPATH . 'wp-content/plugins/' . plugin_basename(dirname(__FILE__))); define('AVCPDP_PLUGIN_URL', site_url() . '/wp-content/plugins/' . plugin_basename(dirname(__FILE__))); +load_plugin_textdomain('wp-parser', false, dirname(plugin_basename(__FILE__)) . '/languages'); if (file_exists(__DIR__ . '/vendor/autoload.php')) { require __DIR__ . '/vendor/autoload.php'; diff --git a/src/Admin.php b/src/Admin.php index 5e17041..5e30e0a 100644 --- a/src/Admin.php +++ b/src/Admin.php @@ -109,7 +109,7 @@ public static function add_reset_votes_form_field($html, $comment) { if (0 !== $count) { $html .= '
'; $html .= ''; - $html .= ''; + $html .= ''; $html .= '
'; } diff --git a/src/Explanations.php b/src/Explanations.php index 6de53bb..e3c798d 100644 --- a/src/Explanations.php +++ b/src/Explanations.php @@ -88,14 +88,14 @@ public function init() { public function register_post_type() { register_post_type($this->exp_post_type, [ 'labels' => [ - 'name' => __('Explanations', 'wporg'), - 'singular_name' => __('Explanation', 'wporg'), - 'all_items' => __('Explanations', 'wporg'), - 'edit_item' => __('Edit Explanation', 'wporg'), - 'view_item' => __('View Explanation', 'wporg'), - 'search_items' => __('Search Explanations', 'wporg'), - 'not_found' => __('No Explanations found', 'wporg'), - 'not_found_in_trash' => __('No Explanations found in trash', 'wporg'), + 'name' => __('Explanations', 'wp-parser'), + 'singular_name' => __('Explanation', 'wp-parser'), + 'all_items' => __('Explanations', 'wp-parser'), + 'edit_item' => __('Edit Explanation', 'wp-parser'), + 'view_item' => __('View Explanation', 'wp-parser'), + 'search_items' => __('Search Explanations', 'wp-parser'), + 'not_found' => __('No Explanations found', 'wp-parser'), + 'not_found_in_trash' => __('No Explanations found in trash', 'wp-parser'), ], 'public' => false, 'publicly_queryable' => true, @@ -186,7 +186,7 @@ public function admin_menu() { if ($menu_slug == $item[2]) { // Modify it to include the pending count. $menu[$i][0] = sprintf( - __('Explanations %s', 'wporg'), + __('Explanations %s', 'wp-parser'), "" . number_format_i18n($count) . '' ); break; @@ -228,13 +228,13 @@ public function post_to_expl_controls($post) { ?>
-

+

@@ -135,7 +139,7 @@ public function addParsedMetaBox($post) { @@ -157,11 +161,186 @@ public function addParsedMetaBox($post) { + + + + $data) : ?> + + + + + + + + ID, $translated_key, true); + ?> + + + + + + + + + + + + + + + + + + + +
- +
- +

ID); ?>

@@ -275,7 +275,7 @@ public function expl_to_post_controls($post) {
- + %2$s', @@ -328,7 +328,7 @@ public function toolbar_edit_link($wp_admin_bar) { public function add_roles() { add_role( 'expl_editor', - __('Explanation Editor', 'wporg'), + __('Explanation Editor', 'wp-parser'), [ 'unfiltered_html' => true, 'read' => true, @@ -415,15 +415,15 @@ public function expl_row_action($actions, $post) { $expl_action['edit-expl'] = sprintf( '%3$s', esc_url(get_edit_post_link($expl->ID)), - esc_attr__('Edit Explanation', 'wporg'), - __('Edit Explanation', 'wporg') + esc_attr__('Edit Explanation', 'wp-parser'), + __('Edit Explanation', 'wp-parser') ); } else { $expl_action['add-expl'] = sprintf( '%3$s', esc_attr(wp_create_nonce('create-expl')), esc_attr($post->ID), - __('Add Explanation', 'wporg') + __('Add Explanation', 'wp-parser') ); } @@ -445,19 +445,19 @@ public function status_controls($post) { ?> - + - + -

+

- + post_status) { case 'draft': - $label = __('Draft', 'wporg'); + $label = __('Draft', 'wp-parser'); break; case 'pending': - $label = __('Pending Review', 'wporg'); + $label = __('Pending Review', 'wp-parser'); break; case 'publish': - $label = __('Published', 'wporg'); + $label = __('Published', 'wp-parser'); break; default: $status = ''; - $label = __('None', 'wporg'); + $label = __('None', 'wp-parser'); break; } @@ -525,11 +525,11 @@ public function admin_enqueue_scripts() { wp_enqueue_script('wporg-explanations', AVCPDP_PLUGIN_URL . '/src/js/explanations.js', ['jquery', 'wp-util'], '20160630', true); wp_localize_script('wporg-explanations', 'wporg', [ - 'editContentLabel' => __('Edit Explanation', 'wporg'), + 'editContentLabel' => __('Edit Explanation', 'wp-parser'), 'statusLabel' => [ - 'draft' => __('Draft', 'wporg'), - 'pending' => __('Pending Review', 'wporg'), - 'publish' => __('Published', 'wporg'), + 'draft' => __('Draft', 'wp-parser'), + 'pending' => __('Pending Review', 'wp-parser'), + 'publish' => __('Published', 'wp-parser'), ], ]); } @@ -547,7 +547,7 @@ public function new_explanation() { $context = empty($_REQUEST['context']) ? '' : sanitize_text_field($_REQUEST['context']); if (avcpdp_get_explanation($post_id)) { - wp_send_json_error(new WP_Error('post_exists', __('Explanation already exists.', 'wporg'))); + wp_send_json_error(new WP_Error('post_exists', __('Explanation already exists.', 'wp-parser'))); } else { $title = get_post_field('post_title', $post_id); @@ -566,7 +566,7 @@ public function new_explanation() { ]); } else { wp_send_json_error( - new WP_Error('post_error', __('Explanation could not be created.', 'wporg')) + new WP_Error('post_error', __('Explanation could not be created.', 'wp-parser')) ); } } @@ -592,7 +592,7 @@ public function un_publish_explanation() { wp_send_json_success(['post_id' => $update]); } else { wp_send_json_error( - new WP_Error('unpublish_error', __('Explanation could not be un-published.', 'wporg')) + new WP_Error('unpublish_error', __('Explanation could not be un-published.', 'wp-parser')) ); } } @@ -617,8 +617,8 @@ public function add_post_column($columns) { $col_data = [ 'has_explanation' => sprintf( '%s', - esc_attr__('Has explanation?', 'wporg'), - esc_html__('Explanation?', 'wporg') + esc_attr__('Has explanation?', 'wp-parser'), + esc_html__('Explanation?', 'wp-parser') ), ]; $columns = array_merge(array_slice($columns, 0, $pos), $col_data, array_slice($columns, $pos)); @@ -642,7 +642,7 @@ public function handle_column_data($column_name, $post_id) { '%s%s', get_edit_post_link($explanation), '', - '' . __('Post has an explanation.', 'wporg') . '' + '' . __('Post has an explanation.', 'wp-parser') . '' ); } } diff --git a/src/ParsedContent.php b/src/ParsedContent.php index 735e74c..d3c061b 100644 --- a/src/ParsedContent.php +++ b/src/ParsedContent.php @@ -65,7 +65,7 @@ public function init() { public function add_meta_boxes() { if (in_array($screen = get_current_screen()->id, $this->post_types)) { remove_meta_box('postexcerpt', $screen, 'normal'); - add_meta_box('wporg_parsed_content', __('Parsed Content', 'wporg'), [$this, 'parsed_meta_box_cb'], $screen, 'normal'); + add_meta_box('wporg_parsed_content', __('Parsed Content', 'wp-parser'), [$this, 'parsed_meta_box_cb'], $screen, 'normal'); } } @@ -86,8 +86,8 @@ public function parsed_meta_box_cb($post) { $src = "https://core.trac.wordpress.org/ticket/{$ticket}"; $ticket_message = sprintf('%2$s', esc_url($src), apply_filters('the_title', $ticket_label)); } else { - $link = sprintf('%s', __('Core Trac', 'wporg')); - $ticket_message = sprintf(__('A valid, open ticket from %s is required to edit parsed content.', 'wporg'), $link); + $link = sprintf('%s', __('Core Trac', 'wp-parser')); + $ticket_message = sprintf(__('A valid, open ticket from %s is required to edit parsed content.', 'wp-parser'), $link); } wp_nonce_field('wporg-parsed-content', 'wporg-parsed-content-nonce'); ?> @@ -95,7 +95,7 @@ public function parsed_meta_box_cb($post) {
- +
post_excerpt); ?>
@@ -104,7 +104,7 @@ public function parsed_meta_box_cb($post) {
- +
@@ -124,16 +124,16 @@ public function parsed_meta_box_cb($post) {
- + - - + + - - + + @@ -180,8 +180,8 @@ public function admin_enqueue_scripts() { wp_localize_script('wporg-parsed-content', 'wporgParsedContent', [ 'ajaxURL' => admin_url('admin-ajax.php'), - 'searchText' => __('Searching ...', 'wporg'), - 'retryText' => __('Invalid ticket number, please try again.', 'wporg'), + 'searchText' => __('Searching ...', 'wp-parser'), + 'retryText' => __('Invalid ticket number, please try again.', 'wp-parser'), ]); } } @@ -235,7 +235,7 @@ public function attach_ticket() { } else { // Ticket number is invalid. wp_send_json_error([ - 'message' => __('Invalid ticket number.', 'wporg'), + 'message' => __('Invalid ticket number.', 'wp-parser'), 'new_nonce' => wp_create_nonce('wporg-attach-ticket'), ]); } @@ -260,13 +260,13 @@ public function detach_ticket() { ) { // Success! wp_send_json_success([ - 'message' => __('Ticket detached.', 'wporg'), + 'message' => __('Ticket detached.', 'wp-parser'), 'new_nonce' => wp_create_nonce('wporg-detach-ticket'), ]); } else { // Still attached. wp_send_json_error([ - 'message' => __('Ticket still attached.', 'wporg'), + 'message' => __('Ticket still attached.', 'wp-parser'), 'new_nonce' => wp_create_nonce('wporg-detach-ticket'), ]); } diff --git a/src/api-functions.php b/src/api-functions.php index 1c5060d..905ae39 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -93,6 +93,38 @@ function avcpdp_post_type_has_source_code($post_type = null) { return in_array($post_type, avcpdp_get_post_types_with_source_code()); } +/** + * Returns the source type terms for the `wp-parser-*` post type currently being queried + * + * @author Evan D Shaw + * @return WP_Term[] + */ +function avcpdp_get_reference_archive_source_type_terms() { + if (!is_archive()) { + // not a code reference archive, cannot get source type terms + return []; + } + $ptype = get_query_var('post_type'); + if (!in_array($ptype, avcpdp_get_parsed_post_types(), true)) { + // only get source type terms from `wp-parser-*` post types + return []; + } + $stype = get_query_var(\WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); + if (empty($stype)) { + // source type not queried for, cannot determine URL + return []; + } + $stypepieces = explode(',', $stype); + if (!avcpdp_source_type_term_slugs_are_valid($stypepieces)) { + // the combination of source type terms are not valid + return []; + } + + $terms = avcpdp_get_source_type_terms_from_slug_pair($stypepieces); + + return $terms; +} + /** * Returns the base URL for the `wp-parser-*` post type currently being queried * @@ -186,8 +218,36 @@ function avcpdp_get_reference_landing_page_posts_from_reference_single_post($pid return []; } - $trail = []; $stterms = avcpdp_get_post_source_type_terms($pid); + + return avcpdp_get_reference_landing_page_posts_from_source_type_terms($stterms); +} + +/** + * Returns hierarchical descending array of reference landing page posts tied to the source types terms + * of the current `wp-parser-*` post type currently being queired + * + * @author Evan D Shaw + * @return array + */ +function avcpdp_get_reference_landing_page_posts_from_archive() { + $stterms = avcpdp_get_reference_archive_source_type_terms(); + if (empty($stterms)) { + return []; + } + + return avcpdp_get_reference_landing_page_posts_from_source_type_terms($stterms); +} + +/** + * Returns hierarchical descending array of reference landing page posts tied to the given source types terms + * + * @author Evan D Shaw + * @param array $stterms + * @return array + */ +function avcpdp_get_reference_landing_page_posts_from_source_type_terms($stterms) { + $trail = []; $stypelanding = get_posts([ 'order' => 'ASC', 'orderby' => 'parent', @@ -223,8 +283,6 @@ function avcpdp_get_reference_landing_page_posts_from_reference_single_post($pid if (!empty($sourcelanding)) { $trail[] = $sourcelanding[0]; } - - $parsertype = \WP_Parser\Plugin::WP_PARSER_PT_MAP[get_post_type()]['urlpiece']; } return $trail; @@ -288,6 +346,30 @@ function avcpdp_source_type_terms_are_valid_for_post($post_id = null) { return avcpdp_source_type_terms_are_valid($terms); } +/** + * Returns an array of source type terms given an array of source type slugs + * + * @author Evan D Shaw + * @param array $termslugs + * @return WP_Term[] + */ +function avcpdp_get_source_type_terms_from_slug_pair($termslugs) { + $terms = []; + foreach ($termslugs as $termslug) { + $term = get_term_by('slug', $termslug, WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); + if (empty($term)) { + return false; + } + if ($term->parent === 0) { + $terms['type'] = $term; + } else { + $terms['name'] = $term; + } + } + + return $terms; +} + /** * Checks whether an array of source type term slugs is a valid combination * @@ -304,14 +386,7 @@ function avcpdp_source_type_term_slugs_are_valid($termslugs) { // a post can only have one source type and one source type name return false; } - $terms = []; - foreach ($termslugs as $termslug) { - $term = get_term_by('slug', $termslug, WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG); - if (empty($term)) { - return false; - } - $terms[] = $term; - } + $terms = avcpdp_get_source_type_terms_from_slug_pair($termslugs); return avcpdp_source_type_terms_are_valid($terms); } @@ -391,20 +466,30 @@ function avcpdp_get_source_type_plugin_terms() { * Returns list of reference post type posts for a given role slug * * @author Evan D Shaw - * @param string $role - * @param int $posts_per_page + * @param WP_Term[] $stterms + * @param string $role + * @param int $posts_per_page * @return int[] */ -function avcpdp_get_reference_post_list_by_role($role, $posts_per_page = 20) { +function avcpdp_get_reference_post_list_by_role($stterms, $role, $posts_per_page = 20) { return get_posts([ 'fields' => 'ids', 'post_type' => avcpdp_get_parsed_post_types(), 'posts_per_page' => $posts_per_page, 'tax_query' => [ + 'relation' => 'AND', [ 'taxonomy' => WP_Parser\Plugin::ROLE_TAX_SLUG, 'field' => 'slug', 'terms' => $role, + 'include_children' => true, + ], + [ + 'taxonomy' => WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG, + 'field' => 'slug', + 'terms' => [$stterms['type']->slug, $stterms['name']->slug], + 'include_children' => false, + 'operator' => 'AND', ], ], ]); From bfa161921a2c1a7a57e878abf5843889067ab46e Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Tue, 7 Sep 2021 18:37:52 +0900 Subject: [PATCH 19/66] refactor: return WP_Query instances rather than post ID arrays for various post retrieval functions --- src/api-functions.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/api-functions.php b/src/api-functions.php index 905ae39..a23fdf5 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -469,10 +469,10 @@ function avcpdp_get_source_type_plugin_terms() { * @param WP_Term[] $stterms * @param string $role * @param int $posts_per_page - * @return int[] + * @return WP_Query */ -function avcpdp_get_reference_post_list_by_role($stterms, $role, $posts_per_page = 20) { - return get_posts([ +function avcpdp_get_reference_post_list_by_role($stterms, $role, $posts_per_page = 10) { + $q = new WP_Query([ 'fields' => 'ids', 'post_type' => avcpdp_get_parsed_post_types(), 'posts_per_page' => $posts_per_page, @@ -493,6 +493,8 @@ function avcpdp_get_reference_post_list_by_role($stterms, $role, $posts_per_page ], ], ]); + + return $q; } /** @@ -544,9 +546,9 @@ function avcpdp_get_reference_post_list_having_roles($posts_per_page = 50) { * @author Evan D Shaw * @param string $hook_type * @param int $posts_per_page - * @return int[] + * @return WP_Query */ -function avcpdp_get_hook_reference_posts($hook_type = 'all', $posts_per_page = 50) { +function avcpdp_get_hook_reference_posts($hook_type = 'all', $posts_per_page = 20) { $params = [ 'fields' => 'ids', 'post_type' => 'wp-parser-hook', @@ -557,7 +559,7 @@ function avcpdp_get_hook_reference_posts($hook_type = 'all', $posts_per_page = 5 $params['meta_value'] = $hook_type; } - return get_posts($params); + return new WP_Query($params); } /** From b3cca9971238ba1a8bd457ecb6a05948bab0dc0e Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Fri, 10 Sep 2021 18:55:15 +0900 Subject: [PATCH 20/66] feat: add translated_summary and translated_description post meta fields for overriding the display of wp-parser-* post type summary and description fields --- src/ParsedContent.php | 278 +++++++++++++++--------------------------- 1 file changed, 95 insertions(+), 183 deletions(-) diff --git a/src/ParsedContent.php b/src/ParsedContent.php index d3c061b..57a1773 100644 --- a/src/ParsedContent.php +++ b/src/ParsedContent.php @@ -2,15 +2,12 @@ namespace Aivec\Plugins\DocParser; -/** - * Class to handle editing parsed content. - * - * @package wporg-developer - */ - /** * Class to handle editing parsed content for the Function-, Class-, Hook-, * and Method-editing screens. + * + * Contains methods for overriding content parsed from source code + * saved in the post object. */ class ParsedContent { @@ -19,15 +16,25 @@ class ParsedContent * * Includes the Code Reference post types. * - * @access public * @var array */ public $post_types; /** - * Constructor. + * Parsed content override meta fields * - * @access public + * @var string[] + */ + public $meta_fields = [ + 'translated_summary', + 'translated_description', + ]; + + /** + * Sets post types member var + * + * @author Evan D Shaw + * @return void */ public function __construct() { $this->post_types = avcpdp_get_parsed_post_types(); @@ -41,54 +48,57 @@ public function __construct() { */ public function init() { // Data. - add_action('add_meta_boxes', [$this, 'add_meta_boxes']); - add_action('save_post', [$this, 'save_post']); - - // Script and styles. - add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_scripts']); - - // AJAX. - add_action('wp_ajax_wporg_attach_ticket', [$this, 'attach_ticket']); - add_action('wp_ajax_wporg_detach_ticket', [$this, 'detach_ticket']); + add_action('add_meta_boxes', [$this, 'addMetaBoxes']); + add_action('save_post', [$this, 'savePost']); // Register meta fields. - register_meta('post', 'wporg_ticket_number', 'absint', '__return_false'); - register_meta('post', 'wporg_ticket_title', 'sanitize_text_field', '__return_false'); register_meta('post', 'wporg_parsed_content', 'wp_kses_post', '__return_false'); + foreach ($this->post_types as $ptype) { + foreach ($this->meta_fields as $key) { + register_post_meta( + $ptype, + $key, + [ + 'single' => true, + 'type' => 'string', + ] + ); + } + } } /** - * Add meta boxes. + * Adds parsed content meta box and removes `postexcerpt` meta box * - * @access public + * @author Evan D Shaw + * @return void */ - public function add_meta_boxes() { - if (in_array($screen = get_current_screen()->id, $this->post_types)) { + public function addMetaBoxes() { + $screen = get_current_screen()->id; + if (in_array($screen, $this->post_types, true)) { remove_meta_box('postexcerpt', $screen, 'normal'); - add_meta_box('wporg_parsed_content', __('Parsed Content', 'wp-parser'), [$this, 'parsed_meta_box_cb'], $screen, 'normal'); + add_meta_box( + 'wporg_parsed_content', + __('Parsed Content', 'wp-parser'), + [$this, 'addParsedMetaBox'], + $screen, + 'normal' + ); } } /** * Parsed content meta box display callback. * - * @access public - * - * @param WP_Post $post Current post object. + * @param \WP_Post $post Current post object. + * @return void */ - public function parsed_meta_box_cb($post) { - $ticket = get_post_meta($post->ID, 'wporg_ticket_number', true); - $ticket_label = get_post_meta($post->ID, 'wporg_ticket_title', true); - $ticket_info = get_post_meta($post->ID, 'wporg_parsed_ticket_info', true); + public function addParsedMetaBox($post) { $content = $post->post_content; + $excerpt = $post->post_excerpt; + $translated_summary = (string)get_post_meta($post->ID, 'translated_summary', true); + $translated_description = (string)get_post_meta($post->ID, 'translated_description', true); - if ($ticket) { - $src = "https://core.trac.wordpress.org/ticket/{$ticket}"; - $ticket_message = sprintf('%2$s', esc_url($src), apply_filters('the_title', $ticket_label)); - } else { - $link = sprintf('%s', __('Core Trac', 'wp-parser')); - $ticket_message = sprintf(__('A valid, open ticket from %s is required to edit parsed content.', 'wp-parser'), $link); - } wp_nonce_field('wporg-parsed-content', 'wporg-parsed-content-nonce'); ?> @@ -98,52 +108,55 @@ public function parsed_meta_box_cb($post) { - + + + + + + + - + - + - - + +
-
post_excerpt); ?>
- +
+ + +
+ false, + 'tinymce' => false, + 'quicktags' => false, + 'textarea_rows' => 2, + ]); + ?> +
+
-
-
- false, - 'tinymce' => false, - 'quicktags' => true, - 'textarea_rows' => 10, - 'textarea_name' => 'content', - ]); - ?> -
+
- + - - - - - - - - - - -
- - +
+ false, + 'tinymce' => false, + 'quicktags' => false, + 'textarea_rows' => 10, + ]); + ?>
id, $this->post_types)) { - wp_enqueue_script('wporg-parsed-content', AVCPDP_PLUGIN_URL . '/src/js/parsed-content.js', ['jquery', 'utils'], '20150824', true); - - wp_localize_script('wporg-parsed-content', 'wporgParsedContent', [ - 'ajaxURL' => admin_url('admin-ajax.php'), - 'searchText' => __('Searching ...', 'wp-parser'), - 'retryText' => __('Invalid ticket number, please try again.', 'wp-parser'), - ]); + public function savePost($post_id) { + if (empty($_POST['wporg-parsed-content-nonce']) || !wp_verify_nonce($_POST['wporg-parsed-content-nonce'], 'wporg-parsed-content')) { + return; } - } - - /** - * AJAX handler for fetching the title of a Core Trac ticket and 'attaching' it to the post. - * - * @access public - */ - public function attach_ticket() { - check_ajax_referer('wporg-attach-ticket', 'nonce'); - - $ticket_no = empty($_REQUEST['ticket']) ? 0 : absint($_REQUEST['ticket']); - $ticket_url = "https://core.trac.wordpress.org/ticket/{$ticket_no}"; - - // Fetch the ticket. - $resp = wp_remote_get(esc_url($ticket_url)); - $status_code = wp_remote_retrieve_response_code($resp); - $body = wp_remote_retrieve_body($resp); - - // Anything other than 200 is invalid. - if (200 === $status_code && null !== $body) { - $title = ''; - - // Snag the page title from the ticket HTML. - if (class_exists('DOMDocument')) { - $doc = new DOMDocument(); - @$doc->loadHTML($body); - $nodes = $doc->getElementsByTagName('title'); - $title = $nodes->item(0)->nodeValue; - - // Strip off the site name. - $title = str_ireplace(' – WordPress Trac', '', $title); - } else { - die(-1); - } - - $post_id = empty($_REQUEST['post_id']) ? 0 : absint($_REQUEST['post_id']); - - update_post_meta($post_id, 'wporg_ticket_number', $ticket_no); - update_post_meta($post_id, 'wporg_ticket_title', $title); - - $link = sprintf('%2$s', esc_url($ticket_url), apply_filters('the_title', $title)); - - // Can haz success. - wp_send_json_success([ - 'message' => $link, - 'new_nonce' => wp_create_nonce('wporg-attach-ticket'), - ]); - } else { - // Ticket number is invalid. - wp_send_json_error([ - 'message' => __('Invalid ticket number.', 'wp-parser'), - 'new_nonce' => wp_create_nonce('wporg-attach-ticket'), - ]); + // No cheaters! + if (!current_user_can('manage_options')) { + return; } - die(0); - } - - /** - * AJAX handler for 'detaching' a ticket from the post. - * - * @access public - */ - public function detach_ticket() { - check_ajax_referer('wporg-detach-ticket', 'nonce'); - - $post_id = empty($_REQUEST['post_id']) ? 0 : absint($_REQUEST['post_id']); - - // Attempt to detach the ticket. - if ( - delete_post_meta($post_id, 'wporg_ticket_number') - && delete_post_meta($post_id, 'wporg_ticket_title') - ) { - // Success! - wp_send_json_success([ - 'message' => __('Ticket detached.', 'wp-parser'), - 'new_nonce' => wp_create_nonce('wporg-detach-ticket'), - ]); - } else { - // Still attached. - wp_send_json_error([ - 'message' => __('Ticket still attached.', 'wp-parser'), - 'new_nonce' => wp_create_nonce('wporg-detach-ticket'), - ]); + foreach ($this->meta_fields as $key) { + // Parsed content. + empty($_POST[$key]) ? delete_post_meta($post_id, $key) : update_post_meta($post_id, $key, $_POST[$key]); } - - die(0); } } From 684cf1bf7628c51baea5e6908a3ac4f383ae501a Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Tue, 14 Sep 2021 00:01:12 +0900 Subject: [PATCH 21/66] feat: allow adding translations for parameters and return value descriptions --- lib/class-hook-reflector.php | 159 +++++++++++++++--------------- src/ParsedContent.php | 184 ++++++++++++++++++++++++++++++++++- src/api-functions.php | 16 +++ src/styles/admin.css | 23 +++++ 4 files changed, 302 insertions(+), 80 deletions(-) diff --git a/lib/class-hook-reflector.php b/lib/class-hook-reflector.php index 50075e0..920a01a 100644 --- a/lib/class-hook-reflector.php +++ b/lib/class-hook-reflector.php @@ -8,92 +8,95 @@ /** * Custom reflector for WordPress hooks. */ -class Hook_Reflector extends BaseReflector { +class Hook_Reflector extends BaseReflector +{ + /** + * @return string + */ + public function getName() { + $printer = new PHPParser_PrettyPrinter_Default(); + return $this->cleanupName($printer->prettyPrintExpr($this->node->args[0]->value)); + } - /** - * @return string - */ - public function getName() { - $printer = new PHPParser_PrettyPrinter_Default; - return $this->cleanupName( $printer->prettyPrintExpr( $this->node->args[0]->value ) ); - } + /** + * @param string $name + * + * @return string + */ + private function cleanupName($name) { + $matches = []; - /** - * @param string $name - * - * @return string - */ - private function cleanupName( $name ) { - $matches = array(); + // quotes on both ends of a string + if (preg_match('/^[\'"]([^\'"]*)[\'"]$/', $name, $matches)) { + return $matches[1]; + } - // quotes on both ends of a string - if ( preg_match( '/^[\'"]([^\'"]*)[\'"]$/', $name, $matches ) ) { - return $matches[1]; - } + // two concatenated things, last one of them a variable + if ( + preg_match( + '/(?:[\'"]([^\'"]*)[\'"]\s*\.\s*)?' . // First filter name string (optional) + '(\$[^\s]*)' . // Dynamic variable + '(?:\s*\.\s*[\'"]([^\'"]*)[\'"])?/', // Second filter name string (optional) + $name, + $matches + ) + ) { + if (isset($matches[3])) { + return $matches[1] . '{' . $matches[2] . '}' . $matches[3]; + } else { + return $matches[1] . '{' . $matches[2] . '}'; + } + } - // two concatenated things, last one of them a variable - if ( preg_match( - '/(?:[\'"]([^\'"]*)[\'"]\s*\.\s*)?' . // First filter name string (optional) - '(\$[^\s]*)' . // Dynamic variable - '(?:\s*\.\s*[\'"]([^\'"]*)[\'"])?/', // Second filter name string (optional) - $name, $matches ) ) { + return $name; + } - if ( isset( $matches[3] ) ) { - return $matches[1] . '{' . $matches[2] . '}' . $matches[3]; - } else { - return $matches[1] . '{' . $matches[2] . '}'; - } - } + /** + * @return string + */ + public function getShortName() { + return $this->getName(); + } - return $name; - } + /** + * @return string + */ + public function getType() { + $type = 'filter'; + switch ((string)$this->node->name) { + case 'do_action': + $type = 'action'; + break; + case 'do_action_ref_array': + $type = 'action_reference'; + break; + case 'do_action_deprecated': + $type = 'action_deprecated'; + break; + case 'apply_filters_ref_array': + $type = 'filter_reference'; + break; + case 'apply_filters_deprecated': + $type = 'filter_deprecated'; + break; + } - /** - * @return string - */ - public function getShortName() { - return $this->getName(); - } + return $type; + } - /** - * @return string - */ - public function getType() { - $type = 'filter'; - switch ( (string) $this->node->name ) { - case 'do_action': - $type = 'action'; - break; - case 'do_action_ref_array': - $type = 'action_reference'; - break; - case 'do_action_deprecated': - $type = 'action_deprecated'; - break; - case 'apply_filters_ref_array': - $type = 'filter_reference'; - break; - case 'apply_filters_deprecated'; - $type = 'filter_deprecated'; - break; - } + /** + * @return array + */ + public function getArgs() { + $printer = new Pretty_Printer(); + $args = []; + foreach ($this->node->args as $arg) { + $args[] = $printer->prettyPrintArg($arg); + } - return $type; - } + // Skip the filter name + array_shift($args); - /** - * @return array - */ - public function getArgs() { - $printer = new Pretty_Printer; - $args = array(); - foreach ( $this->node->args as $arg ) { - $args[] = $printer->prettyPrintArg( $arg ); - } - - // Skip the filter name - array_shift( $args ); - - return $args; - } + return $args; + } } diff --git a/src/ParsedContent.php b/src/ParsedContent.php index 57a1773..5692334 100644 --- a/src/ParsedContent.php +++ b/src/ParsedContent.php @@ -28,6 +28,7 @@ class ParsedContent public $meta_fields = [ 'translated_summary', 'translated_description', + 'translated_return', ]; /** @@ -96,8 +97,11 @@ public function addMetaBoxes() { public function addParsedMetaBox($post) { $content = $post->post_content; $excerpt = $post->post_excerpt; + $params = self::getParams($post->ID); + $return = self::getReturn($post->ID); $translated_summary = (string)get_post_meta($post->ID, 'translated_summary', true); $translated_description = (string)get_post_meta($post->ID, 'translated_description', true); + $translated_return = (string)get_post_meta($post->ID, 'translated_return', true); wp_nonce_field('wporg-parsed-content', 'wporg-parsed-content-nonce'); ?> @@ -108,7 +112,7 @@ public function addParsedMetaBox($post) {
-
+
-
+
+

+
+
+ +
+ + + +
+
+
+
+
+ + +
+ false, + 'tinymce' => false, + 'quicktags' => false, + 'textarea_rows' => 2, + ]); + ?> +
+
+
+ +
+ + + +
+
+
+
+
+ + +
+ false, + 'tinymce' => false, + 'quicktags' => false, + 'textarea_rows' => 2, + ]); + ?> +
+
$v) { + if (strpos($v, '\\') !== false) { + $v = ltrim($v, '\\'); + } + $types[$i] = sprintf('%s', $v, $v); + } + + $params[$tag['variable']]['types'] = implode('|', $types); + $params[$tag['variable']]['content'] = htmlspecialchars($params[$tag['variable']]['content']); + } + } + } + + return $params; + } + + /** + * Retrieve return type and description if available. + * + * If there is no explicit return value, or it is explicitly "void", then + * an empty string is returned. This rules out display of return type for + * classes, hooks, and non-returning functions. + * + * @param int $post_id + * @return string + */ + public static function getReturn($post_id = null) { + if (empty($post_id)) { + $post_id = get_the_ID(); + } + + $tags = get_post_meta($post_id, '_wp-parser_tags', true); + $return = wp_filter_object_list($tags, ['name' => 'return']); + + // If there is no explicit or non-"void" return value, don't display one. + if (empty($return)) { + return [ + 'type' => '', + 'content' => '', + ]; + } + + $return = array_shift($return); + $types = $return['types']; + $type = empty($types) ? '' : esc_html(implode('|', $types)); + + return [ + 'type' => $type, + 'content' => $return['content'], + ]; + } + + /** + * Returns indexed array of parameter post meta keys + * + * @author Evan D Shaw + * @param int $post_id + * @return array + */ + private function getParamMetaKeys($post_id) { + $keys = []; + $params = self::getParams($post_id); + foreach ($params as $name => $data) { + $clean_name = str_replace('$', '', $name); + $translated_key = "translated_{$clean_name}"; + $keys[] = $translated_key; + } + + return $keys; + } + /** * Handle saving parsed content. * @@ -180,6 +359,7 @@ public function savePost($post_id) { return; } + $this->meta_fields = array_merge($this->meta_fields, $this->getParamMetaKeys($post_id)); foreach ($this->meta_fields as $key) { // Parsed content. empty($_POST[$key]) ? delete_post_meta($post_id, $key) : update_post_meta($post_id, $key, $_POST[$key]); diff --git a/src/api-functions.php b/src/api-functions.php index a23fdf5..ab6045c 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -958,3 +958,19 @@ function avcpdp_get_explanation_content($_post) { return $content; } + +/** + * Returns the translated content for a parsed parameter + * + * @author Evan D Shaw + * @param int $post_id + * @param string $key + * @return string + */ +function avcpdp_get_param_translated_content($post_id, $key) { + $clean_name = str_replace('$', '', $key); + $translated_key = "translated_{$clean_name}"; + $translated_key_val = (string)get_post_meta($post_id, $translated_key, true); + + return $translated_key_val; +} diff --git a/src/styles/admin.css b/src/styles/admin.css index 83cf799..8a3b510 100644 --- a/src/styles/admin.css +++ b/src/styles/admin.css @@ -1,5 +1,28 @@ /* =Admin CSS ----------------------------------------------- */ + +.post-type-wp-parser-function .form-table .t-section td, +.post-type-wp-parser-class .form-table .t-section td, +.post-type-wp-parser-method .form-table .t-section td, +.post-type-wp-parser-hook .form-table .t-section td { + padding: 0; +} + +#poststuff .t-section h2 { + padding: 10px 0; + border-bottom: 1px solid #c3c4c7; + font-weight: 700; +} + +.parser-tags { + display: flex; + flex-flow: column nowrap; +} + +.parser-tags .type { + font-weight: 400; +} + #wporg_parsed_ticket { width: 100px; } From ba2e1380ea0597387dd1cffe9e66c806dbcc1e40 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Tue, 14 Sep 2021 12:21:06 +0900 Subject: [PATCH 22/66] feat: move formatting methods/hooks from theme to this plugin --- src/Formatting.php | 696 ++++++++++++++++++++++++++++++++++++++++++ src/Master.php | 1 + src/ParsedContent.php | 6 +- src/api-functions.php | 4 +- 4 files changed, 702 insertions(+), 5 deletions(-) create mode 100644 src/Formatting.php diff --git a/src/Formatting.php b/src/Formatting.php new file mode 100644 index 0000000..b538580 --- /dev/null +++ b/src/Formatting.php @@ -0,0 +1,696 @@ +` character. + * + * @param string $content The text being handled as code. + * @return string + */ + public static function fixCodeEntityEncoding($content) { + return str_replace('&gt;', '>', $content); + } + + /** + * Prevents display of the inline use of {@internal}} as it is not meant to be shown. + * + * @param string $content The post content. + * @param null|string $post_type Optional. The post type. Default null. + * @return string + */ + public static function removeInlineInternal($content, $post_type = null) { + // Only attempt a change for a parsed post type with an @internal reference in the text. + if (avcpdp_is_parsed_post_type($post_type) && false !== strpos($content, '{@internal ')) { + $content = preg_replace('/\{@internal (.+)\}\}/', '', $content); + } + + return $content; + } + + /** + * Makes phpDoc @see and @link references clickable. + * + * Handles these six different types of links: + * + * - {@link https://en.wikipedia.org/wiki/ISO_8601} + * - {@see WP_Rewrite::$index} + * - {@see WP_Query::query()} + * - {@see esc_attr()} + * - {@see 'pre_get_search_form'} + * - {@link https://codex.wordpress.org/The_Loop Use new WordPress Loop} + * + * Note: Though @see and @link are semantically different in meaning, that isn't always + * the case with use so this function handles them identically. + * + * @param string $content The content. + * @return string + */ + public static function makeDoclinkClickable($content) { + // Nothing to change unless a @link or @see reference is in the text. + if (false === strpos($content, '{@link ') && false === strpos($content, '{@see ')) { + return $content; + } + + return preg_replace_callback( + '/\{@(?:link|see) ([^\}]+)\}/', + function ($matches) { + $link = $matches[1]; + + // We may have encoded a link, so unencode if so. + // (This would never occur natually.) + if (0 === strpos($link, '<a ')) { + $link = html_entity_decode($link); + } + + // Undo links made clickable during initial parsing + if (0 === strpos($link, '(.*)<\/a>(.*)$/', $link, $parts)) { + $link = $parts[1]; + if ($parts[3]) { + $link .= ' ' . $parts[3]; + } + } + } + + // Link to an external resource. + if (0 === strpos($link, 'http')) { + $parts = explode(' ', $link, 2); + + // Link without linked text: {@link https://en.wikipedia.org/wiki/ISO_8601} + if (1 === count($parts)) { + $url = $text = $link; + } + + // Link with linked text: {@link https://codex.wordpress.org/The_Loop Use new WordPress Loop} + else { + $url = $parts[0]; + $text = $parts[1]; + } + + $link = self::generate_link($url, $text); + } + + // Link to an internal resource. + else { + $link = self::link_internal_element($link); + } + + return $link; + }, + $content + ); + } + + /** + * Parses and links an internal element if a valid element is found. + * + * @static + * @access public + * + * @param string $link Element string. + * @return string HTML link markup if a valid element was found. + */ + public static function link_internal_element($link) { + $url = ''; + + // Exceptions for externally-linked elements. + $exceptions = [ + 'error_log()' => 'https://secure.php.net/manual/en/function.error-log.php', + ]; + + // Link exceptions that should actually point to external resources. + if (!empty($exceptions[$link])) { + $url = $exceptions[$link]; + } + + // Link to class variable: {@see WP_Rewrite::$index} + elseif (false !== strpos($link, '::$')) { + // Nothing to link to currently. + } + + // Link to class method: {@see WP_Query::query()} + elseif (false !== strpos($link, '::')) { + $url = get_post_type_archive_link('wp-parser-class') . + str_replace(['::', '()'], ['/', ''], $link); + } + + // Link to hook: {@see 'pre_get_search_form'} + elseif (1 === preg_match('/^(?:\'|(?:‘))([\$\w\-&;]+)(?:\'|(?:’))$/', $link, $hook)) { + if (!empty($hook[1])) { + $url = get_post_type_archive_link('wp-parser-hook') . + sanitize_title_with_dashes(html_entity_decode($hook[1])) . '/'; + } + } + + // Link to class: {@see WP_Query} + elseif ( + (in_array($link, [ + 'wpdb', + 'wp_atom_server', + 'wp_xmlrpc_server', // Exceptions that start with lowercase letter + 'AtomFeed', + 'AtomEntry', + 'AtomParser', + 'MagpieRSS', + 'Requests', + 'RSSCache', + 'Translations', + 'Walker', // Exceptions that lack an underscore + ])) + || + (1 === preg_match('/^_?[A-Z][a-zA-Z]+_\w+/', $link)) // Otherwise, class names start with (optional underscore, then) uppercase and have underscore + ) { + $url = get_post_type_archive_link('wp-parser-class') . sanitize_key($link); + } + + // Link to function: {@see esc_attr()} + else { + $url = get_post_type_archive_link('wp-parser-function') . + sanitize_title_with_dashes(html_entity_decode($link)); + } + + if ($url) { + $link = self::generate_link($url, $link); + } + return $link; + } + + /** + * Generates a link given a URL and text. + * + * @param string $url The URL, for the link's href attribute. + * @param string $text The text content of the link. + * @return string The HTML for the link. + */ + public static function generate_link($url, $text) { + /* + * Filters the HTML attributes applied to a link's anchor element. + * + * @param array $attrs The HTML attributes applied to the link's anchor element. + * @param string $url The URL for the link. + */ + $attrs = (array)apply_filters('devhub-format-link-attributes', ['href' => $url], $url); + + // Make sure the filter didn't completely remove the href attribute. + if (empty($attrs['href'])) { + $attrs['href'] = $url; + } + + $attributes = ''; + foreach ($attrs as $name => $value) { + $value = 'href' === $name ? esc_url($value) : esc_attr($value); + $attributes .= sprintf(' %s="%s"', esc_attr($name), $value); + } + + return sprintf('%s', $attributes, esc_html($text)); + } + + /** + * Fixes unintended markup generated by Markdown during parsing. + * + * The parser interprets underscores surrounding text as Markdown indicating + * italics. That is never the intention, so undo it. + * + * @param string $content The post content. + * @param null|string $post_type Optional. The post type. Default null. + * @return string + */ + public static function fixUnintendedMarkdown($content, $post_type = null) { + // Only apply to parsed content that have the em tag. + if (avcpdp_is_parsed_post_type($post_type) && false !== strpos($content, '')) { + $content = preg_replace_callback( + '/([^\s])(.+)<\/em>/U', + function ($matches) { + return $matches[1] . '_' . $matches[2] . '_'; + }, + $content + ); + } + + return $content; + } + + /** + * Handles formatting of the parameter description. + * + * @param string $text The parameter description. + * @return string + */ + public static function formatParamDescription($text) { + // Undo parser's Markdown conversion of '*' to `` and ``. + // In pretty much all cases, the docs mean literal '*' and never emphasis. + // ....... The above is from wporg-developer .......... + // Replace em tags with the italics i tag + $text = str_replace('', '', $text); + $text = str_replace('', '', $text); + + // Undo parser's Markdown conversion of '__' to `` and ``. + // $text = str_replace( array( '', '' ), '__', $text ); + // Encode all htmlentities (but don't double-encode). + $text = htmlentities($text, ENT_COMPAT | ENT_HTML401, 'UTF-8', false); + + // Simple allowable tags that should get unencoded. + // Note: This precludes them from being able to be used in an encoded fashion + // within a parameter description. + $allowable_tags = ['code', 'em', 'strong', 'i']; + foreach ($allowable_tags as $tag) { + $text = str_replace(["<{$tag}>", "</{$tag}>"], ["<{$tag}>", ""], $text); + } + + // Convert any @link or @see to actual link. + $text = self::makeDoclinkClickable($text); + + return apply_filters('devhub-format-description', $text); + } + + /** + * Returns the post given a function/method/class raw reference string + * + * @author Evan D Shaw + * @param string $ref + * @param string $parser_type + * @return \WP_Post|null + */ + public static function getPostFromReference($ref, $parser_type) { + $postname = sanitize_title(str_replace('\\', '-', str_replace('::', '-', $ref))); + $posts = get_posts([ + 'name' => $postname, + 'post_type' => $parser_type, + ]); + if (empty($posts)) { + return null; + } + + return $posts[0]; + } + + /** + * Strips the namespace from a function/method/class reference + * + * @author Evan D Shaw + * @param string $ref + * @return string + */ + public static function stripNamespaceFromReference($ref) { + $parts = explode('\\', $ref); + + return $parts[count($parts) - 1]; + } + + /** + * Automatically detects inline references to parsed resources and links to them. + * + * Examples: + * - Functions: get_the_ID() + * - Classes: My\PSR\Four\Class + * - Methods: My\PSR\Four\Class::isSingle() + * + * Note: currently there is not a reliable way to infer references to hooks. Recommend + * using the {@}see 'hook_name'} notation as used in the inline docs. + * + * @param string $text The text. + * @param bool $strip_namespaces Whether to strip PSR-4 namespaces from the link text + * @return string + */ + public static function autolinkReferences($text, $strip_namespaces = true) { + // Temporary: Don't do anything if the text is a hash notation string. + if ($text && '{' === $text[0]) { + return $text; + } + + $r = ''; + $textarr = preg_split('/(<[^<>]+>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE); // split out HTML tags + $nested_code_pre = 0; // Keep track of how many levels link is nested inside
 or 
+        foreach ($textarr as $piece) {
+            if (preg_match('|^]|i', $piece) || preg_match('|^]|i', $piece) || preg_match('|^]|i', $piece) || preg_match('|^]|i', $piece)) {
+                $nested_code_pre++;
+            } elseif ($nested_code_pre && ('' === strtolower($piece) || '
' === strtolower($piece) || '' === strtolower($piece) || '' === strtolower($piece))) { + $nested_code_pre--; + } + + if ($nested_code_pre || empty($piece) || ($piece[0] === '<' && !preg_match('|^<\s*[\w]{1,20}+://|', $piece))) { + $r .= $piece; + continue; + } + + // Long strings might contain expensive edge cases ... + if (10000 < strlen($piece)) { + // ... break it up + foreach (_split_str_by_whitespace($piece, 2100) as $chunk) { // 2100: Extra room for scheme and leading and trailing paretheses + if (2101 < strlen($chunk)) { + $r .= $chunk; // Too big, no whitespace: bail. + } else { + $r .= make_clickable($chunk); + } + } + } else { + /* + * Everthing outside of this conditional block was copied from core's + *`make_clickable()`. + */ + + $content = " $piece "; // Pad with whitespace to simplify the regexes + + // Only if the text contains something that might be a function. + if (false !== strpos($content, '()')) { + // Detect references to class methods, e.g. WP_Query::query() + // or functions, e.g. register_post_type(). + $content = preg_replace_callback( + '~ + (?!<.*?) # Non-capturing check to ensure not matching what looks like the inside of an HTML tag. + ( # 1: The full method or function name. + # ((\w+)::)? 2: The class prefix, if a method reference. (WordPress core regex) + # (\w+) 3: The method or function name. (WordPress core regex) + (([a-zA-Z0-9_\\\]+)::)? # 2: The PSR-4 class prefix, if a method reference. + ([a-zA-Z0-9_\\\]+) # 3: The method or function name. + ) + \(\) # The () that signifies either a method or function. + (?![^<>]*?>) # Non-capturing check to ensure not matching what looks like the inside of an HTML tag. + ~x', + function ($matches) use ($strip_namespaces) { + // Reference to a class method. + if ($matches[2]) { + // Only link actually parsed methods. + $post = self::getPostFromReference($matches[1], 'wp-parser-method'); + if ($post !== null) { + return sprintf( + '%s', + get_permalink($post->ID), + $strip_namespaces ? self::stripNamespaceFromReference($matches[0]) : $matches[0] + ); + } + // Reference to a function. + } else { + // Only link actually parsed functions. + $post = self::getPostFromReference($matches[1], 'wp-parser-function'); + if ($post !== null) { + return sprintf( + '%s', + get_permalink($post->ID), + $strip_namespaces ? self::stripNamespaceFromReference($matches[0]) : $matches[0] + ); + } + } + + // It's not a reference to an actual thing, so restore original text. + return $matches[0]; + }, + $content + ); + } + + // Detect references to classes, e.g. WP_Query + $content = preg_replace_callback( + // Most class names start with an uppercase letter and have an underscore. + // The exceptions are explicitly listed since future classes likely won't violate previous statement. + // Requests and Translations, due to their higher likelihood of use as a word and not as an inline class + // reference, should be explicitly referenced, e.g. `{@see Requests}`. + '~' + . '(?))' // Does not appear within a tag + . '~', + function ($matches) use ($strip_namespaces) { + // If match is all caps, it's not a possible class name. + // We'll chalk the sole exception, WP, as merely being an abbreviation (the regex won't match it anyhow). + if (strtoupper($matches[0]) === $matches[0]) { + return $matches[0]; + } + + // Only link actually parsed classes. + $post = self::getPostFromReference($matches[0], 'wp-parser-class'); + if ($post !== null) { + return sprintf( + '%s', + get_permalink($post->ID), + $strip_namespaces ? self::stripNamespaceFromReference($matches[0]) : $matches[0] + ); + } + + // Not a class reference, so put the original reference back in. + return $matches[0]; + }, + $content + ); + + // Maybelater: Detect references to hooks, Currently not deemed reliably possible. + $content = substr($content, 1, -1); // Remove our whitespace padding. + $r .= $content; + } // end else + } // end foreach + + // Cleanup of accidental links within links + return preg_replace('#(]+?>|>))]+?>([^>]+?)#i', '$1$3', $r); + } + + /** + * Converts simple Markdown-like lists into list markup. + * + * Necessary in cases like hash param descriptions which don't see Markdown + * list processing during parsing. + * + * Recognizes lists where list items are denoted with an asterisk or dash. + * + * Does not handle nesting of lists. + * + * @param string $text The text to process for lists. + * @return string + */ + public static function convertListsToMarkup($text) { + $inline_list = false; + $li = '
* '; + + // Convert asterisks to a list. + // Example: https://developer.wordpress.org/reference/functions/add_menu_page/ + if (false !== strpos($text, ' * ')) { + // Display as simple plaintext list. + $text = str_replace(' * ', "\n" . $li, $text); + $inline_list = true; + } + + // Convert dashes to a list. + // Example: https://developer.wordpress.org/reference/classes/wp_term_query/__construct/ + // Example: https://developer.wordpress.org/reference/hooks/password_change_email/ + if (false !== strpos($text, ' - ')) { + // Display as simple plaintext list. + $text = str_replace(' - ', "\n" . $li, $text); + $inline_list = true; + } + + // If list detected. + if ($inline_list) { + // Replace first item, ensuring the opening 'ul' tag is prepended. + $text = preg_replace('~^' . preg_quote($li) . '(.+)$~mU', "
  • \$1
  • \n", $text, 1); + // Wrap subsequent list items in 'li' tags. + $text = preg_replace('~^' . preg_quote($li) . '(.+)$~mU', "
  • \$1
  • \n", $text); + $text = trim($text); + + // Close the list if it hasn't been closed before start of next hash parameter. + // $text = preg_replace( '~()(\s+)~smU', '$1
$2', $text ); + $text = preg_replace('~()(\s*)~smU', '$1$2', $text); + + // Closethe list if it hasn't been closed and it's the end of the description. + if ('' === substr(trim($text), -5)) { + $text .= ''; + } + } + + return $text; + } + + /** + * Formats the output of params defined using hash notation. + * + * This is a temporary measure until the parser parses the hash notation + * into component elements that the theme could then handle and style + * properly. + * + * Also, as a stopgap this is going to begin as a barebones hack to simply + * keep the text looking like one big jumble. + * + * @param string $text The content for the param. + * @return string + */ + public static function fixParamHashFormatting($text) { + // Don't do anything if this isn't a hash notation string. + if (!$text || '{' != $text[0]) { + return $text; + } + + $new_text = ''; + $text = trim(substr($text, 1, -1)); + $text = str_replace('@type', "\n@type", $text); + + $in_list = false; + $parts = explode("\n", $text); + foreach ($parts as $part) { + $part = preg_replace('/\s+/', ' ', $part); + list( $wordtype, $type, $name, $description ) = explode(' ', $part . ' ', 4); // extra spaces ensure we'll always have 4 items. + $description = trim($description); + + $type = apply_filters('avcpdp_filter_param_hash_type', $type, $text); + if (strpos($type, '\\') !== false) { + $type = ltrim($type, '\\'); + } + + $description = apply_filters('devhub-format-hash-param-description', $description); + + $skip_closing_li = false; + + // Handle nested hashes. + if (($description && '{' === $description[0]) || '{' === $name) { + $description = ltrim($description, '{') . '
    '; + $skip_closing_li = true; + } elseif ('}' === substr($description, -1)) { + $description = substr($description, 0, -1) . "
\n"; + } + + if ('@type' != $wordtype) { + if ($in_list) { + $in_list = false; + $new_text .= "\n"; + } + + $new_text .= $part; + } else { + if ($in_list) { + $new_text .= '
  • '; + } else { + $new_text .= '
    • '; + $in_list = true; + } + + // Normalize argument name. + if ($name === '{') { + // No name is specified, generally indicating an array of arrays. + $name = ''; + } else { + // The name is defined as a variable, so remove the leading '$'. + $name = ltrim($name, '$'); + } + if ($name) { + $new_text .= "'{$name}'
      "; + } + $new_text .= "({$type}) {$description}"; + if (!$skip_closing_li) { + $new_text .= '
    • '; + } + $new_text .= "\n"; + } + } + + if ($in_list) { + $new_text .= "
    \n"; + } + + return $new_text; + } + + /** + * Fix Parsedown bug that introduces unbalanced 'code' tags. + * + * Under very specific criteria, a bug in the Parsedown package used by the + * parser causes backtick-to-code-tag conversions to get mishandled, skipping + * conversion of a backtick and causing subsequent backticks to be converted + * incorrectly as an open or close 'code' tag (opposite of what it should've + * been). See referenced tickets for more details. + * + * Intended to be a temporary fix until/unless Parsedown is fixed. + * + * @see https://meta.trac.wordpress.org/ticket/2900 + * @see https://github.com/erusev/parsedown/pull/515 + */ + public static function fixParamDescriptionParsedownBug($text) { + $fixes = [ + '/`(.+)/' => '$1', + '/<\/code>(.+)`/' => ' $1', + ]; + + // Determine if code tags look inverted. + $first_start = strpos($text, ''); + $first_end = strpos($text, ''); + if (false !== $first_start && false !== $first_end && $first_end < $first_start) { + $fixes['~(.+)~U'] = ' $1'; + } + + $matched = true; + + foreach ($fixes as $regex => $replace) { + $text = preg_replace($regex, $replace, $text); + } + + return $text; + } + + /** + * Wraps single-quoted HTML within 'code' tags. + * + * The HTML should have been denoted with backticks in the original source, in + * which case it would have been parsed properly, but committers aren't + * always sticklers for documentation formatting. + * + * @access public + * + * @param string $text Text. + * @return string + */ + public static function fixParamDescriptionHtmlAsCode($text) { + if (false !== strpos($text, "'<")) { + $text = preg_replace('/\'(<[^\']+>)\'/', '$1', $text); + } + + return $text; + } +} diff --git a/src/Master.php b/src/Master.php index 8d2ecd9..f44c8ed 100644 --- a/src/Master.php +++ b/src/Master.php @@ -23,6 +23,7 @@ public static function init() { (new Explanations())->init(); (new ParsedContent())->init(); + Formatting::init(); if (is_admin()) { Admin::init(); } diff --git a/src/ParsedContent.php b/src/ParsedContent.php index 5692334..d75632e 100644 --- a/src/ParsedContent.php +++ b/src/ParsedContent.php @@ -201,7 +201,7 @@ public function addParsedMetaBox($post) { 'media_buttons' => false, 'tinymce' => false, 'quicktags' => false, - 'textarea_rows' => 2, + 'textarea_rows' => 10, ]); ?>
  • @@ -239,7 +239,7 @@ public function addParsedMetaBox($post) { 'media_buttons' => false, 'tinymce' => false, 'quicktags' => false, - 'textarea_rows' => 2, + 'textarea_rows' => 10, ]); ?>
    @@ -318,7 +318,7 @@ public static function getReturn($post_id = null) { return [ 'type' => $type, - 'content' => $return['content'], + 'content' => htmlspecialchars($return['content']), ]; } diff --git a/src/api-functions.php b/src/api-functions.php index ab6045c..0330af0 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -922,7 +922,7 @@ function avcpdp_get_explanation_content($_post) { global $post; // Temporarily remove filter. - remove_filter('the_content', ['DevHub_Formatting', 'fix_unintended_markdown'], 1); + remove_filter('the_content', ['Aivec\Plugins\DocParser\Formatting', 'fixUnintendedMarkdown'], 1); // Store original global post. $orig = $post; @@ -954,7 +954,7 @@ function avcpdp_get_explanation_content($_post) { $post = $orig; // Restore filter. - add_filter('the_content', ['DevHub_Formatting', 'fix_unintended_markdown'], 1); + add_filter('the_content', ['Aivec\Plugins\DocParser\Formatting', 'fixUnintendedMarkdown'], 1); return $content; } From 0b357a77556c503630c0e7af801ab98f71b38a18 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Tue, 14 Sep 2021 16:23:14 +0900 Subject: [PATCH 23/66] refactor: move all importer files from lib to src. Make all files PSR-4 compliant. Format all files in accordance with AivecWP-5 ruleset --- composer.json | 5 - lib/class-file-reflector.php | 236 ------- lib/class-function-call-reflector.php | 51 -- lib/class-method-call-reflector.php | 158 ----- lib/class-plugin.php | 665 ------------------ lib/class-pretty-printer.php | 22 - lib/class-static-method-call-reflector.php | 29 - lib/class-wp-cli-logger.php | 38 - lib/runner.php | 484 ------------- lib/template.php | 330 --------- plugin.php | 6 +- src/Admin.php | 103 +-- lib/class-command.php => src/CLI/Commands.php | 17 +- src/CLI/Logger.php | 38 + src/{ => Explanations}/Explanations.php | 168 +++-- src/{js => Explanations}/explanations.js | 0 src/Formatting.php | 77 +- src/Importer/FileReflector.php | 244 +++++++ src/Importer/FunctionCallReflector.php | 51 ++ .../Importer/HookReflector.php | 17 +- .../Importer/Importer.php | 36 +- src/Importer/MethodCallReflector.php | 154 ++++ src/Importer/Parser.php | 489 +++++++++++++ src/Importer/PrettyPrinter.php | 23 + .../Importer/Relationships.php | 17 +- src/Importer/StaticMethodCallReflector.php | 31 + src/Master.php | 133 +--- src/Queries.php | 152 ++++ src/Registrations.php | 659 +++++++++++++++++ src/api-functions.php | 40 +- src/js/parsed-content.js | 90 --- src/template-functions.php | 334 +++++++++ tests/phpunit/includes/export-testcase.php | 4 +- 33 files changed, 2392 insertions(+), 2509 deletions(-) delete mode 100644 lib/class-file-reflector.php delete mode 100644 lib/class-function-call-reflector.php delete mode 100644 lib/class-method-call-reflector.php delete mode 100644 lib/class-plugin.php delete mode 100644 lib/class-pretty-printer.php delete mode 100644 lib/class-static-method-call-reflector.php delete mode 100644 lib/class-wp-cli-logger.php delete mode 100644 lib/runner.php delete mode 100644 lib/template.php rename lib/class-command.php => src/CLI/Commands.php (93%) create mode 100644 src/CLI/Logger.php rename src/{ => Explanations}/Explanations.php (83%) rename src/{js => Explanations}/explanations.js (100%) create mode 100644 src/Importer/FileReflector.php create mode 100644 src/Importer/FunctionCallReflector.php rename lib/class-hook-reflector.php => src/Importer/HookReflector.php (90%) rename lib/class-importer.php => src/Importer/Importer.php (97%) create mode 100644 src/Importer/MethodCallReflector.php create mode 100644 src/Importer/Parser.php create mode 100644 src/Importer/PrettyPrinter.php rename lib/class-relationships.php => src/Importer/Relationships.php (98%) create mode 100644 src/Importer/StaticMethodCallReflector.php create mode 100644 src/Queries.php create mode 100644 src/Registrations.php delete mode 100644 src/js/parsed-content.js diff --git a/composer.json b/composer.json index e7f9f7b..60ff0e0 100644 --- a/composer.json +++ b/composer.json @@ -34,12 +34,7 @@ "wp-cli/i18n-command": "^2.2" }, "autoload": { - "classmap": [ - "lib" - ], "files": [ - "lib/runner.php", - "lib/template.php", "src/api-functions.php", "src/template-functions.php" ], diff --git a/lib/class-file-reflector.php b/lib/class-file-reflector.php deleted file mode 100644 index 62f401d..0000000 --- a/lib/class-file-reflector.php +++ /dev/null @@ -1,236 +0,0 @@ -getType() ) { - // Add classes, functions, and methods to the current location stack - case 'Stmt_Class': - case 'Stmt_Function': - case 'Stmt_ClassMethod': - array_push( $this->location, $node ); - break; - - // Parse out hook definitions and function calls and add them to the queue. - case 'Expr_FuncCall': - $function = new Function_Call_Reflector( $node, $this->context ); - - // Add the call to the list of functions used in this scope. - $this->getLocation()->uses['functions'][] = $function; - - if ( $this->isFilter( $node ) ) { - if ( $this->last_doc && ! $node->getDocComment() ) { - $node->setAttribute( 'comments', array( $this->last_doc ) ); - $this->last_doc = null; - } - - $hook = new Hook_Reflector( $node, $this->context ); - - // Add it to the list of hooks used in this scope. - $this->getLocation()->uses['hooks'][] = $hook; - } - break; - - // Parse out method calls, so we can export where methods are used. - case 'Expr_MethodCall': - $method = new Method_Call_Reflector( $node, $this->context ); - - // Add it to the list of methods used in this scope. - $this->getLocation()->uses['methods'][] = $method; - break; - - // Parse out method calls, so we can export where methods are used. - case 'Expr_StaticCall': - $method = new Static_Method_Call_Reflector( $node, $this->context ); - - // Add it to the list of methods used in this scope. - $this->getLocation()->uses['methods'][] = $method; - break; - - // Parse out `new Class()` calls as uses of Class::__construct(). - case 'Expr_New': - $method = new \WP_Parser\Method_Call_Reflector( $node, $this->context ); - - // Add it to the list of methods used in this scope. - $this->getLocation()->uses['methods'][] = $method; - break; - } - - // Pick up DocBlock from non-documentable elements so that it can be assigned - // to the next hook if necessary. We don't do this for name nodes, since even - // though they aren't documentable, they still carry the docblock from their - // corresponding class/constant/function/etc. that they are the name of. If - // we don't ignore them, we'll end up picking up docblocks that are already - // associated with a named element, and so aren't really from a non- - // documentable element after all. - if ( ! $this->isNodeDocumentable( $node ) && 'Name' !== $node->getType() && ( $docblock = $node->getDocComment() ) ) { - $this->last_doc = $docblock; - } - } - - /** - * Assign queued hooks to functions and update the node stack on leaving a node. - * - * We can now access the function/method reflectors, so we can assign any queued - * hooks to them. The reflector for a node isn't created until the node is left. - * - * @param \PHPParser_Node $node - */ - public function leaveNode( \PHPParser_Node $node ) { - - parent::leaveNode( $node ); - - switch ( $node->getType() ) { - case 'Stmt_Class': - $class = end( $this->classes ); - if ( ! empty( $this->method_uses_queue ) ) { - /** @var Reflection\ClassReflector\MethodReflector $method */ - foreach ( $class->getMethods() as $method ) { - if ( isset( $this->method_uses_queue[ $method->getName() ] ) ) { - if ( isset( $this->method_uses_queue[ $method->getName() ]['methods'] ) ) { - /* - * For methods used in a class, set the class on the method call. - * That allows us to later get the correct class name for $this, self, parent. - */ - foreach ( $this->method_uses_queue[ $method->getName() ]['methods'] as $method_call ) { - /** @var Method_Call_Reflector $method_call */ - $method_call->set_class( $class ); - } - } - - $method->uses = $this->method_uses_queue[ $method->getName() ]; - } - } - } - - $this->method_uses_queue = array(); - array_pop( $this->location ); - break; - - case 'Stmt_Function': - $function = array_pop( $this->location ); - if ( isset( $function->uses ) && ! empty( $function->uses ) ) { - end( $this->functions )->uses = $function->uses; - } - break; - - case 'Stmt_ClassMethod': - $method = array_pop( $this->location ); - - /* - * Store the list of elements used by this method in the queue. We'll - * assign them to the method upon leaving the class (see above). - */ - if ( ! empty( $method->uses ) ) { - $this->method_uses_queue[ $method->name ] = $method->uses; - } - break; - } - } - - /** - * @param \PHPParser_Node $node - * - * @return bool - */ - protected function isFilter( \PHPParser_Node $node ) { - // Ignore variable functions - if ( 'Name' !== $node->name->getType() ) { - return false; - } - - $calling = (string) $node->name; - - $functions = array( - 'apply_filters', - 'apply_filters_ref_array', - 'apply_filters_deprecated', - 'do_action', - 'do_action_ref_array', - 'do_action_deprecated', - ); - - return in_array( $calling, $functions ); - } - - /** - * @return File_Reflector - */ - protected function getLocation() { - return empty( $this->location ) ? $this : end( $this->location ); - } - - /** - * @param \PHPParser_Node $node - * - * @return bool - */ - protected function isNodeDocumentable( \PHPParser_Node $node ) { - return parent::isNodeDocumentable( $node ) - || ( $node instanceof \PHPParser_Node_Expr_FuncCall - && $this->isFilter( $node ) ); - } -} diff --git a/lib/class-function-call-reflector.php b/lib/class-function-call-reflector.php deleted file mode 100644 index 233e6d8..0000000 --- a/lib/class-function-call-reflector.php +++ /dev/null @@ -1,51 +0,0 @@ -node->namespacedName ) ) { - return '\\' . implode( '\\', $this->node->namespacedName->parts ); - } - - $shortName = $this->getShortName(); - - if ( is_a( $shortName, 'PHPParser_Node_Name_FullyQualified' ) ) { - return '\\' . (string) $shortName; - } - - if ( is_a( $shortName, 'PHPParser_Node_Name' ) ) { - return (string) $shortName; - } - - /** @var \PHPParser_Node_Expr_ArrayDimFetch $shortName */ - if ( is_a( $shortName, 'PHPParser_Node_Expr_ArrayDimFetch' ) ) { - $var = $shortName->var->name; - $dim = $shortName->dim->name->parts[0]; - - return "\${$var}[{$dim}]"; - } - - /** @var \PHPParser_Node_Expr_Variable $shortName */ - if ( is_a( $shortName, 'PHPParser_Node_Expr_Variable' ) ) { - return $shortName->name; - } - - return (string) $shortName; - } -} diff --git a/lib/class-method-call-reflector.php b/lib/class-method-call-reflector.php deleted file mode 100644 index 570d5a5..0000000 --- a/lib/class-method-call-reflector.php +++ /dev/null @@ -1,158 +0,0 @@ -node->getType() ) { - $name = '__construct'; - $caller = $this->node->class; - } else { - $name = $this->getShortName(); - $caller = $this->node->var; - } - - if ( $caller instanceof \PHPParser_Node_Expr ) { - $printer = new Pretty_Printer; - $caller = $printer->prettyPrintExpr( $caller ); - } elseif ( $caller instanceof \PHPParser_Node_Name_FullyQualified ) { - $caller = '\\' . $caller->toString(); - } elseif ( $caller instanceof \PHPParser_Node_Name ) { - $caller = $caller->toString(); - } - - $caller = $this->_resolveName( $caller ); - - // If the caller is a function, convert it to the function name - if ( is_a( $caller, 'PHPParser_Node_Expr_FuncCall' ) ) { - - // Add parentheses to signify this is a function call - /** @var \PHPParser_Node_Expr_FuncCall $caller */ - $caller = implode( '\\', $caller->name->parts ) . '()'; - } - - $class_mapping = $this->_getClassMapping(); - if ( array_key_exists( $caller, $class_mapping ) ) { - $caller = $class_mapping[ $caller ]; - } - - return array( $caller, $name ); - } - - /** - * Set the class that this method was called within. - * - * @param ClassReflector $class - */ - public function set_class( ClassReflector $class ) { - - $this->called_in_class = $class; - } - - /** - * Returns whether or not this method call is a static call - * - * @return bool Whether or not this method call is a static call - */ - public function isStatic() { - return false; - } - - /** - * Returns a mapping from variable names to a class name, leverages globals for most used classes - * - * @return array Class mapping to map variable names to classes - */ - protected function _getClassMapping() { - - // List of global use generated using following command: - // ack "global \\\$[^;]+;" --no-filename | tr -d '\t' | sort | uniq | sed "s/global //g" | sed "s/, /,/g" | tr , '\n' | sed "s/;//g" | sort | uniq | sed "s/\\\$//g" | sed "s/[^ ][^ ]*/'&' => ''/g" - // There is probably an easier way, there are currently no globals that are classes starting with an underscore - $wp_globals = array( - 'authordata' => 'WP_User', - 'custom_background' => 'Custom_Background', - 'custom_image_header' => 'Custom_Image_Header', - 'phpmailer' => 'PHPMailer', - 'post' => 'WP_Post', - 'userdata' => 'WP_User', // This can also be stdClass, but you can't call methods on an stdClass - 'wp' => 'WP', - 'wp_admin_bar' => 'WP_Admin_Bar', - 'wp_customize' => 'WP_Customize_Manager', - 'wp_embed' => 'WP_Embed', - 'wp_filesystem' => 'WP_Filesystem', - 'wp_hasher' => 'PasswordHash', // This can be overridden by plugins, for core assume this is ours - 'wp_json' => 'Services_JSON', - 'wp_list_table' => 'WP_List_Table', // This one differs because there are a lot of different List Tables, assume they all only overwrite existing functions on WP_List_Table - 'wp_locale' => 'WP_Locale', - 'wp_object_cache' => 'WP_Object_Cache', - 'wp_query' => 'WP_Query', - 'wp_rewrite' => 'WP_Rewrite', - 'wp_roles' => 'WP_Roles', - 'wp_scripts' => 'WP_Scripts', - 'wp_styles' => 'WP_Styles', - 'wp_the_query' => 'WP_Query', - 'wp_widget_factory' => 'WP_Widget_Factory', - 'wp_xmlrpc_server' => 'wp_xmlrpc_server', // This can be overridden by plugins, for core assume this is ours - 'wpdb' => 'wpdb', - ); - - $wp_functions = array( - 'get_current_screen()' => 'WP_Screen', - '_get_list_table()' => 'WP_List_Table', // This one differs because there are a lot of different List Tables, assume they all only overwrite existing functions on WP_List_Table - 'wp_get_theme()' => 'WP_Theme', - ); - - $class_mapping = array_merge( $wp_globals, $wp_functions ); - - return $class_mapping; - } - - /** - * Resolve a class name from self/parent. - * - * @param string $class The class name. - * - * @return string The resolved class name. - */ - protected function _resolveName( $class ) { - - if ( ! $this->called_in_class ) { - return $class; - } - - - switch ( $class ) { - case '$this': - case 'self': - $namespace = (string) $this->called_in_class->getNamespace(); - $namespace = ( 'global' !== $namespace ) ? $namespace . '\\' : ''; - $class = '\\' . $namespace . $this->called_in_class->getShortName(); - break; - case 'parent': - $class = '\\' . $this->called_in_class->getNode()->extends->toString(); - break; - } - - return $class; - } -} diff --git a/lib/class-plugin.php b/lib/class-plugin.php deleted file mode 100644 index f034942..0000000 --- a/lib/class-plugin.php +++ /dev/null @@ -1,665 +0,0 @@ - [ - 'urlpiece' => 'methods', - 'post_type' => 'wp-parser-method', - ], - 'wp-parser-function' => [ - 'urlpiece' => 'functions', - 'post_type' => 'wp-parser-function', - ], - 'wp-parser-class' => [ - 'urlpiece' => 'classes', - 'post_type' => 'wp-parser-class', - ], - 'wp-parser-hook' => [ - 'urlpiece' => 'hooks', - 'post_type' => 'wp-parser-hook', - ], - ]; - - /** - * @var \WP_Parser\Relationships - */ - public $relationships; - - public function on_load() { - if (defined('WP_CLI') && WP_CLI) { - \WP_CLI::add_command('parser', __NAMESPACE__ . '\\Command'); - } - - $this->relationships = new Relationships(); - - // add_filter('rewrite_rules_array', [$this, 'removeDefaultParserPostTypeRewriteRules'], 10, 1); - add_action('init', [$this, 'register_post_types'], 11); - add_action('init', [$this, 'register_taxonomies'], 11); - add_filter('wp_parser_get_arguments', [$this, 'make_args_safe']); - add_filter('wp_parser_return_type', [$this, 'humanize_separator']); - - add_filter('post_type_link', [$this, 'post_permalink'], 10, 2); - add_filter('term_link', [$this, 'taxonomy_permalink'], 10, 3); - } - - // public static function removeDefaultParserPostTypeRewriteRules($rules) - - /** - * Adds rewrite rules for the `wp-parser-(function|method|class|hook)` post - * types. - * - * Rewrites URLs to be unique on a per source-type basis. - * - * For example, given a source type of `plugin`, a `plugin` child term slug of `my-plugin`, - * and a function named `my-function`, the URL would be `/reference/plugin/my-plugin/functions/my-function`. - * - * @author Evan D Shaw - * @return void - */ - public static function addRewriteRules() { - $sttax = self::SOURCE_TYPE_TAX_SLUG; - $stterms = implode('|', self::SOURCE_TYPE_TERM_SLUGS); - $stterms = str_replace('-', '\-', $stterms); - - // Add rewrite rules for Methods - add_rewrite_rule( - "reference/($stterms)/([a-z_\-]{1,32})/methods/page/([0-9]{1,})/?", - "index.php?post_type=wp-parser-method&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&paged=\$matches[3]", - 'top' - ); - add_rewrite_rule( - "reference/($stterms)/([a-z_\-]{1,32})/classes/([^/]+)/([^/]+)/?\$", - "index.php?post_type=wp-parser-method&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&name=\$matches[3]-\$matches[4]", - 'top' - ); - add_rewrite_rule( - "reference/($stterms)/([a-z_\-]{1,32})/methods/?\$", - "index.php?post_type=wp-parser-method&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]", - 'top' - ); - - // Add rewrite rules for Functions, Classes, and Hooks - foreach (self::WP_PARSER_PT_MAP as $key => $info) { - if ($key === 'wp-parser-method') { - continue; - } - $urlpiece = $info['urlpiece']; - $ptype = $info['post_type']; - add_rewrite_rule( - "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/page/([0-9]{1,})/?", - "index.php?post_type={$ptype}&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&paged=\$matches[3]", - 'top' - ); - add_rewrite_rule( - "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/([^/]+)/?\$", - "index.php?post_type={$ptype}&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&name=\$matches[3]", - 'top' - ); - add_rewrite_rule( - "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/?\$", - "index.php?post_type={$ptype}&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]", - 'top' - ); - } - } - - /** - * Register the function and class post types - */ - public function register_post_types() { - $supports = [ - 'comments', - 'custom-fields', - 'editor', - 'excerpt', - 'revisions', - 'title', - ]; - - self::addRewriteRules(); - - // Functions - // if (!post_type_exists('wp-parser-function')) { - register_post_type('wp-parser-function', [ - 'has_archive' => 'reference/functions', - 'label' => __('Functions', 'wp-parser'), - 'labels' => [ - 'name' => __('Functions', 'wp-parser'), - 'singular_name' => __('Function', 'wp-parser'), - 'all_items' => __('Functions', 'wp-parser'), - 'new_item' => __('New Function', 'wp-parser'), - 'add_new' => __('Add New', 'wp-parser'), - 'add_new_item' => __('Add New Function', 'wp-parser'), - 'edit_item' => __('Edit Function', 'wp-parser'), - 'view_item' => __('View Function', 'wp-parser'), - 'search_items' => __('Search Functions', 'wp-parser'), - 'not_found' => __('No Functions found', 'wp-parser'), - 'not_found_in_trash' => __('No Functions found in trash', 'wp-parser'), - 'parent_item_colon' => __('Parent Function', 'wp-parser'), - 'menu_name' => __('Functions', 'wp-parser'), - ], - 'menu_icon' => 'dashicons-editor-code', - 'public' => true, - 'rewrite' => [ - 'feeds' => false, - 'slug' => 'reference/functions', - 'with_front' => false, - ], - 'supports' => $supports, - 'show_in_rest' => true, - ]); - // } - - // Methods - // if (!post_type_exists('wp-parser-method')) { - register_post_type('wp-parser-method', [ - 'has_archive' => 'reference/methods', - 'label' => __('Methods', 'wp-parser'), - 'labels' => [ - 'name' => __('Methods', 'wp-parser'), - 'singular_name' => __('Method', 'wp-parser'), - 'all_items' => __('Methods', 'wp-parser'), - 'new_item' => __('New Method', 'wp-parser'), - 'add_new' => __('Add New', 'wp-parser'), - 'add_new_item' => __('Add New Method', 'wp-parser'), - 'edit_item' => __('Edit Method', 'wp-parser'), - 'view_item' => __('View Method', 'wp-parser'), - 'search_items' => __('Search Methods', 'wp-parser'), - 'not_found' => __('No Methods found', 'wp-parser'), - 'not_found_in_trash' => __('No Methods found in trash', 'wp-parser'), - 'parent_item_colon' => __('Parent Method', 'wp-parser'), - 'menu_name' => __('Methods', 'wp-parser'), - ], - 'menu_icon' => 'dashicons-editor-code', - 'public' => true, - 'rewrite' => [ - 'feeds' => false, - 'slug' => 'reference/methods', - 'with_front' => false, - ], - 'supports' => $supports, - 'show_in_rest' => true, - ]); - // } - - // Classes - // if (!post_type_exists('wp-parser-class')) { - register_post_type('wp-parser-class', [ - 'has_archive' => 'reference/classes', - 'label' => __('Classes', 'wp-parser'), - 'labels' => [ - 'name' => __('Classes', 'wp-parser'), - 'singular_name' => __('Class', 'wp-parser'), - 'all_items' => __('Classes', 'wp-parser'), - 'new_item' => __('New Class', 'wp-parser'), - 'add_new' => __('Add New', 'wp-parser'), - 'add_new_item' => __('Add New Class', 'wp-parser'), - 'edit_item' => __('Edit Class', 'wp-parser'), - 'view_item' => __('View Class', 'wp-parser'), - 'search_items' => __('Search Classes', 'wp-parser'), - 'not_found' => __('No Classes found', 'wp-parser'), - 'not_found_in_trash' => __('No Classes found in trash', 'wp-parser'), - 'parent_item_colon' => __('Parent Class', 'wp-parser'), - 'menu_name' => __('Classes', 'wp-parser'), - ], - 'menu_icon' => 'dashicons-editor-code', - 'public' => true, - 'rewrite' => [ - 'feeds' => false, - 'slug' => 'reference/classes', - 'with_front' => false, - ], - 'supports' => $supports, - 'show_in_rest' => true, - ]); - // } - - // Hooks - // if (!post_type_exists('wp-parser-hook')) { - register_post_type('wp-parser-hook', [ - 'has_archive' => 'reference/hooks', - 'label' => __('Hooks', 'wp-parser'), - 'labels' => [ - 'name' => __('Hooks', 'wp-parser'), - 'singular_name' => __('Hook', 'wp-parser'), - 'all_items' => __('Hooks', 'wp-parser'), - 'new_item' => __('New Hook', 'wp-parser'), - 'add_new' => __('Add New', 'wp-parser'), - 'add_new_item' => __('Add New Hook', 'wp-parser'), - 'edit_item' => __('Edit Hook', 'wp-parser'), - 'view_item' => __('View Hook', 'wp-parser'), - 'search_items' => __('Search Hooks', 'wp-parser'), - 'not_found' => __('No Hooks found', 'wp-parser'), - 'not_found_in_trash' => __('No Hooks found in trash', 'wp-parser'), - 'parent_item_colon' => __('Parent Hook', 'wp-parser'), - 'menu_name' => __('Hooks', 'wp-parser'), - ], - 'menu_icon' => 'dashicons-editor-code', - 'public' => true, - 'rewrite' => [ - 'feeds' => false, - 'slug' => 'reference/hooks', - 'with_front' => false, - ], - 'supports' => $supports, - 'show_in_rest' => true, - ]); - // } - - // Reference Landing Pages - // if (!post_type_exists('code-reference')) { - register_post_type('code-reference', [ - 'has_archive' => false, - 'exclude_from_search' => true, - 'publicly_queryable' => true, - 'hierarchical' => true, - 'label' => __('Reference Landing Pages', 'wp-parser'), - 'labels' => [ - 'name' => __('Reference Landing Pages', 'wp-parser'), - 'singular_name' => __('Reference Landing Page', 'wp-parser'), - 'all_items' => __('Reference Landing Pages', 'wp-parser'), - 'new_item' => __('New Reference Landing Page', 'wp-parser'), - 'add_new' => __('Add New', 'wp-parser'), - 'add_new_item' => __('Add New Reference Landing Page', 'wp-parser'), - 'edit_item' => __('Edit Reference Landing Page', 'wp-parser'), - 'view_item' => __('View Reference Landing Page', 'wp-parser'), - 'search_items' => __('Search Reference Landing Pages', 'wp-parser'), - 'not_found' => __('No Pages found', 'wp-parser'), - 'not_found_in_trash' => __('No Pages found in trash', 'wp-parser'), - 'menu_name' => __('Reference Landing Pages', 'wp-parser'), - ], - 'menu_icon' => 'dashicons-admin-page', - 'menu_position' => 20, - 'public' => true, - 'rewrite' => [ - 'slug' => 'reference', - 'with_front' => false, - 'pages' => false, - ], - 'supports' => [ - 'page-attributes', - 'custom-fields', - 'editor', - 'excerpt', - 'revisions', - 'title', - ], - 'show_in_rest' => false, - ]); - // } - } - - /** - * Register the file and @since taxonomies - */ - public function register_taxonomies() { - $object_types = avcpdp_get_parsed_post_types(); - - // Files - // if (!taxonomy_exists('wp-parser-source-file')) { - register_taxonomy( - 'wp-parser-source-file', - $object_types, - [ - 'label' => __('Files', 'wp-parser'), - 'labels' => [ - 'name' => __('Files', 'wp-parser'), - 'singular_name' => _x('File', 'taxonomy general name', 'wp-parser'), - 'search_items' => __('Search Files', 'wp-parser'), - 'popular_items' => null, - 'all_items' => __('All Files', 'wp-parser'), - 'parent_item' => __('Parent File', 'wp-parser'), - 'parent_item_colon' => __('Parent File:', 'wp-parser'), - 'edit_item' => __('Edit File', 'wp-parser'), - 'update_item' => __('Update File', 'wp-parser'), - 'add_new_item' => __('New File', 'wp-parser'), - 'new_item_name' => __('New File', 'wp-parser'), - 'separate_items_with_commas' => __('Files separated by comma', 'wp-parser'), - 'add_or_remove_items' => __('Add or remove Files', 'wp-parser'), - 'choose_from_most_used' => __('Choose from the most used Files', 'wp-parser'), - 'menu_name' => __('Files', 'wp-parser'), - ], - 'public' => true, - // Hierarchical x 2 to enable (.+) rather than ([^/]+) for rewrites. - 'hierarchical' => true, - 'rewrite' => [ - 'with_front' => false, - 'slug' => 'reference/files', - 'hierarchical' => true, - ], - 'sort' => false, - 'update_count_callback' => '_update_post_term_count', - 'show_in_rest' => true, - ] - ); - // } - - // Package - // if (!taxonomy_exists('wp-parser-package')) { - register_taxonomy( - 'wp-parser-package', - $object_types, - [ - 'hierarchical' => true, - 'label' => '@package', - 'public' => true, - 'rewrite' => [ - 'with_front' => false, - 'slug' => 'reference/package', - ], - 'sort' => false, - 'update_count_callback' => '_update_post_term_count', - 'show_in_rest' => true, - ] - ); - // } - - // @since - // if (!taxonomy_exists('wp-parser-since')) { - register_taxonomy( - 'wp-parser-since', - $object_types, - [ - 'hierarchical' => true, - 'label' => __('@since', 'wp-parser'), - 'public' => true, - 'rewrite' => [ - 'with_front' => false, - 'slug' => 'reference/since', - ], - 'sort' => false, - 'update_count_callback' => '_update_post_term_count', - 'show_in_rest' => true, - ] - ); - // } - - // Namespaces - // if (!taxonomy_exists('wp-parser-namespace')) { - register_taxonomy( - 'wp-parser-namespace', - $object_types, - [ - 'hierarchical' => true, - 'label' => __('Namespaces', 'wp-parser'), - 'public' => true, - 'rewrite' => ['slug' => 'namespace'], - 'sort' => false, - 'update_count_callback' => '_update_post_term_count', - ] - ); - // } - - // Source Type - // if (!taxonomy_exists(self::SOURCE_TYPE_TAX_SLUG)) { - register_taxonomy( - self::SOURCE_TYPE_TAX_SLUG, - array_merge($object_types, ['code-reference']), - [ - 'hierarchical' => true, - 'label' => __('Source Type', 'wp-parser'), - 'public' => true, - 'rewrite' => [ - 'with_front' => false, - 'slug' => 'reference/source-type', - 'hierarchical' => false, - ], - 'sort' => false, - 'update_count_callback' => '_update_post_term_count', - 'show_in_rest' => true, - ] - ); - // } - - // Add default source-type terms - if (!term_exists('plugin', self::SOURCE_TYPE_TAX_SLUG)) { - wp_insert_term( - __('Plugin', 'wp-parser'), - self::SOURCE_TYPE_TAX_SLUG, - ['slug' => 'plugin'] - ); - } - - if (!term_exists('theme', self::SOURCE_TYPE_TAX_SLUG)) { - wp_insert_term( - __('Theme', 'wp-parser'), - self::SOURCE_TYPE_TAX_SLUG, - ['slug' => 'theme'] - ); - } - - if (!term_exists('composer-package', self::SOURCE_TYPE_TAX_SLUG)) { - wp_insert_term( - __('Composer Package', 'wp-parser'), - self::SOURCE_TYPE_TAX_SLUG, - ['slug' => 'composer-package'] - ); - } - - // Role - // if (!taxonomy_exists(self::ROLE_TAX_SLUG)) { - register_taxonomy( - self::ROLE_TAX_SLUG, - ['wp-parser-function', 'wp-parser-method'], - [ - 'hierarchical' => true, - 'label' => __('Role', 'wp-parser'), - 'public' => true, - 'rewrite' => [ - 'with_front' => false, - 'slug' => 'reference/role', - ], - 'sort' => false, - 'update_count_callback' => '_update_post_term_count', - 'show_in_rest' => true, - ] - ); - // } - - // Add default role terms - $roles = [ - 'display' => __('Display', 'wp-parser'), - 'condition' => __('Condition', 'wp-parser'), - 'utility' => __('Utility', 'wp-parser'), - 'setter' => __('Setter', 'wp-parser'), - 'getter' => __('Getter', 'wp-parser'), - ]; - foreach ($roles as $slug => $label) { - if (!term_exists($slug, self::ROLE_TAX_SLUG)) { - wp_insert_term($label, self::ROLE_TAX_SLUG, ['slug' => $slug]); - } - } - - $parentpostmap = self::getCodeReferenceSourceTypePostMap(); - foreach ($parentpostmap as $slug => $info) { - if (empty($parentpostmap[$slug]['post_id'])) { - continue; - } - - $parent_term = get_terms([ - 'fields' => 'ids', - 'parent' => 0, - 'hide_empty' => false, - 'slug' => $slug, - 'taxonomy' => self::SOURCE_TYPE_TAX_SLUG, - ]); - if (empty($parent_term) || ($parent_term instanceof \WP_Error)) { - continue; - } - $parent_term_id = $parent_term[0]; - // Assign `wp-parser-source-type` term - wp_set_object_terms( - $parentpostmap[$slug]['post_id'], - [$parent_term_id], - self::SOURCE_TYPE_TAX_SLUG - ); - } - - // Link tags to reference post types - foreach (avcpdp_get_parsed_post_types() as $post_type) { - register_taxonomy_for_object_type('post_tag', $post_type); - } - } - - public static function getCodeReferenceSourceTypePostMap() { - $parentpostmap = [ - 'plugin' => [ - 'title' => __('Plugin', 'wp-parser'), - 'post_id' => null, - ], - 'theme' => [ - 'title' => __('Theme', 'wp-parser'), - 'post_id' => null, - ], - 'composer-package' => [ - 'title' => __('Composer Package', 'wp-parser'), - 'post_id' => null, - ], - ]; - foreach ($parentpostmap as $slug => $info) { - $posts = get_posts([ - 'name' => $slug, - 'post_status' => 'any', - 'post_type' => self::CODE_REFERENCE_POST_TYPE, - ]); - if (!empty($posts)) { - $parentpostmap[$slug]['post_id'] = $posts[0]->ID; - } - } - - return $parentpostmap; - } - - /** - * Filters the permalink for a wp-parser-* post. - * - * @param string $link The post's permalink. - * @param \WP_Post $post The post in question. - * @return string - */ - public function post_permalink($link, $post) { - global $wp_rewrite; - - if (!$wp_rewrite->using_permalinks()) { - return $link; - } - - $post_types = ['wp-parser-function', 'wp-parser-hook', 'wp-parser-class', 'wp-parser-method']; - - $stterm = null; - $stchildterm = null; - if (in_array($post->post_type, $post_types, true)) { - $stterms = wp_get_post_terms($post->ID, self::SOURCE_TYPE_TAX_SLUG); - foreach ($stterms as $t) { - if ( - $t->parent === 0 && - in_array($t->slug, self::SOURCE_TYPE_TERM_SLUGS, true) - ) { - $stterm = $t; - } else { - $stchildterm = $t; - } - } - } - - if ($stterm === null || $stchildterm === null) { - return $link; - } - - if ('wp-parser-method' === $post->post_type) { - $parts = explode('-', $post->post_name); - $method = array_pop($parts); - $class = implode('-', $parts); - return home_url(user_trailingslashit( - "reference/{$stterm->slug}/{$stchildterm->slug}/classes/{$class}/{$method}" - )); - } - - array_pop($post_types); - if (in_array($post->post_type, $post_types, true)) { - $urlpiece = self::WP_PARSER_PT_MAP[$post->post_type]['urlpiece']; - return home_url(user_trailingslashit( - "reference/{$stterm->slug}/{$stchildterm->slug}/{$urlpiece}/{$post->post_name}" - )); - } - - return $link; - } - - public function taxonomy_permalink($link, $term, $taxonomy) { - global $wp_rewrite; - - if (!$wp_rewrite->using_permalinks()) { - return $link; - } - - if ($taxonomy === 'wp-parser-source-file') { - $slug = $term->slug; - if (substr($slug, -4) === '-php') { - $slug = substr($slug, 0, -4) . '.php'; - $slug = str_replace('_', '/', $slug); - } - $link = home_url(user_trailingslashit("reference/files/$slug")); - } elseif ($taxonomy === 'wp-parser-since') { - $link = str_replace($term->slug, str_replace('-', '.', $term->slug), $link); - } - return $link; - } - - /** - * Raw phpDoc could potentially introduce unsafe markup into the HTML, so we sanitise it here. - * - * @param array $args Parameter arguments to make safe - * - * @return array - */ - public function make_args_safe($args) { - array_walk_recursive($args, [$this, 'sanitize_argument']); - - return apply_filters('wp_parser_make_args_safe', $args); - } - - /** - * @param mixed $value - * - * @return mixed - */ - public function sanitize_argument(&$value) { - static $filters = [ - 'wp_filter_kses', - 'make_clickable', - 'force_balance_tags', - 'wptexturize', - 'convert_smilies', - 'convert_chars', - 'stripslashes_deep', - ]; - - foreach ($filters as $filter) { - $value = call_user_func($filter, $value); - } - - return $value; - } - - /** - * Replace separators with a more readable version - * - * @param string $type Variable type - * - * @return string - */ - public function humanize_separator($type) { - return str_replace('|', '' . _x(' or ', 'separator', 'wp-parser') . '', $type); - } -} diff --git a/lib/class-pretty-printer.php b/lib/class-pretty-printer.php deleted file mode 100644 index 31c37e2..0000000 --- a/lib/class-pretty-printer.php +++ /dev/null @@ -1,22 +0,0 @@ -noIndentToken, "\n", $this->p( $node ) ); - } -} diff --git a/lib/class-static-method-call-reflector.php b/lib/class-static-method-call-reflector.php deleted file mode 100644 index 9d39c7c..0000000 --- a/lib/class-static-method-call-reflector.php +++ /dev/null @@ -1,29 +0,0 @@ -node->class; - $prefix = ( is_a( $class, 'PHPParser_Node_Name_FullyQualified' ) ) ? '\\' : ''; - $class = $prefix . $this->_resolveName( implode( '\\', $class->parts ) ); - - return array( $class, $this->getShortName() ); - } - - /** - * @return bool - */ - public function isStatic() { - return true; - } -} diff --git a/lib/class-wp-cli-logger.php b/lib/class-wp-cli-logger.php deleted file mode 100644 index cba60a0..0000000 --- a/lib/class-wp-cli-logger.php +++ /dev/null @@ -1,38 +0,0 @@ -getExtension() ) { - continue; - } - - /** - * Whether to exclude a file for parsing. - */ - if ( ! apply_filters( 'wp_parser_pre_get_wp_file', true, $file->getPathname(), $root ) ) { - continue; - } - - $files[] = $file->getPathname(); - } - } catch ( \UnexpectedValueException $exc ) { - return new \WP_Error( - 'unexpected_value_exception', - sprintf( 'Directory [%s] contained a directory we can not recurse into', $directory ) - ); - } - - return $files; -} - -/** - * Fiter the directories to parse. - * - * @param string $root Root dir. - * @param object $dirIterator RecursiveDirectoryIterator. - * @return object|false RecursiveCallbackFilterIterator or false. - */ -function filter_wp_directories( $root, $dirIterator ) { - $root = trailingslashit( $root ); - - /** - * Filter directories found in the root directory. - * - * For example: 'vendor', 'tests', 'specific/directory'. - * - * @param unknown $exclude Array with directories to skip parsing. Default empty array(). - * @param unknown $root Root directory to parse. - */ - $exclude = apply_filters( 'wp_parser_exclude_directories', array(), $root ); - - /** - * Whether to exlude directories if found in a subdirectory. - * - * @param unknown $strict. Exclude subdirectories. Default false. - * @param unknown $root Root directory to parse. - */ - $strict = apply_filters( 'wp_parser_exclude_directories_strict', false, $root ); - - if ( ! $exclude ) { - return false; - } - - $filter = new \RecursiveCallbackFilterIterator( $dirIterator, function ( $current ) use ( $root, $exclude, $strict ) { - if ( $current->isFile() && ( 'php' !== $current->getExtension() ) ) { - return false; - } - - if ( ! $current->isDir() ) { - return true; - } - - // Exclude directories strict. - $dir_name = $current->getFilename(); - if ( $strict && in_array( $dir_name, $exclude ) ) { - return false; - } - - // Exclude directories in the root directory. - $current_path = $current->getPathname(); - foreach ( $exclude as $dir ) { - if ( ( $root . untrailingslashit( $dir ) ) === $current_path ) { - return false; - } - } - - return true; - } ); - - return $filter; -} - -/** - * @param array $files - * @param string $root - * - * @return array - */ -function parse_files( $files, $root ) { - $output = array(); - - foreach ( $files as $filename ) { - $file = new File_Reflector( $filename ); - - $path = ltrim( substr( $filename, strlen( $root ) ), DIRECTORY_SEPARATOR ); - $file->setFilename( $path ); - - $file->process(); - - // TODO proper exporter - $out = array( - 'file' => export_docblock( $file ), - 'path' => str_replace( DIRECTORY_SEPARATOR, '/', $file->getFilename() ), - 'root' => $root, - ); - - if ( ! empty( $file->uses ) ) { - $out['uses'] = export_uses( $file->uses ); - } - - foreach ( $file->getIncludes() as $include ) { - $out['includes'][] = array( - 'name' => $include->getName(), - 'line' => $include->getLineNumber(), - 'type' => $include->getType(), - ); - } - - foreach ( $file->getConstants() as $constant ) { - $out['constants'][] = array( - 'name' => $constant->getShortName(), - 'line' => $constant->getLineNumber(), - 'value' => $constant->getValue(), - ); - } - - if ( ! empty( $file->uses['hooks'] ) ) { - $out['hooks'] = export_hooks( $file->uses['hooks'] ); - } - - foreach ( $file->getFunctions() as $function ) { - $func = array( - 'name' => $function->getShortName(), - 'namespace' => $function->getNamespace(), - 'aliases' => $function->getNamespaceAliases(), - 'line' => $function->getLineNumber(), - 'end_line' => $function->getNode()->getAttribute( 'endLine' ), - 'arguments' => export_arguments( $function->getArguments() ), - 'doc' => export_docblock( $function ), - 'hooks' => array(), - ); - - if ( ! empty( $function->uses ) ) { - $func['uses'] = export_uses( $function->uses ); - - if ( ! empty( $function->uses['hooks'] ) ) { - $func['hooks'] = export_hooks( $function->uses['hooks'] ); - } - } - - $out['functions'][] = $func; - } - - foreach ( $file->getClasses() as $class ) { - $class_data = array( - 'name' => $class->getShortName(), - 'namespace' => $class->getNamespace(), - 'line' => $class->getLineNumber(), - 'end_line' => $class->getNode()->getAttribute( 'endLine' ), - 'final' => $class->isFinal(), - 'abstract' => $class->isAbstract(), - 'extends' => $class->getParentClass(), - 'implements' => $class->getInterfaces(), - 'properties' => export_properties( $class->getProperties() ), - 'methods' => export_methods( $class->getMethods() ), - 'doc' => export_docblock( $class ), - ); - - $out['classes'][] = $class_data; - } - - $output[] = $out; - } - - return $output; -} - -/** - * Fixes newline handling in parsed text. - * - * DocBlock lines, particularly for descriptions, generally adhere to a given character width. For sentences and - * paragraphs that exceed that width, what is intended as a manual soft wrap (via line break) is used to ensure - * on-screen/in-file legibility of that text. These line breaks are retained by phpDocumentor. However, consumers - * of this parsed data may believe the line breaks to be intentional and may display the text as such. - * - * This function fixes text by merging consecutive lines of text into a single line. A special exception is made - * for text appearing in `` and `
    ` tags, as newlines appearing in those tags are always intentional.
    - *
    - * @param string $text
    - *
    - * @return string
    - */
    -function fix_newlines( $text ) {
    -	// Non-naturally occurring string to use as temporary replacement.
    -	$replacement_string = '{{{{{}}}}}';
    -
    -	// Replace newline characters within 'code' and 'pre' tags with replacement string.
    -	$text = preg_replace_callback(
    -		"/(?<=
    )(.+)(?=<\/code><\/pre>)/s",
    -		function ( $matches ) use ( $replacement_string ) {
    -			return preg_replace( '/[\n\r]/', $replacement_string, $matches[1] );
    -		},
    -		$text
    -	);
    -
    -	// Merge consecutive non-blank lines together by replacing the newlines with a space.
    -	$text = preg_replace(
    -		"/[\n\r](?!\s*[\n\r])/m",
    -		' ',
    -		$text
    -	);
    -
    -	// Restore newline characters into code blocks.
    -	$text = str_replace( $replacement_string, "\n", $text );
    -
    -	return $text;
    -}
    -
    -/**
    - * @param BaseReflector|ReflectionAbstract $element
    - *
    - * @return array
    - */
    -function export_docblock( $element ) {
    -	$docblock = $element->getDocBlock();
    -	if ( ! $docblock ) {
    -		return array(
    -			'description'      => '',
    -			'long_description' => '',
    -			'tags'             => array(),
    -		);
    -	}
    -
    -	$output = array(
    -		'description'      => preg_replace( '/[\n\r]+/', ' ', $docblock->getShortDescription() ),
    -		'long_description' => fix_newlines( $docblock->getLongDescription()->getFormattedContents() ),
    -		'tags'             => array(),
    -	);
    -
    -	foreach ( $docblock->getTags() as $tag ) {
    -		$tag_data = array(
    -			'name'    => $tag->getName(),
    -			'content' => preg_replace( '/[\n\r]+/', ' ', format_description( $tag->getDescription() ) ),
    -		);
    -		if ( method_exists( $tag, 'getTypes' ) ) {
    -			$tag_data['types'] = $tag->getTypes();
    -		}
    -		if ( method_exists( $tag, 'getLink' ) ) {
    -			$tag_data['link'] = $tag->getLink();
    -		}
    -		if ( method_exists( $tag, 'getVariableName' ) ) {
    -			$tag_data['variable'] = $tag->getVariableName();
    -		}
    -		if ( method_exists( $tag, 'getReference' ) ) {
    -			$tag_data['refers'] = $tag->getReference();
    -		}
    -		if ( method_exists( $tag, 'getVersion' ) ) {
    -			// Version string.
    -			$version = $tag->getVersion();
    -			if ( ! empty( $version ) ) {
    -				$tag_data['content'] = $version;
    -			}
    -			// Description string.
    -			if ( method_exists( $tag, 'getDescription' ) ) {
    -				$description = preg_replace( '/[\n\r]+/', ' ', format_description( $tag->getDescription() ) );
    -				if ( ! empty( $description ) ) {
    -					$tag_data['description'] = $description;
    -				}
    -			}
    -		}
    -		$output['tags'][] = $tag_data;
    -	}
    -
    -	return $output;
    -}
    -
    -/**
    - * @param Hook_Reflector[] $hooks
    - *
    - * @return array
    - */
    -function export_hooks( array $hooks ) {
    -	$out = array();
    -
    -	foreach ( $hooks as $hook ) {
    -		$out[] = array(
    -			'name'      => $hook->getName(),
    -			'line'      => $hook->getLineNumber(),
    -			'end_line'  => $hook->getNode()->getAttribute( 'endLine' ),
    -			'type'      => $hook->getType(),
    -			'arguments' => $hook->getArgs(),
    -			'doc'       => export_docblock( $hook ),
    -		);
    -	}
    -
    -	return $out;
    -}
    -
    -/**
    - * @param ArgumentReflector[] $arguments
    - *
    - * @return array
    - */
    -function export_arguments( array $arguments ) {
    -	$output = array();
    -
    -	foreach ( $arguments as $argument ) {
    -		$output[] = array(
    -			'name'    => $argument->getName(),
    -			'default' => $argument->getDefault(),
    -			'type'    => $argument->getType(),
    -		);
    -	}
    -
    -	return $output;
    -}
    -
    -/**
    - * @param PropertyReflector[] $properties
    - *
    - * @return array
    - */
    -function export_properties( array $properties ) {
    -	$out = array();
    -
    -	foreach ( $properties as $property ) {
    -		$out[] = array(
    -			'name'        => $property->getName(),
    -			'line'        => $property->getLineNumber(),
    -			'end_line'    => $property->getNode()->getAttribute( 'endLine' ),
    -			'default'     => $property->getDefault(),
    -//			'final' => $property->isFinal(),
    -			'static'      => $property->isStatic(),
    -			'visibility'  => $property->getVisibility(),
    -			'doc'         => export_docblock( $property ),
    -		);
    -	}
    -
    -	return $out;
    -}
    -
    -/**
    - * @param MethodReflector[] $methods
    - *
    - * @return array
    - */
    -function export_methods( array $methods ) {
    -	$output = array();
    -
    -	foreach ( $methods as $method ) {
    -
    -		$method_data = array(
    -			'name'       => $method->getShortName(),
    -			'namespace'  => $method->getNamespace(),
    -			'aliases'    => $method->getNamespaceAliases(),
    -			'line'       => $method->getLineNumber(),
    -			'end_line'   => $method->getNode()->getAttribute( 'endLine' ),
    -			'final'      => $method->isFinal(),
    -			'abstract'   => $method->isAbstract(),
    -			'static'     => $method->isStatic(),
    -			'visibility' => $method->getVisibility(),
    -			'arguments'  => export_arguments( $method->getArguments() ),
    -			'doc'        => export_docblock( $method ),
    -		);
    -
    -		if ( ! empty( $method->uses ) ) {
    -			$method_data['uses'] = export_uses( $method->uses );
    -
    -			if ( ! empty( $method->uses['hooks'] ) ) {
    -				$method_data['hooks'] = export_hooks( $method->uses['hooks'] );
    -			}
    -		}
    -
    -		$output[] = $method_data;
    -	}
    -
    -	return $output;
    -}
    -
    -/**
    - * Export the list of elements used by a file or structure.
    - *
    - * @param array $uses {
    - *        @type Function_Call_Reflector[] $functions The functions called.
    - * }
    - *
    - * @return array
    - */
    -function export_uses( array $uses ) {
    -	$out = array();
    -
    -	// Ignore hooks here, they are exported separately.
    -	unset( $uses['hooks'] );
    -
    -	foreach ( $uses as $type => $used_elements ) {
    -
    -		/** @var MethodReflector|FunctionReflector $element */
    -		foreach ( $used_elements as $element ) {
    -
    -			$name = $element->getName();
    -
    -			switch ( $type ) {
    -				case 'methods':
    -					$out[ $type ][] = array(
    -						'name'     => $name[1],
    -						'class'    => $name[0],
    -						'static'   => $element->isStatic(),
    -						'line'     => $element->getLineNumber(),
    -						'end_line' => $element->getNode()->getAttribute( 'endLine' ),
    -					);
    -					break;
    -
    -				default:
    -				case 'functions':
    -					$out[ $type ][] = array(
    -						'name'     => $name,
    -						'line'     => $element->getLineNumber(),
    -						'end_line' => $element->getNode()->getAttribute( 'endLine' ),
    -					);
    -
    -					if ( '_deprecated_file' === $name
    -						|| '_deprecated_function' === $name
    -						|| '_deprecated_argument' === $name
    -						|| '_deprecated_hook' === $name
    -					) {
    -						$arguments = $element->getNode()->args;
    -
    -						$out[ $type ][0]['deprecation_version'] = $arguments[1]->value->value;
    -					}
    -
    -					break;
    -			}
    -		}
    -	}
    -
    -	return $out;
    -}
    -
    -/**
    - * Format the given description with Markdown.
    - *
    - * @param string $description Description.
    - * @return string Description as Markdown if the Parsedown class exists, otherwise return
    - *                the given description text.
    - */
    -function format_description( $description ) {
    -	if ( class_exists( 'Parsedown' ) ) {
    -		$parsedown   = \Parsedown::instance();
    -		$description = $parsedown->line( $description );
    -	}
    -	return $description;
    -}
    diff --git a/lib/template.php b/lib/template.php
    deleted file mode 100644
    index e2a5c0b..0000000
    --- a/lib/template.php
    +++ /dev/null
    @@ -1,330 +0,0 @@
    -post_type, $post_types, true ) ) {
    -		return $content;
    -	}
    -
    -	$before_content = ( 'wp-parser-hook' === $post->post_type ) ? get_hook_prototype() : get_prototype();
    -	$before_content .= '

    ' . get_the_excerpt() . '

    '; - $before_content .= '
    '; - - $after_content = '
    '; - $after_content .= '

    Arguments

    '; - - $args = ( 'wp-parser-hook' === $post->post_type ) ? get_hook_arguments() : get_arguments(); - - foreach ( $args as $arg ) { - $after_content .= '
    '; - $after_content .= '

    ' . implode( '|', $arg['types'] ) . ' ' . $arg['name'] . '

    '; - $after_content .= empty( $arg['desc'] ) ? '' : wpautop( $arg['desc'], false ); - $after_content .= '
    '; - } - - $after_content .= '
    '; - - $source = get_source_link(); - - if ( $source ) { - $after_content .= 'Source'; - } - - $before_content = apply_filters( 'wp_parser_before_content', $before_content ); - $after_content = apply_filters( 'wp_parser_after_content', $after_content ); - - echo $before_content . $content . $after_content; -} - -/** - * Get the current function's return types - * - * @return array - */ -function get_return_type() { - $function_data = get_post_meta( get_the_ID(), '_wp-parser_tags', true ); - $return_type = wp_list_filter( $function_data, array( 'name' => 'return' ) ); - - if ( ! empty( $return_type ) ) { - // Grab the description from the return type - $return_type = array_shift( $return_type ); - $return_type = $return_type['types']; - } else { - $return_type = array( 'void' ); - } - - return apply_filters( 'wp_parser_return_type', $return_type ); -} - -/** - * Print the current function's return type - * - * @see return_type - */ -function the_return_type() { - echo implode( '|', get_return_type() ); -} - -/** - * Get the current function's return description - * - * @return string - */ -function get_return_desc() { - $function_data = get_post_meta( get_the_ID(), '_wp-parser_tags', true ); - $return_desc = wp_list_filter( $function_data, array( 'name' => 'return' ) ); - - if ( ! empty( $return_desc ) ) { - // Grab the description from the return type - $return_desc = array_shift( $return_desc ); - $return_desc = $return_desc['content']; - } else { - $return_desc = ''; - } - - return apply_filters( 'wp_parser_return_desc', $return_desc ); -} - -/** - * Print the current function's return description - */ -function the_return_desc() { - echo get_return_desc(); -} - -/** - * Do any of the current function's arguments have a default value? - * - * @return bool - */ -function arguments_have_default_values() { - $return = wp_list_filter( get_post_meta( get_the_ID(), '_wp-parser_args', true ), array( 'name' => 'default' ) ); - - return apply_filters( 'wp_parser_arguments_have_default_values', ! empty( $return ) ); -} - -/** - * Is the current function deprecated? - * - * @return bool - */ -function is_function_deprecated() { - /** - * Filters whether the current function is considered deprecated. - * - * @param bool Whether the current function should be considered deprecated. - */ - return apply_filters( 'wp_parser_is_function_deprecated', is_deprecated() ); -} - -/** - * Determines if the current element is deprecated. - * - * Works for conceivably any parsed post type that stores DocBlock tag values in meta. - * - * @return bool Whether the current element is considered deprecated. - */ -function is_deprecated() { - $tags = get_post_meta( get_the_ID(), '_wp-parser_tags', true ); - $deprecated = wp_list_filter( $tags, array( 'name' => 'deprecated' ) ); - - $post_type = get_post_type( get_the_ID() ); - - /** - * Filters whether the current element is deprecated. - * - * @param bool $deprecated Whether the current element should be considered deprecated. - * @param string $post_type Post type for the current element. - */ - return apply_filters( 'wp_parser_is_deprecated', ! empty( $deprecated ), $post_type ); -} - -/** - * Return the current function's arguments. - * - * @return array array( [0] => array( 'name' => '', 'type' => '', 'desc' => '' ), ... ) - */ -function get_arguments() { - $args_data = get_post_meta( get_the_ID(), '_wp-parser_args', true ); - $function_data = get_post_meta( get_the_ID(), '_wp-parser_tags', true ); - $params = wp_list_filter( $function_data, array( 'name' => 'param' ) ); - - $return_args = array(); - - if ( empty( $args_data ) ) { - $args_data = array(); - } - - foreach ( $args_data as $arg ) { - $param_tag = wp_list_filter( $params, array( 'variable' => $arg['name'] ) ); - $param_tag = array_shift( $param_tag ); - $param = array( - 'name' => $arg['name'], - 'types' => array(), - ); - - if ( ! empty( $arg['default'] ) ) { - $param['default_value'] = $arg['default']; - } - - if ( ! empty( $arg['type'] ) ) { - $param['types'] = array( $arg['type'] ); - } else if ( ! empty( $param_tag['types'] ) ) { - $param['types'] = $param_tag['types']; - } - - if ( ! empty( $param_tag['content'] ) ) { - $param['desc'] = $param_tag['content']; - } - - $return_args[] = $param; - } - - return apply_filters( 'wp_parser_get_arguments', $return_args ); -} - -/** - * Return the current hook's arguments. - * - * @return array array( [0] => array( 'name' => '', 'type' => '', 'desc' => '' ), ... ) - */ -function get_hook_arguments() { - $args_data = get_post_meta( get_the_ID(), '_wp-parser_args', true ); - $hook_data = get_post_meta( get_the_ID(), '_wp-parser_tags', true ); - $params = wp_list_filter( $hook_data, array( 'name' => 'param' ) ); - - $return_args = array(); - - if ( empty( $args_data ) ) { - $args_data = array(); - } - - foreach ( $args_data as $arg ) { - $param_tag = array_shift( $params ); - $param = array( - 'name' => '$(unnamed)', - 'types' => array(), - 'value' => $arg, - ); - - if ( ! empty( $param_tag['variable'] ) ) { - $param['name'] = $param_tag['variable']; - } elseif ( 0 === strpos( $arg, '$' ) ) { - $param['name'] = $arg; - } - - if ( ! empty( $param_tag['types'] ) ) { - $param['types'] = $param_tag['types']; - } - - if ( ! empty( $param_tag['content'] ) ) { - $param['desc'] = $param_tag['content']; - } - - $return_args[] = $param; - } - - return apply_filters( 'wp_parser_get_hook_arguments', $return_args ); -} - -/** - * Retrieve the function's prototype as HTML - * - * Use the wp_parser_prototype filter to change the content of this. - * - * @return string Prototype HTML - */ -function get_prototype() { - $type = get_return_type(); - - $friendly_args = array(); - $args = get_arguments(); - foreach ( $args as $arg ) { - $friendly = sprintf( '%s %s', implode( '|', $arg['types'] ), $arg['name'] ); - $friendly .= empty( $arg['default_value'] ) ? '' : ' = ' . $arg['default_value'] . ''; - - $friendly_args[] = $friendly; - } - $friendly_args = implode( ', ', $friendly_args ); - - $name = get_the_title(); - - $prototype = sprintf( '

    %s %s ( %s )

    ', implode( '|', $type ), $name, $friendly_args ); - - return apply_filters( 'wp_parser_prototype', $prototype ); -} - -/** - * Print the function's prototype - * - * @see get_prototype - */ -function the_prototype() { - echo get_prototype(); -} - -/** - * Retrieve the hook's prototype as HTML. - * - * Use the wp_parser_hook_prototype filter to change the content of this. - * - * @return string Prototype HTML - */ -function get_hook_prototype() { - $friendly_args = array(); - $args = get_hook_arguments(); - foreach ( $args as $arg ) { - $friendly = sprintf( '%s %s', implode( '|', $arg['types'] ), $arg['name'] ); - $has_value = ! empty( $arg['value'] ) && 0 !== strpos( $arg['value'], '$' ); - $friendly .= $has_value ? ' = ' . $arg['value'] . '' : ''; - - $friendly_args[] = $friendly; - } - $friendly_args = implode( ', ', $friendly_args ); - - $name = get_the_title(); - - $prototype = sprintf( '

    %s ( %s )

    ', $name, $friendly_args ); - - return apply_filters( 'wp_parser_hook_prototype', $prototype ); -} - -/** - * Returns the URL to the current function on the bbP/BP trac. - * - * @return string - */ -function get_source_link() { - $trac_url = apply_filters( 'wp_parser_source_link_base', false ); - if ( empty( $trac_url ) ) { - return ''; - } - - // Find the current post in the wp-parser-source-file term - $term = get_the_terms( get_the_ID(), 'wp-parser-source-file' ); - if ( ! empty( $term ) && ! is_wp_error( $term ) ) { - $term = array_shift( $term ); - $line_num = (int) get_post_meta( get_the_ID(), '_wp-parser_line_num', true ); - - // The format here takes the base URL, the term name, and the line number - $format = apply_filters( 'wp_parser_source_link_format', '%s%s#L%d' ); - // Link to the specific file name and the line number on trac - $trac_url = sprintf( $format, $trac_url, $term->name, $line_num ); - } - - return $trac_url; -} diff --git a/plugin.php b/plugin.php index 4465aa3..b5380d9 100644 --- a/plugin.php +++ b/plugin.php @@ -22,10 +22,6 @@ require __DIR__ . '/vendor/autoload.php'; } -global $wp_parser; -$wp_parser = new WP_Parser\Plugin(); -$wp_parser->on_load(); - Aivec\Plugins\DocParser\Master::init(); add_filter('wp_parser_exclude_directories', function () { @@ -39,7 +35,7 @@ register_activation_hook(__FILE__, ['P2P_Storage', 'init']); register_activation_hook(__FILE__, ['P2P_Storage', 'install']); register_activation_hook(__FILE__, function () { - (new WP_Parser\Plugin())->register_post_types(); + (new Aivec\Plugins\DocParser\Registrations())->registerPostTypes(); flush_rewrite_rules(); }); diff --git a/src/Admin.php b/src/Admin.php index 5e30e0a..b198a44 100644 --- a/src/Admin.php +++ b/src/Admin.php @@ -2,49 +2,35 @@ namespace Aivec\Plugins\DocParser; -/** - * Admin area customizations and tools. - * - * @package wporg-developer - */ - /** * Class to handle admin area customization and tools. */ class Admin { /** - * Initializer. + * Initializes class + * + * @return void */ public static function init() { - add_action('admin_init', [__CLASS__, 'do_init']); + add_action('admin_init', [get_class(), 'doInit']); } /** * Handles adding/removing hooks. + * + * @return void */ - public static function do_init() { - add_action('admin_enqueue_scripts', [__CLASS__, 'admin_enqueue_scripts']); - - add_action('comment_author', [__CLASS__, 'append_user_nicename'], 10, 2); - - if (class_exists('DevHub_User_Contributed_Notes_Voting')) { - // Add a reset votes checkbox to the comment submit metabox. - add_filter('edit_comment_misc_actions', [__CLASS__, 'add_reset_votes_form_field'], 10, 2); - - // Reset votes after editing a comment in the wp-admin. - add_filter('comment_edit_redirect', [__CLASS__, 'comment_edit_redirect'], 10, 2); - } + public static function doInit() { + add_action('admin_enqueue_scripts', [get_class(), 'adminEnqueueScripts']); } /** * Returns array of screen IDs for parsed post types. * - * @access public - * * @return array */ - public static function get_parsed_post_types_screen_ids() { + public static function getParsedPostTypesScreenIds() { $screen_ids = []; foreach (avcpdp_get_parsed_post_types() as $parsed_post_type) { $screen_ids[] = $parsed_post_type; @@ -57,11 +43,11 @@ public static function get_parsed_post_types_screen_ids() { /** * Enqueue JS and CSS on the edit screens for all parsed post types. * - * @access public + * @return void */ - public static function admin_enqueue_scripts() { + public static function adminEnqueueScripts() { // By default, only enqueue on parsed post type screens. - $screen_ids = self::get_parsed_post_types_screen_ids(); + $screen_ids = self::getParsedPostTypesScreenIds(); /* * Filters whether or not admin.css should be enqueued. @@ -69,65 +55,12 @@ public static function admin_enqueue_scripts() { * @param bool True if admin.css should be enqueued, false otherwise. */ if ((bool)apply_filters('devhub-admin_enqueue_scripts', in_array(get_current_screen()->id, $screen_ids))) { - wp_enqueue_style('wporg-admin', AVCPDP_PLUGIN_URL . '/src/styles/admin.css', [], '20181101'); - } - } - - /** - * Appends the user nicename to the user display name shown for comment authors. - * - * Facilitates discovery of @-mention name for users. - * - * @param string $author_name The comment author's display name. - * @param int $comment_id The comment ID. - * @return string - */ - public static function append_user_nicename($author_name, $comment_id) { - $comment = get_comment($comment_id); - - if ($comment->user_id) { - $username = get_user_by('id', $comment->user_id)->user_nicename; - - $author_name .= '
    @' . $username . '
    '; - } - - return $author_name; - } - - /** - * Adds a checkbox for resetting the contributor note votes in the comment submit meta box. - * - * Only displays the checkbox if the vote score is not zero. - * - * @param string $html Html in the submit meta box. - * @param object $comment Current comment object. - * @return string Output html. - */ - public static function add_reset_votes_form_field($html, $comment) { - $count = (int)DevHub_User_Contributed_Notes_Voting::count_votes($comment->comment_ID, 'difference'); - - if (0 !== $count) { - $html .= '
    '; - $html .= ''; - $html .= ''; - $html .= '
    '; + wp_enqueue_style( + 'wporg-admin', + AVCPDP_PLUGIN_URL . '/src/styles/admin.css', + [], + AVCPDP_VERSION + ); } - - return $html; - } - - /** - * Reset votes before the user is redirected from the wp-admin (after editing a comment). - * - * @param string $location The URI the user will be redirected to. - * @param int $comment_id The ID of the comment being edited. - * @return string The redirect URI. - */ - public static function comment_edit_redirect($location, $comment_id) { - if (isset($_REQUEST['reset_votes']) && $_REQUEST['reset_votes']) { - DevHub_User_Contributed_Notes_Voting::reset_votes($comment_id); - } - - return $location; } } diff --git a/lib/class-command.php b/src/CLI/Commands.php similarity index 93% rename from lib/class-command.php rename to src/CLI/Commands.php index b6cd31a..6b9cc8d 100644 --- a/lib/class-command.php +++ b/src/CLI/Commands.php @@ -1,14 +1,16 @@ [] * * @param array $args + * @return void */ public function export($args) { $directory = realpath($args[0]); @@ -40,6 +43,7 @@ public function export($args) { * * @param array $args * @param array $assoc_args + * @return void */ public function import($args, $assoc_args) { list( $file ) = $args; @@ -75,6 +79,7 @@ public function import($args, $assoc_args) { * * @param array $args * @param array $assoc_args + * @return void */ public function create($args, $assoc_args) { list( $directory ) = $args; @@ -155,13 +160,12 @@ public function create($args, $assoc_args) { * * @param string $path Directory or file to scan for PHPDoc * @param string $format What format the data is returned in: [json|array]. - * * @return string|array */ protected function _get_phpdoc_data($path, $format = 'json') { WP_CLI::line(sprintf('Extracting PHPDoc from %1$s. This may take a few minutes...', $path)); $is_file = is_file($path); - $files = $is_file ? [$path] : get_wp_files($path); + $files = $is_file ? [$path] : Parser::getWpFiles($path); $path = $is_file ? dirname($path) : $path; if ($files instanceof \WP_Error) { @@ -169,7 +173,7 @@ protected function _get_phpdoc_data($path, $format = 'json') { exit; } - $output = parse_files($files, $path); + $output = Parser::parseFiles($files, $path); if ('json' == $format) { return json_encode($output, JSON_PRETTY_PRINT); @@ -184,6 +188,7 @@ protected function _get_phpdoc_data($path, $format = 'json') { * @param array $data * @param bool $skip_sleep If true, the sleep() calls are skipped. * @param bool $import_ignored If true, functions marked `@ignore` will be imported. + * @return void */ protected function _do_import(array $data, $skip_sleep = false, $import_ignored = false) { if (!wp_get_current_user()->exists()) { @@ -193,7 +198,7 @@ protected function _do_import(array $data, $skip_sleep = false, $import_ignored // Run the importer $importer = new Importer($data['meta']); - $importer->setLogger(new WP_CLI_Logger()); + $importer->setLogger(new Logger()); $importer->import($data['files'], $skip_sleep, $import_ignored); WP_CLI::line(); diff --git a/src/CLI/Logger.php b/src/CLI/Logger.php new file mode 100644 index 0000000..feb67be --- /dev/null +++ b/src/CLI/Logger.php @@ -0,0 +1,38 @@ +post_types = avcpdp_get_parsed_post_types(); $this->screen_ids = [$this->exp_post_type, "edit-{$this->exp_post_type}"]; } + /** + * Registers hooks + * + * @author Evan D Shaw + * @return void + */ public function init() { // Setup. - add_action('init', [$this, 'register_post_type'], 0); - add_action('init', [$this, 'remove_editor_support'], 100); + add_action('init', [$this, 'registerPostType'], 0); + add_action('init', [$this, 'removeEditorSupport'], 100); // Admin. - add_action('edit_form_after_title', [$this, 'post_to_expl_controls']); - add_action('edit_form_top', [$this, 'expl_to_post_controls']); - add_action('admin_bar_menu', [$this, 'toolbar_edit_link'], 100); - add_action('admin_menu', [$this, 'admin_menu']); - add_action('load-post-new.php', [$this, 'prevent_direct_creation']); + add_action('edit_form_after_title', [$this, 'postToExplControls']); + add_action('edit_form_top', [$this, 'explToPostControls']); + add_action('admin_bar_menu', [$this, 'toolbarEditLink'], 100); + add_action('admin_menu', [$this, 'adminMenu']); + add_action('load-post-new.php', [$this, 'preventDirectCreation']); // Add admin post listing column for explanations indicator. - add_filter('manage_posts_columns', [$this, 'add_post_column']); + add_filter('manage_posts_columns', [$this, 'addPostColumn']); // Output checkmark in explanations column if post has an explanation. - add_action('manage_posts_custom_column', [$this, 'handle_column_data'], 10, 2); + add_action('manage_posts_custom_column', [$this, 'handleColumnData'], 10, 2); - add_filter('preview_post_link', [$this, 'preview_post_link'], 10, 2); + add_filter('preview_post_link', [$this, 'previewPostLink'], 10, 2); // Permissions. - add_action('after_switch_theme', [$this, 'add_roles']); - add_filter('user_has_cap', [$this, 'grant_caps']); - add_filter('post_row_actions', [$this, 'expl_row_action'], 10, 2); + add_action('after_switch_theme', [$this, 'addRoles']); + add_filter('user_has_cap', [$this, 'grantCaps']); + add_filter('post_row_actions', [$this, 'explRowAction'], 10, 2); // Script and styles. - add_filter('devhub-admin_enqueue_scripts', [$this, 'admin_enqueue_base_scripts']); - add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_scripts']); + add_filter('devhub-admin_enqueue_scripts', [$this, 'adminEnqueueBaseScripts']); + add_action('admin_enqueue_scripts', [$this, 'adminEnqueueScripts']); // AJAX. - add_action('wp_ajax_new_explanation', [$this, 'new_explanation']); - add_action('wp_ajax_un_publish', [$this, 'un_publish_explanation']); + add_action('wp_ajax_new_explanation', [$this, 'newExplanation']); + add_action('wp_ajax_un_publish', [$this, 'unPublishExplanation']); } /** * Register the Explanations post type. * - * @access public + * @return void */ - public function register_post_type() { + public function registerPostType() { register_post_type($this->exp_post_type, [ 'labels' => [ 'name' => __('Explanations', 'wp-parser'), @@ -116,9 +118,9 @@ public function register_post_type() { /** * Remove 'editor' support for the function, hook, class, and method post types. * - * @access public + * @return void */ - public function remove_editor_support() { + public function removeEditorSupport() { foreach ($this->post_types as $type) { remove_post_type_support($type, 'editor'); } @@ -132,14 +134,13 @@ public function remove_editor_support() { * by `get_explanation_content()` to use the explanation being previewed * instead of the published explanation currently associated with the post. * - * @access public * @see 'preview_post_link' filter * - * @param string $preview_link URL used for the post preview. - * @param WP_Post $post Post object. + * @param string $preview_link URL used for the post preview. + * @param \WP_Post $post Post object. * @return string **/ - public function preview_post_link($preview_link, $post) { + public function previewPostLink($preview_link, $post) { if ($this->exp_post_type !== $post->post_type) { return $preview_link; } @@ -167,9 +168,9 @@ public function preview_post_link($preview_link, $post) { * - Removes "Add new". * - Adds count of pending explanations. * - * @access public + * @return void */ - public function admin_menu() { + public function adminMenu() { global $menu; $menu_slug = 'edit.php?post_type=' . $this->exp_post_type; @@ -185,7 +186,7 @@ public function admin_menu() { foreach ($menu as $i => $item) { if ($menu_slug == $item[2]) { // Modify it to include the pending count. - $menu[$i][0] = sprintf( + $menu[$i][0] = sprintf( // phpcs:ignore __('Explanations %s', 'wp-parser'), "" . number_format_i18n($count) . '' ); @@ -201,9 +202,9 @@ public function admin_menu() { * Only prevents admin UI access to directly create a new explanation. It does * not attempt to prevent direct programmatic creation of a new explanation. * - * @access public + * @return void */ - public function prevent_direct_creation() { + public function preventDirectCreation() { if (isset($_GET['post_type']) && $this->exp_post_type == $_GET['post_type']) { wp_safe_redirect(admin_url()); exit; @@ -214,11 +215,10 @@ public function prevent_direct_creation() { * Output the Post-to-Explanation controls in the post editor for functions, * hooks, classes, and methods. * - * @access public - * - * @param WP_Post $post Current post object. + * @param \WP_Post $post Current post object. + * @return void */ - public function post_to_expl_controls($post) { + public function postToExplControls($post) { if (!in_array($post->post_type, $this->post_types)) { return; } @@ -238,7 +238,7 @@ public function post_to_expl_controls($post) { @@ -263,11 +263,10 @@ public function post_to_expl_controls($post) { /** * Output the Explanation-to-Post controls in the Explanation post editor. * - * @access public - * - * @param WP_Post $post Current post object. + * @param \WP_Post $post Current post object. + * @return void */ - public function expl_to_post_controls($post) { + public function explToPostControls($post) { if ($this->exp_post_type !== $post->post_type) { return; } @@ -292,11 +291,10 @@ public function expl_to_post_controls($post) { /** * Adds an 'Edit Explanation' link to the Toolbar on parsed post type single pages. * - * @access public - * - * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance. + * @param \WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance. + * @return void */ - public function toolbar_edit_link($wp_admin_bar) { + public function toolbarEditLink($wp_admin_bar) { global $wp_the_query; $screen = $wp_the_query->get_queried_object(); @@ -323,9 +321,9 @@ public function toolbar_edit_link($wp_admin_bar) { /** * Adds the 'Explanation Editor' role. * - * @access public + * @return void */ - public function add_roles() { + public function addRoles() { add_role( 'expl_editor', __('Explanation Editor', 'wp-parser'), @@ -344,12 +342,10 @@ public function add_roles() { /** * Grants explanation capabilities to users. * - * @access public - * * @param array $caps Capabilities. * @return array Modified capabilities array. */ - public function grant_caps($caps) { + public function grantCaps($caps) { if (!is_user_member_of_blog()) { return $caps; } @@ -392,13 +388,11 @@ public function grant_caps($caps) { /** * Adds the 'Add/Edit Explanation' row actions to the parsed post type list tables. * - * @access public - * * @param array $actions Row actions. * @param \WP_Post $post Parsed post object. * @return array (Maybe) filtered row actions. */ - public function expl_row_action($actions, $post) { + public function explRowAction($actions, $post) { if (!in_array($post->post_type, avcpdp_get_parsed_post_types())) { return $actions; } @@ -433,15 +427,14 @@ public function expl_row_action($actions, $post) { /** * Output the Explanation status controls. * - * @access public - * - * @param int|WP_Post Post ID or WP_Post object. + * @param int|\WP_Post $post Post ID or WP_Post object. + * @return void */ - public function status_controls($post) { + public function statusControls($post) { $explanation = avcpdp_get_explanation($post); if ($explanation) : - echo $this->get_status_label($explanation->ID); + echo $this->getStatusLabel($explanation->ID); ?> @@ -467,12 +460,10 @@ public function status_controls($post) { /** * Retrieve status label for the given post. * - * @access public - * - * @param int|WP_Post $post Post ID or WP_Post object. + * @param int|\WP_Post $post Post ID or \WP_Post object. * @return string */ - public function get_status_label($post) { + public function getStatusLabel($post) { if (!$post = get_post($post)) { return ''; } @@ -499,22 +490,20 @@ public function get_status_label($post) { /** * Enables enqueuing of admin.css for explanation pages. * - * @access public - * * @param bool $do_enqueue Should admin.css be enqueued? * @return bool True if admin.css should be enqueued, false otherwise. */ - public function admin_enqueue_base_scripts($do_enqueue) { + public function adminEnqueueBaseScripts($do_enqueue) { return $do_enqueue || in_array(get_current_screen()->id, $this->screen_ids); } /** * Enqueue JS and CSS for all parsed post types and explanation pages. * - * @access public + * @return void */ - public function admin_enqueue_scripts() { - $parsed_post_types_screen_ids = Admin::get_parsed_post_types_screen_ids(); + public function adminEnqueueScripts() { + $parsed_post_types_screen_ids = Admin::getParsedPostTypesScreenIds(); if ( in_array(get_current_screen()->id, array_merge( @@ -522,7 +511,13 @@ public function admin_enqueue_scripts() { $this->screen_ids )) ) { - wp_enqueue_script('wporg-explanations', AVCPDP_PLUGIN_URL . '/src/js/explanations.js', ['jquery', 'wp-util'], '20160630', true); + wp_enqueue_script( + 'wporg-explanations', + AVCPDP_PLUGIN_URL . '/src/Explanations/explanations.js', + ['jquery', 'wp-util'], + AVCPDP_VERSION, + true + ); wp_localize_script('wporg-explanations', 'wporg', [ 'editContentLabel' => __('Edit Explanation', 'wp-parser'), @@ -538,16 +533,16 @@ public function admin_enqueue_scripts() { /** * AJAX handler for creating and associating a new explanation. * - * @access public + * @return void */ - public function new_explanation() { + public function newExplanation() { check_ajax_referer('create-expl', 'nonce'); $post_id = empty($_REQUEST['post_id']) ? 0 : absint($_REQUEST['post_id']); $context = empty($_REQUEST['context']) ? '' : sanitize_text_field($_REQUEST['context']); if (avcpdp_get_explanation($post_id)) { - wp_send_json_error(new WP_Error('post_exists', __('Explanation already exists.', 'wp-parser'))); + wp_send_json_error(new \WP_Error('post_exists', __('Explanation already exists.', 'wp-parser'))); } else { $title = get_post_field('post_title', $post_id); @@ -566,7 +561,7 @@ public function new_explanation() { ]); } else { wp_send_json_error( - new WP_Error('post_error', __('Explanation could not be created.', 'wp-parser')) + new \WP_Error('post_error', __('Explanation could not be created.', 'wp-parser')) ); } } @@ -575,9 +570,9 @@ public function new_explanation() { /** * AJAX handler for un-publishing an explanation. * - * @access public + * @return void */ - public function un_publish_explanation() { + public function unPublishExplanation() { check_ajax_referer('unpublish-expl', 'nonce'); $post_id = empty($_REQUEST['post_id']) ? 0 : absint($_REQUEST['post_id']); @@ -592,7 +587,7 @@ public function un_publish_explanation() { wp_send_json_success(['post_id' => $update]); } else { wp_send_json_error( - new WP_Error('unpublish_error', __('Explanation could not be un-published.', 'wp-parser')) + new \WP_Error('unpublish_error', __('Explanation could not be un-published.', 'wp-parser')) ); } } @@ -604,12 +599,10 @@ public function un_publish_explanation() { * * Inserted as first column after title column. * - * @access public - * * @param array $columns Associative array of post column ids and labels. * @return array */ - public function add_post_column($columns) { + public function addPostColumn($columns) { if (!empty($_GET['post_type']) && avcpdp_is_parsed_post_type($_GET['post_type'])) { $index = array_search('title', array_keys($columns)); $pos = false === $index ? count($columns) : $index + 1; @@ -630,12 +623,11 @@ public function add_post_column($columns) { /** * Outputs an indicator for the explanations column if post has an explanation. * - * @access public - * * @param string $column_name The name of the column. * @param int $post_id The ID of the post. + * @return void */ - public function handle_column_data($column_name, $post_id) { + public function handleColumnData($column_name, $post_id) { if ('has_explanation' === $column_name) { if ($explanation = avcpdp_get_explanation($post_id)) { printf( diff --git a/src/js/explanations.js b/src/Explanations/explanations.js similarity index 100% rename from src/js/explanations.js rename to src/Explanations/explanations.js diff --git a/src/Formatting.php b/src/Formatting.php index b538580..1772417 100644 --- a/src/Formatting.php +++ b/src/Formatting.php @@ -9,7 +9,9 @@ class Formatting { /** - * Initializer + * Initializes class + * + * @return void */ public static function init() { add_action('init', [get_class(), 'doInit']); @@ -17,6 +19,8 @@ public static function init() { /** * Handles adding/removing hooks to perform formatting as needed. + * + * @return void */ public static function doInit() { // NOTE: This filtering is temporarily disabled and then restored in @@ -59,8 +63,8 @@ public static function fixCodeEntityEncoding($content) { /** * Prevents display of the inline use of {@internal}} as it is not meant to be shown. * - * @param string $content The post content. - * @param null|string $post_type Optional. The post type. Default null. + * @param string $content The post content. + * @param null|string $post_type Optional. The post type. Default null. * @return string */ public static function removeInlineInternal($content, $post_type = null) { @@ -87,7 +91,7 @@ public static function removeInlineInternal($content, $post_type = null) { * Note: Though @see and @link are semantically different in meaning, that isn't always * the case with use so this function handles them identically. * - * @param string $content The content. + * @param string $content The content. * @return string */ public static function makeDoclinkClickable($content) { @@ -124,20 +128,16 @@ function ($matches) { // Link without linked text: {@link https://en.wikipedia.org/wiki/ISO_8601} if (1 === count($parts)) { $url = $text = $link; - } - - // Link with linked text: {@link https://codex.wordpress.org/The_Loop Use new WordPress Loop} - else { + } else { + // Link with linked text: {@link https://codex.wordpress.org/The_Loop Use new WordPress Loop} $url = $parts[0]; $text = $parts[1]; } - $link = self::generate_link($url, $text); - } - - // Link to an internal resource. - else { - $link = self::link_internal_element($link); + $link = self::generateLink($url, $text); + } else { + // Link to an internal resource. + $link = self::linkInternalElement($link); } return $link; @@ -149,13 +149,10 @@ function ($matches) { /** * Parses and links an internal element if a valid element is found. * - * @static - * @access public - * * @param string $link Element string. * @return string HTML link markup if a valid element was found. */ - public static function link_internal_element($link) { + public static function linkInternalElement($link) { $url = ''; // Exceptions for externally-linked elements. @@ -166,29 +163,20 @@ public static function link_internal_element($link) { // Link exceptions that should actually point to external resources. if (!empty($exceptions[$link])) { $url = $exceptions[$link]; - } - // Link to class variable: {@see WP_Rewrite::$index} - elseif (false !== strpos($link, '::$')) { + } elseif (false !== strpos($link, '::$')) { // Nothing to link to currently. - } - - // Link to class method: {@see WP_Query::query()} - elseif (false !== strpos($link, '::')) { + } elseif (false !== strpos($link, '::')) { + // Link to class method: {@see WP_Query::query()} $url = get_post_type_archive_link('wp-parser-class') . str_replace(['::', '()'], ['/', ''], $link); - } - - // Link to hook: {@see 'pre_get_search_form'} - elseif (1 === preg_match('/^(?:\'|(?:‘))([\$\w\-&;]+)(?:\'|(?:’))$/', $link, $hook)) { + } elseif (1 === preg_match('/^(?:\'|(?:‘))([\$\w\-&;]+)(?:\'|(?:’))$/', $link, $hook)) { + // Link to hook: {@see 'pre_get_search_form'} if (!empty($hook[1])) { $url = get_post_type_archive_link('wp-parser-hook') . sanitize_title_with_dashes(html_entity_decode($hook[1])) . '/'; } - } - - // Link to class: {@see WP_Query} - elseif ( + } elseif ( (in_array($link, [ 'wpdb', 'wp_atom_server', @@ -205,17 +193,16 @@ public static function link_internal_element($link) { || (1 === preg_match('/^_?[A-Z][a-zA-Z]+_\w+/', $link)) // Otherwise, class names start with (optional underscore, then) uppercase and have underscore ) { + // Link to class: {@see WP_Query} $url = get_post_type_archive_link('wp-parser-class') . sanitize_key($link); - } - - // Link to function: {@see esc_attr()} - else { + } else { + // Link to function: {@see esc_attr()} $url = get_post_type_archive_link('wp-parser-function') . sanitize_title_with_dashes(html_entity_decode($link)); } if ($url) { - $link = self::generate_link($url, $link); + $link = self::generateLink($url, $link); } return $link; } @@ -227,7 +214,7 @@ public static function link_internal_element($link) { * @param string $text The text content of the link. * @return string The HTML for the link. */ - public static function generate_link($url, $text) { + public static function generateLink($url, $text) { /* * Filters the HTML attributes applied to a link's anchor element. * @@ -256,8 +243,8 @@ public static function generate_link($url, $text) { * The parser interprets underscores surrounding text as Markdown indicating * italics. That is never the intention, so undo it. * - * @param string $content The post content. - * @param null|string $post_type Optional. The post type. Default null. + * @param string $content The post content. + * @param null|string $post_type Optional. The post type. Default null. * @return string */ public static function fixUnintendedMarkdown($content, $post_type = null) { @@ -278,7 +265,7 @@ function ($matches) { /** * Handles formatting of the parameter description. * - * @param string $text The parameter description. + * @param string $text The parameter description. * @return string */ public static function formatParamDescription($text) { @@ -651,6 +638,8 @@ public static function fixParamHashFormatting($text) { * * @see https://meta.trac.wordpress.org/ticket/2900 * @see https://github.com/erusev/parsedown/pull/515 + * @param string $text + * @return string */ public static function fixParamDescriptionParsedownBug($text) { $fixes = [ @@ -681,9 +670,7 @@ public static function fixParamDescriptionParsedownBug($text) { * which case it would have been parsed properly, but committers aren't * always sticklers for documentation formatting. * - * @access public - * - * @param string $text Text. + * @param string $text * @return string */ public static function fixParamDescriptionHtmlAsCode($text) { diff --git a/src/Importer/FileReflector.php b/src/Importer/FileReflector.php new file mode 100644 index 0000000..66c3012 --- /dev/null +++ b/src/Importer/FileReflector.php @@ -0,0 +1,244 @@ +getType()) { + // Add classes, functions, and methods to the current location stack + case 'Stmt_Class': + case 'Stmt_Function': + case 'Stmt_ClassMethod': + array_push($this->location, $node); + break; + + // Parse out hook definitions and function calls and add them to the queue. + case 'Expr_FuncCall': + $function = new FunctionCallReflector($node, $this->context); + + // Add the call to the list of functions used in this scope. + $this->getLocation()->uses['functions'][] = $function; + + if ($this->isFilter($node)) { + if ($this->last_doc && !$node->getDocComment()) { + $node->setAttribute('comments', [$this->last_doc]); + $this->last_doc = null; + } + + $hook = new HookReflector($node, $this->context); + + // Add it to the list of hooks used in this scope. + $this->getLocation()->uses['hooks'][] = $hook; + } + break; + + // Parse out method calls, so we can export where methods are used. + case 'Expr_MethodCall': + $method = new MethodCallReflector($node, $this->context); + + // Add it to the list of methods used in this scope. + $this->getLocation()->uses['methods'][] = $method; + break; + + // Parse out method calls, so we can export where methods are used. + case 'Expr_StaticCall': + $method = new StaticMethodCallReflector($node, $this->context); + + // Add it to the list of methods used in this scope. + $this->getLocation()->uses['methods'][] = $method; + break; + + // Parse out `new Class()` calls as uses of Class::__construct(). + case 'Expr_New': + $method = new MethodCallReflector($node, $this->context); + + // Add it to the list of methods used in this scope. + $this->getLocation()->uses['methods'][] = $method; + break; + } + + // Pick up DocBlock from non-documentable elements so that it can be assigned + // to the next hook if necessary. We don't do this for name nodes, since even + // though they aren't documentable, they still carry the docblock from their + // corresponding class/constant/function/etc. that they are the name of. If + // we don't ignore them, we'll end up picking up docblocks that are already + // associated with a named element, and so aren't really from a non- + // documentable element after all. + if (!$this->isNodeDocumentable($node) && 'Name' !== $node->getType() && ($docblock = $node->getDocComment())) { + $this->last_doc = $docblock; + } + } + + /** + * Assign queued hooks to functions and update the node stack on leaving a node. + * + * We can now access the function/method reflectors, so we can assign any queued + * hooks to them. The reflector for a node isn't created until the node is left. + * + * @param \PHPParser_Node $node + * @return void + */ + public function leaveNode(\PHPParser_Node $node) { + parent::leaveNode($node); + + switch ($node->getType()) { + case 'Stmt_Class': + $class = end($this->classes); + if (!empty($this->method_uses_queue)) { + /* + * @var Reflection\ClassReflector\MethodReflector $method + */ + foreach ($class->getMethods() as $method) { + if (isset($this->method_uses_queue[$method->getName()])) { + if (isset($this->method_uses_queue[$method->getName()]['methods'])) { + /* + * For methods used in a class, set the class on the method call. + * That allows us to later get the correct class name for $this, self, parent. + */ + foreach ($this->method_uses_queue[$method->getName()]['methods'] as $method_call) { + /* + * @var MethodCallReflector $method_call + */ + $method_call->set_class($class); + } + } + + $method->uses = $this->method_uses_queue[$method->getName()]; + } + } + } + + $this->method_uses_queue = []; + array_pop($this->location); + break; + + case 'Stmt_Function': + $function = array_pop($this->location); + if (isset($function->uses) && !empty($function->uses)) { + end($this->functions)->uses = $function->uses; + } + break; + + case 'Stmt_ClassMethod': + $method = array_pop($this->location); + + /* + * Store the list of elements used by this method in the queue. We'll + * assign them to the method upon leaving the class (see above). + */ + if (!empty($method->uses)) { + $this->method_uses_queue[$method->name] = $method->uses; + } + break; + } + } + + /** + * Returns `true` if filter + * + * @param \PHPParser_Node $node + * @return bool + */ + protected function isFilter(\PHPParser_Node $node) { + // Ignore variable functions + if ('Name' !== $node->name->getType()) { + return false; + } + + $calling = (string)$node->name; + + $functions = [ + 'apply_filters', + 'apply_filters_ref_array', + 'apply_filters_deprecated', + 'do_action', + 'do_action_ref_array', + 'do_action_deprecated', + ]; + + return in_array($calling, $functions); + } + + /** + * Returns location instance + * + * @return \Aivec\Plugins\DocParser\Importer\FileReflector + */ + protected function getLocation() { + return empty($this->location) ? $this : end($this->location); + } + + /** + * Returns `true` if node is documentable + * + * @param \PHPParser_Node $node + * @return bool + */ + protected function isNodeDocumentable(\PHPParser_Node $node) { + return parent::isNodeDocumentable($node) + || ($node instanceof \PHPParser_Node_Expr_FuncCall + && $this->isFilter($node)); + } +} diff --git a/src/Importer/FunctionCallReflector.php b/src/Importer/FunctionCallReflector.php new file mode 100644 index 0000000..d411cc3 --- /dev/null +++ b/src/Importer/FunctionCallReflector.php @@ -0,0 +1,51 @@ +node->namespacedName)) { + return '\\' . implode('\\', $this->node->namespacedName->parts); + } + + $shortName = $this->getShortName(); + + if (is_a($shortName, 'PHPParser_Node_Name_FullyQualified')) { + return '\\' . (string)$shortName; + } + + if (is_a($shortName, 'PHPParser_Node_Name')) { + return (string)$shortName; + } + + /* + * @var \PHPParser_Node_Expr_ArrayDimFetch $shortName + */ + if (is_a($shortName, 'PHPParser_Node_Expr_ArrayDimFetch')) { + $var = $shortName->var->name; + $dim = $shortName->dim->name->parts[0]; + + return "\${$var}[{$dim}]"; + } + + /* + * @var \PHPParser_Node_Expr_Variable $shortName + */ + if (is_a($shortName, 'PHPParser_Node_Expr_Variable')) { + return $shortName->name; + } + + return (string)$shortName; + } +} diff --git a/lib/class-hook-reflector.php b/src/Importer/HookReflector.php similarity index 90% rename from lib/class-hook-reflector.php rename to src/Importer/HookReflector.php index 920a01a..7d59ff2 100644 --- a/lib/class-hook-reflector.php +++ b/src/Importer/HookReflector.php @@ -1,6 +1,6 @@ node->args as $arg) { $args[] = $printer->prettyPrintArg($arg); diff --git a/lib/class-importer.php b/src/Importer/Importer.php similarity index 97% rename from lib/class-importer.php rename to src/Importer/Importer.php index 667de25..4d48912 100644 --- a/lib/class-importer.php +++ b/src/Importer/Importer.php @@ -1,7 +1,8 @@ 'wp-parser-class', 'post_type_method' => 'wp-parser-method', @@ -25,7 +23,7 @@ class Importer implements LoggerAwareInterface 'taxonomy_namespace' => 'wp-parser-namespace', 'taxonomy_package' => 'wp-parser-package', 'taxonomy_since_version' => 'wp-parser-since', - 'taxonomy_source_type' => Plugin::SOURCE_TYPE_TAX_SLUG, + 'taxonomy_source_type' => Registrations::SOURCE_TYPE_TAX_SLUG, ]; /** @@ -43,14 +41,14 @@ class Importer implements LoggerAwareInterface public $taxonomy_namespace; /** - * Taxonomy name for an item's @since tag + * Taxonomy name for an item's `@since` tag * * @var string */ public $taxonomy_since_version; /** - * Taxonomy name for an item's @package/@subpackage tags + * Taxonomy name for an item's `@package/@subpackage` tags * * @var string */ @@ -108,7 +106,9 @@ class Importer implements LoggerAwareInterface public $file_meta = []; /** - * @var array Human-readable errors + * Human-readable errors + * + * @var array */ public $errors = []; @@ -120,7 +120,9 @@ class Importer implements LoggerAwareInterface public $version; /** - * @var array Cached items of inserted terms + * Cached items of inserted terms + * + * @var array */ protected $inserted_terms = []; @@ -150,6 +152,7 @@ public function __construct(array $source_type_meta, array $args = []) { * @param array $data * @param bool $skip_sleep Optional; defaults to false. If true, the sleep() calls are skipped. * @param bool $import_ignored_functions Optional; defaults to false. If true, functions marked `@ignore` will be imported. + * @return void */ public function import(array $data, $skip_sleep = false, $import_ignored_functions = false) { global $wpdb; @@ -255,13 +258,13 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio // Create code-reference child page for the current plugin/theme/composer-package $pageslug = $this->source_type_meta['type']; - $parentpostmap = Plugin::getCodeReferenceSourceTypePostMap(); + $parentpostmap = Registrations::getCodeReferenceSourceTypePostMap(); if (empty($parentpostmap[$pageslug]['post_id'])) { $toprefpid = wp_insert_post([ 'post_name' => $pageslug, 'post_title' => $parentpostmap[$pageslug]['title'], 'post_content' => '', - 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, + 'post_type' => Registrations::CODE_REFERENCE_POST_TYPE, ]); if (!($toprefpid instanceof \WP_Error)) { $parentpostmap[$pageslug]['post_id'] = $toprefpid; @@ -272,7 +275,7 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio 'name' => $this->source_type_meta['name'], 'post_status' => 'any', 'post_parent' => $parentpostmap[$pageslug]['post_id'], - 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, + 'post_type' => Registrations::CODE_REFERENCE_POST_TYPE, ]); if (empty($refpage)) { $post_id = wp_insert_post([ @@ -281,7 +284,7 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio 'post_title' => $this->source_type_meta['name'], 'post_content' => '', 'post_status' => 'publish', - 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, + 'post_type' => Registrations::CODE_REFERENCE_POST_TYPE, ]); if (!empty($post_id) && !($post_id instanceof \WP_Error)) { @@ -312,7 +315,7 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio $childrefpage = get_posts([ 'name' => $childpage['slug'], 'post_parent' => $post_id, - 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, + 'post_type' => Registrations::CODE_REFERENCE_POST_TYPE, ]); if (empty($childrefpage)) { $childlandingpageid = wp_insert_post([ @@ -321,7 +324,7 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio 'post_title' => $childpage['title'], 'post_content' => '', 'post_status' => 'publish', - 'post_type' => Plugin::CODE_REFERENCE_POST_TYPE, + 'post_type' => Registrations::CODE_REFERENCE_POST_TYPE, ]); } if (!empty($childlandingpageid) && !($childlandingpageid instanceof \WP_Error)) { @@ -416,10 +419,11 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio } /** + * Inserts a term + * * @param int|string $term * @param string $taxonomy * @param array $args - * * @return array|mixed|\WP_Error */ protected function insert_term($term, $taxonomy, $args = []) { diff --git a/src/Importer/MethodCallReflector.php b/src/Importer/MethodCallReflector.php new file mode 100644 index 0000000..bc6d6fc --- /dev/null +++ b/src/Importer/MethodCallReflector.php @@ -0,0 +1,154 @@ +node->getType()) { + $name = '__construct'; + $caller = $this->node->class; + } else { + $name = $this->getShortName(); + $caller = $this->node->var; + } + + if ($caller instanceof \PHPParser_Node_Expr) { + $printer = new PrettyPrinter(); + $caller = $printer->prettyPrintExpr($caller); + } elseif ($caller instanceof \PHPParser_Node_Name_FullyQualified) { + $caller = '\\' . $caller->toString(); + } elseif ($caller instanceof \PHPParser_Node_Name) { + $caller = $caller->toString(); + } + + $caller = $this->_resolveName($caller); + + // If the caller is a function, convert it to the function name + if (is_a($caller, 'PHPParser_Node_Expr_FuncCall')) { + // Add parentheses to signify this is a function call + /* + * @var \PHPParser_Node_Expr_FuncCall $caller + */ + $caller = implode('\\', $caller->name->parts) . '()'; + } + + $class_mapping = $this->_getClassMapping(); + if (array_key_exists($caller, $class_mapping)) { + $caller = $class_mapping[$caller]; + } + + return [$caller, $name]; + } + + /** + * Set the class that this method was called within. + * + * @param ClassReflector $class + * @return void + */ + public function set_class(ClassReflector $class) { + $this->called_in_class = $class; + } + + /** + * Returns whether or not this method call is a static call + * + * @return bool Whether or not this method call is a static call + */ + public function isStatic() { + return false; + } + + /** + * Returns a mapping from variable names to a class name, leverages globals for most used classes + * + * @return array Class mapping to map variable names to classes + */ + protected function _getClassMapping() { + // List of global use generated using following command: + // ack "global \\\$[^;]+;" --no-filename | tr -d '\t' | sort | uniq | sed "s/global //g" | sed "s/, /,/g" | tr , '\n' | sed "s/;//g" | sort | uniq | sed "s/\\\$//g" | sed "s/[^ ][^ ]*/'&' => ''/g" + // There is probably an easier way, there are currently no globals that are classes starting with an underscore + $wp_globals = [ + 'authordata' => 'WP_User', + 'custom_background' => 'Custom_Background', + 'custom_image_header' => 'Custom_Image_Header', + 'phpmailer' => 'PHPMailer', + 'post' => 'WP_Post', + 'userdata' => 'WP_User', // This can also be stdClass, but you can't call methods on an stdClass + 'wp' => 'WP', + 'wp_admin_bar' => 'WP_Admin_Bar', + 'wp_customize' => 'WP_Customize_Manager', + 'wp_embed' => 'WP_Embed', + 'wp_filesystem' => 'WP_Filesystem', + 'wp_hasher' => 'PasswordHash', // This can be overridden by plugins, for core assume this is ours + 'wp_json' => 'Services_JSON', + 'wp_list_table' => 'WP_List_Table', // This one differs because there are a lot of different List Tables, assume they all only overwrite existing functions on WP_List_Table + 'wp_locale' => 'WP_Locale', + 'wp_object_cache' => 'WP_Object_Cache', + 'wp_query' => 'WP_Query', + 'wp_rewrite' => 'WP_Rewrite', + 'wp_roles' => 'WP_Roles', + 'wp_scripts' => 'WP_Scripts', + 'wp_styles' => 'WP_Styles', + 'wp_the_query' => 'WP_Query', + 'wp_widget_factory' => 'WP_Widget_Factory', + 'wp_xmlrpc_server' => 'wp_xmlrpc_server', // This can be overridden by plugins, for core assume this is ours + 'wpdb' => 'wpdb', + ]; + + $wp_functions = [ + 'get_current_screen()' => 'WP_Screen', + '_get_list_table()' => 'WP_List_Table', // This one differs because there are a lot of different List Tables, assume they all only overwrite existing functions on WP_List_Table + 'wp_get_theme()' => 'WP_Theme', + ]; + + $class_mapping = array_merge($wp_globals, $wp_functions); + + return $class_mapping; + } + + /** + * Resolve a class name from self/parent. + * + * @param string $class The class name. + * @return string The resolved class name. + */ + protected function _resolveName($class) { + if (!$this->called_in_class) { + return $class; + } + + switch ($class) { + case '$this': + case 'self': + $namespace = (string)$this->called_in_class->getNamespace(); + $namespace = ('global' !== $namespace) ? $namespace . '\\' : ''; + $class = '\\' . $namespace . $this->called_in_class->getShortName(); + break; + case 'parent': + $class = '\\' . $this->called_in_class->getNode()->extends->toString(); + break; + } + + return $class; + } +} diff --git a/src/Importer/Parser.php b/src/Importer/Parser.php new file mode 100644 index 0000000..208b55b --- /dev/null +++ b/src/Importer/Parser.php @@ -0,0 +1,489 @@ +getExtension()) { + continue; + } + + /* + * Whether to exclude a file for parsing. + */ + if (!apply_filters('wp_parser_pre_get_wp_file', true, $file->getPathname(), $root)) { + continue; + } + + $files[] = $file->getPathname(); + } + } catch (\UnexpectedValueException $exc) { + return new \WP_Error( + 'unexpected_value_exception', + sprintf('Directory [%s] contained a directory we can not recurse into', $root) + ); + } + + return $files; + } + + /** + * Filter the directories to parse. + * + * @param string $root Root dir. + * @param object $dirIterator RecursiveDirectoryIterator. + * @return object|false RecursiveCallbackFilterIterator or false. + */ + public static function filterWpDirectories($root, $dirIterator) { + $root = trailingslashit($root); + + /* + * Filter directories found in the root directory. + * + * For example: 'vendor', 'tests', 'specific/directory'. + * + * @param unknown $exclude Array with directories to skip parsing. Default empty array(). + * @param unknown $root Root directory to parse. + */ + $exclude = apply_filters('wp_parser_exclude_directories', [], $root); + + /* + * Whether to exlude directories if found in a subdirectory. + * + * @param unknown $strict. Exclude subdirectories. Default false. + * @param unknown $root Root directory to parse. + */ + $strict = apply_filters('wp_parser_exclude_directories_strict', false, $root); + + if (!$exclude) { + return false; + } + + $filter = new \RecursiveCallbackFilterIterator($dirIterator, function ($current) use ($root, $exclude, $strict) { + if ($current->isFile() && ('php' !== $current->getExtension())) { + return false; + } + + if (!$current->isDir()) { + return true; + } + + // Exclude directories strict. + $dir_name = $current->getFilename(); + if ($strict && in_array($dir_name, $exclude)) { + return false; + } + + // Exclude directories in the root directory. + $current_path = $current->getPathname(); + foreach ($exclude as $dir) { + if (($root . untrailingslashit($dir)) === $current_path) { + return false; + } + } + + return true; + }); + + return $filter; + } + + /** + * Parses files + * + * @param array $files + * @param string $root + * @return array + */ + public static function parseFiles($files, $root) { + $output = []; + + foreach ($files as $filename) { + $file = new FileReflector($filename); + + $path = ltrim(substr($filename, strlen($root)), DIRECTORY_SEPARATOR); + $file->setFilename($path); + + $file->process(); + + // TODO proper exporter + $out = [ + 'file' => self::exportDocblock($file), + 'path' => str_replace(DIRECTORY_SEPARATOR, '/', $file->getFilename()), + 'root' => $root, + ]; + + if (!empty($file->uses)) { + $out['uses'] = self::exportUses($file->uses); + } + + foreach ($file->getIncludes() as $include) { + $out['includes'][] = [ + 'name' => $include->getName(), + 'line' => $include->getLineNumber(), + 'type' => $include->getType(), + ]; + } + + foreach ($file->getConstants() as $constant) { + $out['constants'][] = [ + 'name' => $constant->getShortName(), + 'line' => $constant->getLineNumber(), + 'value' => $constant->getValue(), + ]; + } + + if (!empty($file->uses['hooks'])) { + $out['hooks'] = self::exportHooks($file->uses['hooks']); + } + + foreach ($file->getFunctions() as $function) { + $func = [ + 'name' => $function->getShortName(), + 'namespace' => $function->getNamespace(), + 'aliases' => $function->getNamespaceAliases(), + 'line' => $function->getLineNumber(), + 'end_line' => $function->getNode()->getAttribute('endLine'), + 'arguments' => self::exportArguments($function->getArguments()), + 'doc' => self::exportDocblock($function), + 'hooks' => [], + ]; + + if (!empty($function->uses)) { + $func['uses'] = self::exportUses($function->uses); + + if (!empty($function->uses['hooks'])) { + $func['hooks'] = self::exportHooks($function->uses['hooks']); + } + } + + $out['functions'][] = $func; + } + + foreach ($file->getClasses() as $class) { + $class_data = [ + 'name' => $class->getShortName(), + 'namespace' => $class->getNamespace(), + 'line' => $class->getLineNumber(), + 'end_line' => $class->getNode()->getAttribute('endLine'), + 'final' => $class->isFinal(), + 'abstract' => $class->isAbstract(), + 'extends' => $class->getParentClass(), + 'implements' => $class->getInterfaces(), + 'properties' => self::exportProperties($class->getProperties()), + 'methods' => self::exportMethods($class->getMethods()), + 'doc' => self::exportDocblock($class), + ]; + + $out['classes'][] = $class_data; + } + + $output[] = $out; + } + + return $output; + } + + /** + * Fixes newline handling in parsed text. + * + * DocBlock lines, particularly for descriptions, generally adhere to a given character width. For sentences and + * paragraphs that exceed that width, what is intended as a manual soft wrap (via line break) is used to ensure + * on-screen/in-file legibility of that text. These line breaks are retained by phpDocumentor. However, consumers + * of this parsed data may believe the line breaks to be intentional and may display the text as such. + * + * This function fixes text by merging consecutive lines of text into a single line. A special exception is made + * for text appearing in `` and `
    ` tags, as newlines appearing in those tags are always intentional.
    +     *
    +     * @param string $text
    +     * @return string
    +     */
    +    public static function fixNewlines($text) {
    +        // Non-naturally occurring string to use as temporary replacement.
    +        $replacement_string = '{{{{{}}}}}';
    +
    +        // Replace newline characters within 'code' and 'pre' tags with replacement string.
    +        $text = preg_replace_callback(
    +            '/(?<=
    )(.+)(?=<\/code><\/pre>)/s',
    +            function ($matches) use ($replacement_string) {
    +                return preg_replace('/[\n\r]/', $replacement_string, $matches[1]);
    +            },
    +            $text
    +        );
    +
    +        // Merge consecutive non-blank lines together by replacing the newlines with a space.
    +        $text = preg_replace(
    +            "/[\n\r](?!\s*[\n\r])/m",
    +            ' ',
    +            $text
    +        );
    +
    +        // Restore newline characters into code blocks.
    +        $text = str_replace($replacement_string, "\n", $text);
    +
    +        return $text;
    +    }
    +
    +    /**
    +     * @param BaseReflector|ReflectionAbstract $element
    +     *
    +     * @return array
    +     */
    +    public static function exportDocblock($element) {
    +        $docblock = $element->getDocBlock();
    +        if (!$docblock) {
    +            return [
    +                'description' => '',
    +                'long_description' => '',
    +                'tags' => [],
    +            ];
    +        }
    +
    +        $output = [
    +            'description' => preg_replace('/[\n\r]+/', ' ', $docblock->getShortDescription()),
    +            'long_description' => self::fixNewlines($docblock->getLongDescription()->getFormattedContents()),
    +            'tags' => [],
    +        ];
    +
    +        foreach ($docblock->getTags() as $tag) {
    +            $tag_data = [
    +                'name' => $tag->getName(),
    +                'content' => preg_replace('/[\n\r]+/', ' ', self::formatDescription($tag->getDescription())),
    +            ];
    +            if (method_exists($tag, 'getTypes')) {
    +                $tag_data['types'] = $tag->getTypes();
    +            }
    +            if (method_exists($tag, 'getLink')) {
    +                $tag_data['link'] = $tag->getLink();
    +            }
    +            if (method_exists($tag, 'getVariableName')) {
    +                $tag_data['variable'] = $tag->getVariableName();
    +            }
    +            if (method_exists($tag, 'getReference')) {
    +                $tag_data['refers'] = $tag->getReference();
    +            }
    +            if (method_exists($tag, 'getVersion')) {
    +                // Version string.
    +                $version = $tag->getVersion();
    +                if (!empty($version)) {
    +                    $tag_data['content'] = $version;
    +                }
    +                // Description string.
    +                if (method_exists($tag, 'getDescription')) {
    +                    $description = preg_replace('/[\n\r]+/', ' ', self::formatDescription($tag->getDescription()));
    +                    if (!empty($description)) {
    +                        $tag_data['description'] = $description;
    +                    }
    +                }
    +            }
    +            $output['tags'][] = $tag_data;
    +        }
    +
    +        return $output;
    +    }
    +
    +    /**
    +     * @param HookReflector[] $hooks
    +     *
    +     * @return array
    +     */
    +    public static function exportHooks(array $hooks) {
    +        $out = [];
    +
    +        foreach ($hooks as $hook) {
    +            $out[] = [
    +                'name' => $hook->getName(),
    +                'line' => $hook->getLineNumber(),
    +                'end_line' => $hook->getNode()->getAttribute('endLine'),
    +                'type' => $hook->getType(),
    +                'arguments' => $hook->getArgs(),
    +                'doc' => self::exportDocblock($hook),
    +            ];
    +        }
    +
    +        return $out;
    +    }
    +
    +    /**
    +     * @param ArgumentReflector[] $arguments
    +     *
    +     * @return array
    +     */
    +    public static function exportArguments(array $arguments) {
    +        $output = [];
    +
    +        foreach ($arguments as $argument) {
    +            $output[] = [
    +                'name' => $argument->getName(),
    +                'default' => $argument->getDefault(),
    +                'type' => $argument->getType(),
    +            ];
    +        }
    +
    +        return $output;
    +    }
    +
    +    /**
    +     * @param PropertyReflector[] $properties
    +     *
    +     * @return array
    +     */
    +    public static function exportProperties(array $properties) {
    +        $out = [];
    +
    +        foreach ($properties as $property) {
    +            $out[] = [
    +                'name' => $property->getName(),
    +                'line' => $property->getLineNumber(),
    +                'end_line' => $property->getNode()->getAttribute('endLine'),
    +                'default' => $property->getDefault(),
    +                // 'final' => $property->isFinal(),
    +                            'static' => $property->isStatic(),
    +                'visibility' => $property->getVisibility(),
    +                'doc' => self::exportDocblock($property),
    +            ];
    +        }
    +
    +        return $out;
    +    }
    +
    +    /**
    +     * @param MethodReflector[] $methods
    +     *
    +     * @return array
    +     */
    +    public static function exportMethods(array $methods) {
    +        $output = [];
    +
    +        foreach ($methods as $method) {
    +            $method_data = [
    +                'name' => $method->getShortName(),
    +                'namespace' => $method->getNamespace(),
    +                'aliases' => $method->getNamespaceAliases(),
    +                'line' => $method->getLineNumber(),
    +                'end_line' => $method->getNode()->getAttribute('endLine'),
    +                'final' => $method->isFinal(),
    +                'abstract' => $method->isAbstract(),
    +                'static' => $method->isStatic(),
    +                'visibility' => $method->getVisibility(),
    +                'arguments' => self::exportArguments($method->getArguments()),
    +                'doc' => self::exportDocblock($method),
    +            ];
    +
    +            if (!empty($method->uses)) {
    +                $method_data['uses'] = self::exportUses($method->uses);
    +
    +                if (!empty($method->uses['hooks'])) {
    +                    $method_data['hooks'] = self::exportHooks($method->uses['hooks']);
    +                }
    +            }
    +
    +            $output[] = $method_data;
    +        }
    +
    +        return $output;
    +    }
    +
    +    /**
    +     * Export the list of elements used by a file or structure.
    +     *
    +     * @param array $uses {
    +     *     @type FunctionCallReflector[] $functions The functions called.
    +     * }
    +     * @return array
    +     */
    +    public static function exportUses(array $uses) {
    +        $out = [];
    +
    +        // Ignore hooks here, they are exported separately.
    +        unset($uses['hooks']);
    +
    +        foreach ($uses as $type => $used_elements) {
    +            /*
    +             * @var MethodReflector|FunctionReflector $element
    +             */
    +            foreach ($used_elements as $element) {
    +                $name = $element->getName();
    +
    +                switch ($type) {
    +                    case 'methods':
    +                        $out[$type][] = [
    +                            'name' => $name[1],
    +                            'class' => $name[0],
    +                            'static' => $element->isStatic(),
    +                            'line' => $element->getLineNumber(),
    +                            'end_line' => $element->getNode()->getAttribute('endLine'),
    +                        ];
    +                        break;
    +
    +                    default:
    +                    case 'functions':
    +                        $out[$type][] = [
    +                            'name' => $name,
    +                            'line' => $element->getLineNumber(),
    +                            'end_line' => $element->getNode()->getAttribute('endLine'),
    +                        ];
    +
    +                        if (
    +                            '_deprecated_file' === $name
    +                            || '_deprecated_function' === $name
    +                            || '_deprecated_argument' === $name
    +                            || '_deprecated_hook' === $name
    +                        ) {
    +                            $arguments = $element->getNode()->args;
    +
    +                            $out[$type][0]['deprecation_version'] = $arguments[1]->value->value;
    +                        }
    +
    +                        break;
    +                }
    +            }
    +        }
    +
    +        return $out;
    +    }
    +
    +    /**
    +     * Format the given description with Markdown.
    +     *
    +     * @param string $description Description.
    +     * @return string Description as Markdown if the Parsedown class exists, otherwise return
    +     *                the given description text.
    +     */
    +    public static function formatDescription($description) {
    +        if (class_exists('Parsedown')) {
    +            $parsedown = \Parsedown::instance();
    +            $description = $parsedown->line($description);
    +        }
    +        return $description;
    +    }
    +}
    diff --git a/src/Importer/PrettyPrinter.php b/src/Importer/PrettyPrinter.php
    new file mode 100644
    index 0000000..41eae22
    --- /dev/null
    +++ b/src/Importer/PrettyPrinter.php
    @@ -0,0 +1,23 @@
    +noIndentToken, "\n", $this->p($node));
    +    }
    +}
    diff --git a/lib/class-relationships.php b/src/Importer/Relationships.php
    similarity index 98%
    rename from lib/class-relationships.php
    rename to src/Importer/Relationships.php
    index 0563896..c7d01a9 100644
    --- a/lib/class-relationships.php
    +++ b/src/Importer/Relationships.php
    @@ -1,6 +1,6 @@
      array(
          *     $from_id => array(
    @@ -39,7 +44,7 @@ class Relationships
         /**
          * Adds the actions.
          */
    -    public function __construct() {
    +    public function init() {
             add_action('plugins_loaded', [$this, 'require_posts_to_posts']);
             add_action('wp_loaded', [$this, 'register_post_relationships']);
     
    @@ -50,6 +55,8 @@ public function __construct() {
     
         /**
          * Load the posts2posts from the composer package if it is not loaded already.
    +     *
    +     * @return void
          */
         public function require_posts_to_posts() {
             // Initializes the database tables
    @@ -475,7 +482,7 @@ public function wp_parser_ending_import(Importer $importer) {
          * namespace `\Foo\Bar\` by just calling `Bar\baz()`. PHP will first look
          * for `\Foo\Bar\baz()` and if it can't find it fall back to `\Bar\baz()`.
          *
    -     * @see    WP_Parser\Importer::import_item()
    +     * @see    Importer::import_item()
          * @param  string $name      The name of the item a slug is needed for.
          * @param  string $namespace The namespace the item is in when for context.
          * @return array             An array of slugs, starting with the context of the
    diff --git a/src/Importer/StaticMethodCallReflector.php b/src/Importer/StaticMethodCallReflector.php
    new file mode 100644
    index 0000000..70b6f6c
    --- /dev/null
    +++ b/src/Importer/StaticMethodCallReflector.php
    @@ -0,0 +1,31 @@
    +node->class;
    +        $prefix = (is_a($class, 'PHPParser_Node_Name_FullyQualified')) ? '\\' : '';
    +        $class = $prefix . $this->_resolveName(implode('\\', $class->parts));
    +
    +        return [$class, $this->getShortName()];
    +    }
    +
    +    /**
    +     * Returns `true` if is static
    +     *
    +     * @return bool
    +     */
    +    public function isStatic() {
    +        return true;
    +    }
    +}
    diff --git a/src/Master.php b/src/Master.php
    index f44c8ed..5113058 100644
    --- a/src/Master.php
    +++ b/src/Master.php
    @@ -14,137 +14,18 @@ class Master
          * @return void
          */
         public static function init() {
    -        add_action('parse_tax_query', [get_class(), 'taxQueryNoChildren'], 10, 1);
    -        add_filter('query_vars', [get_class(), 'addHookTypeQueryVar'], 10, 1);
    -        add_filter('pre_handle_404', [get_class(), 'force404onWrongSourceType'], 10, 2);
    -        add_action('init', function () {
    -            add_action('pre_get_posts', [get_class(), 'preGetPosts'], 10, 1);
    -        });
    +        if (defined('WP_CLI') && WP_CLI) {
    +            \WP_CLI::add_command('parser', __NAMESPACE__ . '\\CLI\\Commands');
    +        }
     
    -        (new Explanations())->init();
    +        (new Importer\Relationships())->init();
    +        (new Registrations())->init();
    +        (new Explanations\Explanations())->init();
             (new ParsedContent())->init();
    +        Queries::init();
             Formatting::init();
             if (is_admin()) {
                 Admin::init();
             }
         }
    -
    -    /**
    -     * Adds `hook_type` query var for filtering hooks by type
    -     *
    -     * @author Evan D Shaw 
    -     * @param array $qvars
    -     * @return array
    -     */
    -    public static function addHookTypeQueryVar($qvars) {
    -        $qvars[] = 'hook_type';
    -        return $qvars;
    -    }
    -
    -    /**
    -     * @param \WP_Query $query
    -     */
    -    public static function preGetPosts($query) {
    -        if ($query->is_main_query() && $query->is_post_type_archive()) {
    -            $query->set('orderby', 'title');
    -            $query->set('order', 'ASC');
    -            // $query->set('posts_per_page', 20);
    -            $ptype = !empty($query->query['post_type']) ? $query->query['post_type'] : '';
    -            $hook_type = !empty($query->query['hook_type']) ? $query->query['hook_type'] : '';
    -            if ($ptype === 'wp-parser-hook' && ($hook_type === 'filter' || $hook_type === 'action')) {
    -                $query->query_vars['meta_key'] = '_wp-parser_hook_type';
    -                $query->query_vars['meta_value'] = $hook_type;
    -            }
    -        }
    -
    -        if ($query->is_main_query() && $query->is_tax() && $query->get('wp-parser-source-file')) {
    -            $query->set('wp-parser-source-file', str_replace(['.php', '/'], ['-php', '_'], $query->query['wp-parser-source-file']));
    -        }
    -
    -        // For search query modifications see DevHub_Search.
    -    }
    -
    -    public static function taxQueryNoChildren(\WP_Query $query) {
    -        if (!$query->tax_query) {
    -            return;
    -        }
    -        if (empty($query->query['taxonomy']) || $query->query['taxonomy'] !== \WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG) {
    -            return;
    -        }
    -        if (empty($query->tax_query->queries)) {
    -            return;
    -        }
    -        if ($query->tax_query->queries[0]['taxonomy'] !== \WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG) {
    -            return;
    -        }
    -
    -        $query->tax_query->queries[0]['operator'] = 'AND';
    -        $query->tax_query->queries[0]['include_children'] = false;
    -    }
    -
    -    /**
    -     * 404s for `wp-parser-{function|class|method|hook}` post types for single pages
    -     * if the source-type taxonomy term slug and it's child term slug are not set for the post.
    -     *
    -     * For example, given this URL: `/reference/plugin/my-plugin/functions/my-function`,
    -     * a 404 will be forced if the `my-function` post, which is of the `wp-parser-function`
    -     * post type, is not associated with the `plugin` and `my-plugin` terms, which both belong
    -     * to the `wp-parser-source-type` taxonomy, where `plugin` is one of the three default terms
    -     * and `my-plugin` is a child term of `plugin`.
    -     *
    -     * This hook is used because WordPress' `get_posts` function does not process taxonomy queries
    -     * for singular pages.
    -     *
    -     * Note that WordPress will try to guess the URL and redirect to the correct permalink for
    -     * the post even if we return a 404. Whether the guess succeeds depends partially on the
    -     * URL rewrite rules. Our rewrite rules cause the redirect to succeed as long as the source
    -     * type provided is one of the three defaults (plugin, theme, composer-package). The source
    -     * type child term slug can be **anything**, however.
    -     *
    -     * It should be investigated whether it's worth short-circuiting guess redirect behavior or not.
    -     *
    -     * @see wp-includes/canonical.php redirect_canonical()
    -     * @todo Investigate if there is a more elegant way of accomplishing this. Investigate
    -     *       whether guess redirects are more or less SEO compliant
    -     * @author Evan D Shaw 
    -     * @param bool      $bool
    -     * @param \WP_Query $query
    -     * @return bool
    -     */
    -    public static function force404onWrongSourceType($bool, $query) {
    -        if (!$query->is_main_query()) {
    -            return $bool;
    -        }
    -        if (!$query->is_singular) {
    -            return $bool;
    -        }
    -        if ($query->post_count < 1) {
    -            return $bool;
    -        }
    -        if (!in_array($query->post->post_type, avcpdp_get_parsed_post_types(), true)) {
    -            return $bool;
    -        }
    -        $taxslug = \WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG;
    -        if (empty($query->query['taxonomy']) || empty($query->query[$taxslug])) {
    -            return $bool;
    -        }
    -        $qtax = $query->query['taxonomy'];
    -        if ($qtax !== $taxslug) {
    -            return $bool;
    -        }
    -        $terms = explode(',', $query->query[$taxslug]);
    -        if (count($terms) < 2) {
    -            return $bool;
    -        }
    -        $stterms = avcpdp_get_post_source_type_terms($query->post->ID);
    -        if ($terms[0] === $stterms['type']->slug && $terms[1] === $stterms['name']->slug) {
    -            return $bool;
    -        }
    -
    -        $query->set_404();
    -        status_header(404);
    -        nocache_headers();
    -
    -        return true;
    -    }
     }
    diff --git a/src/Queries.php b/src/Queries.php
    new file mode 100644
    index 0000000..eac08d4
    --- /dev/null
    +++ b/src/Queries.php
    @@ -0,0 +1,152 @@
    +
    +     * @return void
    +     */
    +    public static function init() {
    +        add_action('pre_get_posts', [get_class(), 'preGetPosts'], 10, 1);
    +        add_filter('query_vars', [get_class(), 'addHookTypeQueryVar'], 10, 1);
    +        add_action('parse_tax_query', [get_class(), 'taxQueryNoChildren'], 10, 1);
    +        add_filter('pre_handle_404', [get_class(), 'force404onWrongSourceType'], 10, 2);
    +    }
    +
    +    /**
    +     * Handles various custom query vars
    +     *
    +     * @param \WP_Query $query
    +     * @return void
    +     */
    +    public static function preGetPosts($query) {
    +        if ($query->is_main_query() && $query->is_post_type_archive()) {
    +            $query->set('orderby', 'title');
    +            $query->set('order', 'ASC');
    +            // $query->set('posts_per_page', 20);
    +            $ptype = !empty($query->query['post_type']) ? $query->query['post_type'] : '';
    +            $hook_type = !empty($query->query['hook_type']) ? $query->query['hook_type'] : '';
    +            if ($ptype === 'wp-parser-hook' && ($hook_type === 'filter' || $hook_type === 'action')) {
    +                $query->query_vars['meta_key'] = '_wp-parser_hook_type';
    +                $query->query_vars['meta_value'] = $hook_type;
    +            }
    +        }
    +
    +        if ($query->is_main_query() && $query->is_tax() && $query->get('wp-parser-source-file')) {
    +            $query->set('wp-parser-source-file', str_replace(['.php', '/'], ['-php', '_'], $query->query['wp-parser-source-file']));
    +        }
    +
    +        // For search query modifications see DevHub_Search.
    +    }
    +
    +    /**
    +     * Adds `hook_type` query var for filtering hooks by type
    +     *
    +     * @author Evan D Shaw 
    +     * @param array $qvars
    +     * @return array
    +     */
    +    public static function addHookTypeQueryVar($qvars) {
    +        $qvars[] = 'hook_type';
    +        return $qvars;
    +    }
    +
    +    /**
    +     * Prevents a `wp-parser-source-type` taxonomy query from including children
    +     * in the result
    +     *
    +     * @author Evan D Shaw 
    +     * @param \WP_Query $query
    +     * @return void
    +     */
    +    public static function taxQueryNoChildren(\WP_Query $query) {
    +        if (!$query->tax_query) {
    +            return;
    +        }
    +        if (empty($query->query['taxonomy']) || $query->query['taxonomy'] !== Registrations::SOURCE_TYPE_TAX_SLUG) {
    +            return;
    +        }
    +        if (empty($query->tax_query->queries)) {
    +            return;
    +        }
    +        if ($query->tax_query->queries[0]['taxonomy'] !== Registrations::SOURCE_TYPE_TAX_SLUG) {
    +            return;
    +        }
    +
    +        $query->tax_query->queries[0]['operator'] = 'AND';
    +        $query->tax_query->queries[0]['include_children'] = false;
    +    }
    +
    +    /**
    +     * 404s for `wp-parser-{function|class|method|hook}` post types for single pages
    +     * if the source-type taxonomy term slug and it's child term slug are not set for the post.
    +     *
    +     * For example, given this URL: `/reference/plugin/my-plugin/functions/my-function`,
    +     * a 404 will be forced if the `my-function` post, which is of the `wp-parser-function`
    +     * post type, is not associated with the `plugin` and `my-plugin` terms, which both belong
    +     * to the `wp-parser-source-type` taxonomy, where `plugin` is one of the three default terms
    +     * and `my-plugin` is a child term of `plugin`.
    +     *
    +     * This hook is used because WordPress' `get_posts` function does not process taxonomy queries
    +     * for singular pages.
    +     *
    +     * Note that WordPress will try to guess the URL and redirect to the correct permalink for
    +     * the post even if we return a 404. Whether the guess succeeds depends partially on the
    +     * URL rewrite rules. Our rewrite rules cause the redirect to succeed as long as the source
    +     * type provided is one of the three defaults (plugin, theme, composer-package). The source
    +     * type child term slug can be **anything**, however.
    +     *
    +     * It should be investigated whether it's worth short-circuiting guess redirect behavior or not.
    +     *
    +     * @see wp-includes/canonical.php redirect_canonical()
    +     * @todo Investigate if there is a more elegant way of accomplishing this. Investigate
    +     *       whether guess redirects are more or less SEO compliant
    +     * @author Evan D Shaw 
    +     * @param bool      $bool
    +     * @param \WP_Query $query
    +     * @return bool
    +     */
    +    public static function force404onWrongSourceType($bool, $query) {
    +        if (!$query->is_main_query()) {
    +            return $bool;
    +        }
    +        if (!$query->is_singular) {
    +            return $bool;
    +        }
    +        if ($query->post_count < 1) {
    +            return $bool;
    +        }
    +        if (!in_array($query->post->post_type, avcpdp_get_parsed_post_types(), true)) {
    +            return $bool;
    +        }
    +        $taxslug = Registrations::SOURCE_TYPE_TAX_SLUG;
    +        if (empty($query->query['taxonomy']) || empty($query->query[$taxslug])) {
    +            return $bool;
    +        }
    +        $qtax = $query->query['taxonomy'];
    +        if ($qtax !== $taxslug) {
    +            return $bool;
    +        }
    +        $terms = explode(',', $query->query[$taxslug]);
    +        if (count($terms) < 2) {
    +            return $bool;
    +        }
    +        $stterms = avcpdp_get_post_source_type_terms($query->post->ID);
    +        if ($terms[0] === $stterms['type']->slug && $terms[1] === $stterms['name']->slug) {
    +            return $bool;
    +        }
    +
    +        $query->set_404();
    +        status_header(404);
    +        nocache_headers();
    +
    +        return true;
    +    }
    +}
    diff --git a/src/Registrations.php b/src/Registrations.php
    new file mode 100644
    index 0000000..05ed57d
    --- /dev/null
    +++ b/src/Registrations.php
    @@ -0,0 +1,659 @@
    + [
    +            'urlpiece' => 'methods',
    +            'post_type' => 'wp-parser-method',
    +        ],
    +        'wp-parser-function' => [
    +            'urlpiece' => 'functions',
    +            'post_type' => 'wp-parser-function',
    +        ],
    +        'wp-parser-class' => [
    +            'urlpiece' => 'classes',
    +            'post_type' => 'wp-parser-class',
    +        ],
    +        'wp-parser-hook' => [
    +            'urlpiece' => 'hooks',
    +            'post_type' => 'wp-parser-hook',
    +        ],
    +    ];
    +
    +    /**
    +     * Registers hooks
    +     *
    +     * @author Evan D Shaw 
    +     * @return void
    +     */
    +    public function init() {
    +        // add_filter('rewrite_rules_array', [$this, 'removeDefaultParserPostTypeRewriteRules'], 10, 1);
    +        add_action('init', [$this, 'registerPostTypes'], 11);
    +        add_action('init', [$this, 'registerTaxonomies'], 11);
    +        add_filter('wp_parser_get_arguments', [$this, 'makeArgsSafe']);
    +        add_filter('wp_parser_return_type', [$this, 'humanizeSeparator']);
    +
    +        add_filter('post_type_link', [$this, 'postPermalink'], 10, 2);
    +        add_filter('term_link', [$this, 'taxonomyPermalink'], 10, 3);
    +    }
    +
    +    /**
    +     * Adds rewrite rules for the `wp-parser-(function|method|class|hook)` post
    +     * types.
    +     *
    +     * Rewrites URLs to be unique on a per source-type basis.
    +     *
    +     * For example, given a source type of `plugin`, a `plugin` child term slug of `my-plugin`,
    +     * and a function named `my-function`, the URL would be `/reference/plugin/my-plugin/functions/my-function`.
    +     *
    +     * @author Evan D Shaw 
    +     * @return void
    +     */
    +    public static function addRewriteRules() {
    +        $sttax = self::SOURCE_TYPE_TAX_SLUG;
    +        $stterms = implode('|', self::SOURCE_TYPE_TERM_SLUGS);
    +        $stterms = str_replace('-', '\-', $stterms);
    +
    +        // Add rewrite rules for Methods
    +        add_rewrite_rule(
    +            "reference/($stterms)/([a-z_\-]{1,32})/methods/page/([0-9]{1,})/?",
    +            "index.php?post_type=wp-parser-method&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&paged=\$matches[3]",
    +            'top'
    +        );
    +        add_rewrite_rule(
    +            "reference/($stterms)/([a-z_\-]{1,32})/classes/([^/]+)/([^/]+)/?\$",
    +            "index.php?post_type=wp-parser-method&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&name=\$matches[3]-\$matches[4]",
    +            'top'
    +        );
    +        add_rewrite_rule(
    +            "reference/($stterms)/([a-z_\-]{1,32})/methods/?\$",
    +            "index.php?post_type=wp-parser-method&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]",
    +            'top'
    +        );
    +
    +        // Add rewrite rules for Functions, Classes, and Hooks
    +        foreach (self::WP_PARSER_PT_MAP as $key => $info) {
    +            if ($key === 'wp-parser-method') {
    +                continue;
    +            }
    +            $urlpiece = $info['urlpiece'];
    +            $ptype = $info['post_type'];
    +            add_rewrite_rule(
    +                "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/page/([0-9]{1,})/?",
    +                "index.php?post_type={$ptype}&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&paged=\$matches[3]",
    +                'top'
    +            );
    +            add_rewrite_rule(
    +                "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/([^/]+)/?\$",
    +                "index.php?post_type={$ptype}&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]&name=\$matches[3]",
    +                'top'
    +            );
    +            add_rewrite_rule(
    +                "reference/($stterms)/([a-z_\-]{1,32})/$urlpiece/?\$",
    +                "index.php?post_type={$ptype}&taxonomy={$sttax}&wp-parser-source-type=\$matches[1],\$matches[2]",
    +                'top'
    +            );
    +        }
    +    }
    +
    +    /**
    +     * Register the function and class post types
    +     *
    +     * @author Evan D Shaw 
    +     * @return void
    +     */
    +    public function registerPostTypes() {
    +        $supports = [
    +            'comments',
    +            'custom-fields',
    +            'editor',
    +            'excerpt',
    +            'revisions',
    +            'title',
    +        ];
    +
    +        self::addRewriteRules();
    +
    +        // Functions
    +        register_post_type('wp-parser-function', [
    +            'has_archive' => 'reference/functions',
    +            'label' => __('Functions', 'wp-parser'),
    +            'labels' => [
    +                'name' => __('Functions', 'wp-parser'),
    +                'singular_name' => __('Function', 'wp-parser'),
    +                'all_items' => __('Functions', 'wp-parser'),
    +                'new_item' => __('New Function', 'wp-parser'),
    +                'add_new' => __('Add New', 'wp-parser'),
    +                'add_new_item' => __('Add New Function', 'wp-parser'),
    +                'edit_item' => __('Edit Function', 'wp-parser'),
    +                'view_item' => __('View Function', 'wp-parser'),
    +                'search_items' => __('Search Functions', 'wp-parser'),
    +                'not_found' => __('No Functions found', 'wp-parser'),
    +                'not_found_in_trash' => __('No Functions found in trash', 'wp-parser'),
    +                'parent_item_colon' => __('Parent Function', 'wp-parser'),
    +                'menu_name' => __('Functions', 'wp-parser'),
    +            ],
    +            'menu_icon' => 'dashicons-editor-code',
    +            'public' => true,
    +            'rewrite' => [
    +                'feeds' => false,
    +                'slug' => 'reference/functions',
    +                'with_front' => false,
    +            ],
    +            'supports' => $supports,
    +            'show_in_rest' => true,
    +        ]);
    +
    +        // Methods
    +        register_post_type('wp-parser-method', [
    +            'has_archive' => 'reference/methods',
    +            'label' => __('Methods', 'wp-parser'),
    +            'labels' => [
    +                'name' => __('Methods', 'wp-parser'),
    +                'singular_name' => __('Method', 'wp-parser'),
    +                'all_items' => __('Methods', 'wp-parser'),
    +                'new_item' => __('New Method', 'wp-parser'),
    +                'add_new' => __('Add New', 'wp-parser'),
    +                'add_new_item' => __('Add New Method', 'wp-parser'),
    +                'edit_item' => __('Edit Method', 'wp-parser'),
    +                'view_item' => __('View Method', 'wp-parser'),
    +                'search_items' => __('Search Methods', 'wp-parser'),
    +                'not_found' => __('No Methods found', 'wp-parser'),
    +                'not_found_in_trash' => __('No Methods found in trash', 'wp-parser'),
    +                'parent_item_colon' => __('Parent Method', 'wp-parser'),
    +                'menu_name' => __('Methods', 'wp-parser'),
    +            ],
    +            'menu_icon' => 'dashicons-editor-code',
    +            'public' => true,
    +            'rewrite' => [
    +                'feeds' => false,
    +                'slug' => 'reference/methods',
    +                'with_front' => false,
    +            ],
    +            'supports' => $supports,
    +            'show_in_rest' => true,
    +        ]);
    +
    +        // Classes
    +        register_post_type('wp-parser-class', [
    +            'has_archive' => 'reference/classes',
    +            'label' => __('Classes', 'wp-parser'),
    +            'labels' => [
    +                'name' => __('Classes', 'wp-parser'),
    +                'singular_name' => __('Class', 'wp-parser'),
    +                'all_items' => __('Classes', 'wp-parser'),
    +                'new_item' => __('New Class', 'wp-parser'),
    +                'add_new' => __('Add New', 'wp-parser'),
    +                'add_new_item' => __('Add New Class', 'wp-parser'),
    +                'edit_item' => __('Edit Class', 'wp-parser'),
    +                'view_item' => __('View Class', 'wp-parser'),
    +                'search_items' => __('Search Classes', 'wp-parser'),
    +                'not_found' => __('No Classes found', 'wp-parser'),
    +                'not_found_in_trash' => __('No Classes found in trash', 'wp-parser'),
    +                'parent_item_colon' => __('Parent Class', 'wp-parser'),
    +                'menu_name' => __('Classes', 'wp-parser'),
    +            ],
    +            'menu_icon' => 'dashicons-editor-code',
    +            'public' => true,
    +            'rewrite' => [
    +                'feeds' => false,
    +                'slug' => 'reference/classes',
    +                'with_front' => false,
    +            ],
    +            'supports' => $supports,
    +            'show_in_rest' => true,
    +        ]);
    +
    +        // Hooks
    +        register_post_type('wp-parser-hook', [
    +            'has_archive' => 'reference/hooks',
    +            'label' => __('Hooks', 'wp-parser'),
    +            'labels' => [
    +                'name' => __('Hooks', 'wp-parser'),
    +                'singular_name' => __('Hook', 'wp-parser'),
    +                'all_items' => __('Hooks', 'wp-parser'),
    +                'new_item' => __('New Hook', 'wp-parser'),
    +                'add_new' => __('Add New', 'wp-parser'),
    +                'add_new_item' => __('Add New Hook', 'wp-parser'),
    +                'edit_item' => __('Edit Hook', 'wp-parser'),
    +                'view_item' => __('View Hook', 'wp-parser'),
    +                'search_items' => __('Search Hooks', 'wp-parser'),
    +                'not_found' => __('No Hooks found', 'wp-parser'),
    +                'not_found_in_trash' => __('No Hooks found in trash', 'wp-parser'),
    +                'parent_item_colon' => __('Parent Hook', 'wp-parser'),
    +                'menu_name' => __('Hooks', 'wp-parser'),
    +            ],
    +            'menu_icon' => 'dashicons-editor-code',
    +            'public' => true,
    +            'rewrite' => [
    +                'feeds' => false,
    +                'slug' => 'reference/hooks',
    +                'with_front' => false,
    +            ],
    +            'supports' => $supports,
    +            'show_in_rest' => true,
    +        ]);
    +
    +        // Reference Landing Pages
    +        register_post_type('code-reference', [
    +            'has_archive' => false,
    +            'exclude_from_search' => true,
    +            'publicly_queryable' => true,
    +            'hierarchical' => true,
    +            'label' => __('Reference Landing Pages', 'wp-parser'),
    +            'labels' => [
    +                'name' => __('Reference Landing Pages', 'wp-parser'),
    +                'singular_name' => __('Reference Landing Page', 'wp-parser'),
    +                'all_items' => __('Reference Landing Pages', 'wp-parser'),
    +                'new_item' => __('New Reference Landing Page', 'wp-parser'),
    +                'add_new' => __('Add New', 'wp-parser'),
    +                'add_new_item' => __('Add New Reference Landing Page', 'wp-parser'),
    +                'edit_item' => __('Edit Reference Landing Page', 'wp-parser'),
    +                'view_item' => __('View Reference Landing Page', 'wp-parser'),
    +                'search_items' => __('Search Reference Landing Pages', 'wp-parser'),
    +                'not_found' => __('No Pages found', 'wp-parser'),
    +                'not_found_in_trash' => __('No Pages found in trash', 'wp-parser'),
    +                'menu_name' => __('Reference Landing Pages', 'wp-parser'),
    +            ],
    +            'menu_icon' => 'dashicons-admin-page',
    +            'menu_position' => 20,
    +            'public' => true,
    +            'rewrite' => [
    +                'slug' => 'reference',
    +                'with_front' => false,
    +                'pages' => false,
    +            ],
    +            'supports' => [
    +                'page-attributes',
    +                'custom-fields',
    +                'editor',
    +                'excerpt',
    +                'revisions',
    +                'title',
    +            ],
    +            'show_in_rest' => false,
    +        ]);
    +    }
    +
    +    /**
    +     * Register the file and `@since` taxonomies
    +     *
    +     * @return void
    +     */
    +    public function registerTaxonomies() {
    +        $object_types = avcpdp_get_parsed_post_types();
    +
    +        // Files
    +        register_taxonomy(
    +            'wp-parser-source-file',
    +            $object_types,
    +            [
    +                'label' => __('Files', 'wp-parser'),
    +                'labels' => [
    +                    'name' => __('Files', 'wp-parser'),
    +                    'singular_name' => _x('File', 'taxonomy general name', 'wp-parser'),
    +                    'search_items' => __('Search Files', 'wp-parser'),
    +                    'popular_items' => null,
    +                    'all_items' => __('All Files', 'wp-parser'),
    +                    'parent_item' => __('Parent File', 'wp-parser'),
    +                    'parent_item_colon' => __('Parent File:', 'wp-parser'),
    +                    'edit_item' => __('Edit File', 'wp-parser'),
    +                    'update_item' => __('Update File', 'wp-parser'),
    +                    'add_new_item' => __('New File', 'wp-parser'),
    +                    'new_item_name' => __('New File', 'wp-parser'),
    +                    'separate_items_with_commas' => __('Files separated by comma', 'wp-parser'),
    +                    'add_or_remove_items' => __('Add or remove Files', 'wp-parser'),
    +                    'choose_from_most_used' => __('Choose from the most used Files', 'wp-parser'),
    +                    'menu_name' => __('Files', 'wp-parser'),
    +                ],
    +                'public' => true,
    +                // Hierarchical x 2 to enable (.+) rather than ([^/]+) for rewrites.
    +                'hierarchical' => true,
    +                'rewrite' => [
    +                    'with_front' => false,
    +                    'slug' => 'reference/files',
    +                    'hierarchical' => true,
    +                ],
    +                'sort' => false,
    +                'update_count_callback' => '_update_post_term_count',
    +                'show_in_rest' => true,
    +            ]
    +        );
    +
    +        // Package
    +        register_taxonomy(
    +            'wp-parser-package',
    +            $object_types,
    +            [
    +                'hierarchical' => true,
    +                'label' => '@package',
    +                'public' => true,
    +                'rewrite' => [
    +                    'with_front' => false,
    +                    'slug' => 'reference/package',
    +                ],
    +                'sort' => false,
    +                'update_count_callback' => '_update_post_term_count',
    +                'show_in_rest' => true,
    +            ]
    +        );
    +
    +        // @since
    +        register_taxonomy(
    +            'wp-parser-since',
    +            $object_types,
    +            [
    +                'hierarchical' => true,
    +                'label' => __('@since', 'wp-parser'),
    +                'public' => true,
    +                'rewrite' => [
    +                    'with_front' => false,
    +                    'slug' => 'reference/since',
    +                ],
    +                'sort' => false,
    +                'update_count_callback' => '_update_post_term_count',
    +                'show_in_rest' => true,
    +            ]
    +        );
    +
    +        // Namespaces
    +        register_taxonomy(
    +            'wp-parser-namespace',
    +            $object_types,
    +            [
    +                'hierarchical' => true,
    +                'label' => __('Namespaces', 'wp-parser'),
    +                'public' => true,
    +                'rewrite' => ['slug' => 'namespace'],
    +                'sort' => false,
    +                'update_count_callback' => '_update_post_term_count',
    +            ]
    +        );
    +
    +        // Source Type
    +        register_taxonomy(
    +            self::SOURCE_TYPE_TAX_SLUG,
    +            array_merge($object_types, ['code-reference']),
    +            [
    +                'hierarchical' => true,
    +                'label' => __('Source Type', 'wp-parser'),
    +                'public' => true,
    +                'rewrite' => [
    +                    'with_front' => false,
    +                    'slug' => 'reference/source-type',
    +                    'hierarchical' => false,
    +                ],
    +                'sort' => false,
    +                'update_count_callback' => '_update_post_term_count',
    +                'show_in_rest' => true,
    +            ]
    +        );
    +
    +        // Add default source-type terms
    +        if (!term_exists('plugin', self::SOURCE_TYPE_TAX_SLUG)) {
    +            wp_insert_term(
    +                __('Plugin', 'wp-parser'),
    +                self::SOURCE_TYPE_TAX_SLUG,
    +                ['slug' => 'plugin']
    +            );
    +        }
    +
    +        if (!term_exists('theme', self::SOURCE_TYPE_TAX_SLUG)) {
    +            wp_insert_term(
    +                __('Theme', 'wp-parser'),
    +                self::SOURCE_TYPE_TAX_SLUG,
    +                ['slug' => 'theme']
    +            );
    +        }
    +
    +        if (!term_exists('composer-package', self::SOURCE_TYPE_TAX_SLUG)) {
    +            wp_insert_term(
    +                __('Composer Package', 'wp-parser'),
    +                self::SOURCE_TYPE_TAX_SLUG,
    +                ['slug' => 'composer-package']
    +            );
    +        }
    +
    +        // Role
    +        register_taxonomy(
    +            self::ROLE_TAX_SLUG,
    +            ['wp-parser-function', 'wp-parser-method'],
    +            [
    +                'hierarchical' => true,
    +                'label' => __('Role', 'wp-parser'),
    +                'public' => true,
    +                'rewrite' => [
    +                    'with_front' => false,
    +                    'slug' => 'reference/role',
    +                ],
    +                'sort' => false,
    +                'update_count_callback' => '_update_post_term_count',
    +                'show_in_rest' => true,
    +            ]
    +        );
    +
    +        // Add default role terms
    +        $roles = [
    +            'display' => __('Display', 'wp-parser'),
    +            'condition' => __('Condition', 'wp-parser'),
    +            'utility' => __('Utility', 'wp-parser'),
    +            'setter' => __('Setter', 'wp-parser'),
    +            'getter' => __('Getter', 'wp-parser'),
    +        ];
    +        foreach ($roles as $slug => $label) {
    +            if (!term_exists($slug, self::ROLE_TAX_SLUG)) {
    +                wp_insert_term($label, self::ROLE_TAX_SLUG, ['slug' => $slug]);
    +            }
    +        }
    +
    +        $parentpostmap = self::getCodeReferenceSourceTypePostMap();
    +        foreach ($parentpostmap as $slug => $info) {
    +            if (empty($parentpostmap[$slug]['post_id'])) {
    +                continue;
    +            }
    +
    +            $parent_term = get_terms([
    +                'fields' => 'ids',
    +                'parent' => 0,
    +                'hide_empty' => false,
    +                'slug' => $slug,
    +                'taxonomy' => self::SOURCE_TYPE_TAX_SLUG,
    +            ]);
    +            if (empty($parent_term) || ($parent_term instanceof \WP_Error)) {
    +                continue;
    +            }
    +            $parent_term_id = $parent_term[0];
    +            // Assign `wp-parser-source-type` term
    +            wp_set_object_terms(
    +                $parentpostmap[$slug]['post_id'],
    +                [$parent_term_id],
    +                self::SOURCE_TYPE_TAX_SLUG
    +            );
    +        }
    +
    +        // Link tags to reference post types
    +        foreach (avcpdp_get_parsed_post_types() as $post_type) {
    +            register_taxonomy_for_object_type('post_tag', $post_type);
    +        }
    +    }
    +
    +    /**
    +     * Returns key-value array of source type slugs to their corresponding
    +     * landing page posts
    +     *
    +     * @author Evan D Shaw 
    +     * @return (string|null)[][]|((string|null)[]|int[])[]
    +     */
    +    public static function getCodeReferenceSourceTypePostMap() {
    +        $parentpostmap = [
    +            'plugin' => [
    +                'title' => __('Plugin', 'wp-parser'),
    +                'post_id' => null,
    +            ],
    +            'theme' => [
    +                'title' => __('Theme', 'wp-parser'),
    +                'post_id' => null,
    +            ],
    +            'composer-package' => [
    +                'title' => __('Composer Package', 'wp-parser'),
    +                'post_id' => null,
    +            ],
    +        ];
    +        foreach ($parentpostmap as $slug => $info) {
    +            $posts = get_posts([
    +                'name' => $slug,
    +                'post_status' => 'any',
    +                'post_type' => self::CODE_REFERENCE_POST_TYPE,
    +            ]);
    +            if (!empty($posts)) {
    +                $parentpostmap[$slug]['post_id'] = $posts[0]->ID;
    +            }
    +        }
    +
    +        return $parentpostmap;
    +    }
    +
    +    /**
    +     * Filters the permalink for a wp-parser-* post.
    +     *
    +     * @param string   $link The post's permalink.
    +     * @param \WP_Post $post The post in question.
    +     * @return string
    +     */
    +    public function postPermalink($link, $post) {
    +        global $wp_rewrite;
    +
    +        if (!$wp_rewrite->using_permalinks()) {
    +            return $link;
    +        }
    +
    +        $post_types = ['wp-parser-function', 'wp-parser-hook', 'wp-parser-class', 'wp-parser-method'];
    +
    +        $stterm = null;
    +        $stchildterm = null;
    +        if (in_array($post->post_type, $post_types, true)) {
    +            $stterms = wp_get_post_terms($post->ID, self::SOURCE_TYPE_TAX_SLUG);
    +            foreach ($stterms as $t) {
    +                if (
    +                    $t->parent === 0 &&
    +                    in_array($t->slug, self::SOURCE_TYPE_TERM_SLUGS, true)
    +                ) {
    +                    $stterm = $t;
    +                } else {
    +                    $stchildterm = $t;
    +                }
    +            }
    +        }
    +
    +        if ($stterm === null || $stchildterm === null) {
    +            return $link;
    +        }
    +
    +        if ('wp-parser-method' === $post->post_type) {
    +            $parts = explode('-', $post->post_name);
    +            $method = array_pop($parts);
    +            $class = implode('-', $parts);
    +            return home_url(user_trailingslashit(
    +                "reference/{$stterm->slug}/{$stchildterm->slug}/classes/{$class}/{$method}"
    +            ));
    +        }
    +
    +        array_pop($post_types);
    +        if (in_array($post->post_type, $post_types, true)) {
    +            $urlpiece = self::WP_PARSER_PT_MAP[$post->post_type]['urlpiece'];
    +            return home_url(user_trailingslashit(
    +                "reference/{$stterm->slug}/{$stchildterm->slug}/{$urlpiece}/{$post->post_name}"
    +            ));
    +        }
    +
    +        return $link;
    +    }
    +
    +    /**
    +     * Filters the taxonomy permalink for `wp-parser-source-file` and
    +     * `wp-parser-since`
    +     *
    +     * @author Evan D Shaw 
    +     * @global \WP_Rewrite $wp_rewrite
    +     * @param string   $link
    +     * @param \WP_Term $term
    +     * @param string   $taxonomy
    +     * @return string
    +     */
    +    public function taxonomyPermalink($link, $term, $taxonomy) {
    +        global $wp_rewrite;
    +
    +        if (!$wp_rewrite->using_permalinks()) {
    +            return $link;
    +        }
    +
    +        if ($taxonomy === 'wp-parser-source-file') {
    +            $slug = $term->slug;
    +            if (substr($slug, -4) === '-php') {
    +                $slug = substr($slug, 0, -4) . '.php';
    +                $slug = str_replace('_', '/', $slug);
    +            }
    +            $link = home_url(user_trailingslashit("reference/files/$slug"));
    +        } elseif ($taxonomy === 'wp-parser-since') {
    +            $link = str_replace($term->slug, str_replace('-', '.', $term->slug), $link);
    +        }
    +
    +        return $link;
    +    }
    +
    +    /**
    +     * Raw phpDoc could potentially introduce unsafe markup into the HTML, so we sanitise it here.
    +     *
    +     * @param array $args Parameter arguments to make safe
    +     * @return array
    +     */
    +    public function makeArgsSafe($args) {
    +        array_walk_recursive($args, [$this, 'sanitizeArgument']);
    +
    +        return apply_filters('wp_parser_make_args_safe', $args);
    +    }
    +
    +    /**
    +     * Sanitizes argument
    +     *
    +     * @param mixed $value
    +     * @return mixed
    +     */
    +    public function sanitizeArgument(&$value) {
    +        static $filters = [
    +            'wp_filter_kses',
    +            'make_clickable',
    +            'force_balance_tags',
    +            'wptexturize',
    +            'convert_smilies',
    +            'convert_chars',
    +            'stripslashes_deep',
    +        ];
    +
    +        foreach ($filters as $filter) {
    +            $value = call_user_func($filter, $value);
    +        }
    +
    +        return $value;
    +    }
    +
    +    /**
    +     * Replace separators with a more readable version
    +     *
    +     * @param string $type Variable type
    +     * @return string
    +     */
    +    public function humanizeSeparator($type) {
    +        return str_replace('|', '' . _x(' or ', 'separator', 'wp-parser') . '', $type);
    +    }
    +}
    diff --git a/src/api-functions.php b/src/api-functions.php
    index 0330af0..095dd2e 100644
    --- a/src/api-functions.php
    +++ b/src/api-functions.php
    @@ -7,7 +7,7 @@
      * @return string
      */
     function avcpdp_get_source_type_taxonomy_slug() {
    -    return WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG;
    +    return Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG;
     }
     
     /**
    @@ -53,7 +53,7 @@ function avcpdp_is_parsed_post_type($post_type = null) {
     function avcpdp_is_reference_landing_page_post_type($post_id = null) {
         $post_type = get_post_type($post_id);
     
    -    return $post_type === WP_Parser\Plugin::CODE_REFERENCE_POST_TYPE;
    +    return $post_type === Aivec\Plugins\DocParser\Registrations::CODE_REFERENCE_POST_TYPE;
     }
     
     /**
    @@ -109,7 +109,7 @@ function avcpdp_get_reference_archive_source_type_terms() {
             // only get source type terms from `wp-parser-*` post types
             return [];
         }
    -    $stype = get_query_var(\WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG);
    +    $stype = get_query_var(\Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG);
         if (empty($stype)) {
             // source type not queried for, cannot determine URL
             return [];
    @@ -144,7 +144,7 @@ function avcpdp_get_reference_archive_base_url() {
             // only show filter by category section for `wp-parser-*` post types
             return '';
         }
    -    $stype = get_query_var(\WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG);
    +    $stype = get_query_var(\Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG);
         if (empty($stype)) {
             // source type not queried for, cannot determine URL
             return '';
    @@ -157,7 +157,7 @@ function avcpdp_get_reference_archive_base_url() {
     
         $type = $stypepieces[0];
         $name = $stypepieces[1];
    -    $parsertype = \WP_Parser\Plugin::WP_PARSER_PT_MAP[$ptype]['urlpiece'];
    +    $parsertype = \Aivec\Plugins\DocParser\Registrations::WP_PARSER_PT_MAP[$ptype]['urlpiece'];
         $baseurl = home_url("/reference/{$type}/{$name}/{$parsertype}");
     
         return $baseurl;
    @@ -252,10 +252,10 @@ function avcpdp_get_reference_landing_page_posts_from_source_type_terms($stterms
             'order' => 'ASC',
             'orderby' => 'parent',
             'post_status' => ['publish', 'private'],
    -        'post_type' => WP_Parser\Plugin::CODE_REFERENCE_POST_TYPE,
    +        'post_type' => Aivec\Plugins\DocParser\Registrations::CODE_REFERENCE_POST_TYPE,
             'tax_query' => [
                 [
    -                'taxonomy' => WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG,
    +                'taxonomy' => Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG,
                     'field' => 'term_id',
                     'terms' => $stterms['type']->term_id,
                     'include_children' => false,
    @@ -270,10 +270,10 @@ function avcpdp_get_reference_landing_page_posts_from_source_type_terms($stterms
             $sourcelanding = get_posts([
                 'post_parent' => $stypelanding[0]->ID,
                 'post_status' => 'publish',
    -            'post_type' => WP_Parser\Plugin::CODE_REFERENCE_POST_TYPE,
    +            'post_type' => Aivec\Plugins\DocParser\Registrations::CODE_REFERENCE_POST_TYPE,
                 'tax_query' => [
                     [
    -                    'taxonomy' => WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG,
    +                    'taxonomy' => Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG,
                         'field' => 'term_id',
                         'terms' => $stterms['name']->term_id,
                         'include_children' => false,
    @@ -304,7 +304,7 @@ function avcpdp_get_post_source_type_terms($post_id = null) {
             return null;
         }
     
    -    $terms = wp_get_post_terms($post_id, WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG);
    +    $terms = wp_get_post_terms($post_id, Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG);
         if (empty($terms)) {
             return null;
         }
    @@ -341,7 +341,7 @@ function avcpdp_source_type_terms_are_valid_for_post($post_id = null) {
             return false;
         }
     
    -    $terms = wp_get_post_terms($post_id, WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG);
    +    $terms = wp_get_post_terms($post_id, Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG);
     
         return avcpdp_source_type_terms_are_valid($terms);
     }
    @@ -356,7 +356,7 @@ function avcpdp_source_type_terms_are_valid_for_post($post_id = null) {
     function avcpdp_get_source_type_terms_from_slug_pair($termslugs) {
         $terms = [];
         foreach ($termslugs as $termslug) {
    -        $term = get_term_by('slug', $termslug, WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG);
    +        $term = get_term_by('slug', $termslug, Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG);
             if (empty($term)) {
                 return false;
             }
    @@ -436,7 +436,7 @@ function avcpdp_source_type_terms_are_valid($terms) {
      * @return WP_Term|false
      */
     function avcpdp_get_source_type_plugin_term() {
    -    return get_term_by('slug', 'plugin', WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG);
    +    return get_term_by('slug', 'plugin', Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG);
     }
     
     /**
    @@ -453,7 +453,7 @@ function avcpdp_get_source_type_plugin_terms() {
     
         $pterms = get_terms([
             'parent' => $term->term_id,
    -        'taxonomy' => WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG,
    +        'taxonomy' => Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG,
         ]);
         if (empty($pterms) || $pterms instanceof WP_Error) {
             return [];
    @@ -479,13 +479,13 @@ function avcpdp_get_reference_post_list_by_role($stterms, $role, $posts_per_page
             'tax_query' => [
                 'relation' => 'AND',
                 [
    -                'taxonomy' => WP_Parser\Plugin::ROLE_TAX_SLUG,
    +                'taxonomy' => Aivec\Plugins\DocParser\Registrations::ROLE_TAX_SLUG,
                     'field' => 'slug',
                     'terms' => $role,
                     'include_children' => true,
                 ],
                 [
    -                'taxonomy' => WP_Parser\Plugin::SOURCE_TYPE_TAX_SLUG,
    +                'taxonomy' => Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG,
                     'field' => 'slug',
                     'terms' => [$stterms['type']->slug, $stterms['name']->slug],
                     'include_children' => false,
    @@ -507,7 +507,7 @@ function avcpdp_get_reference_post_list_by_role($stterms, $role, $posts_per_page
      */
     function avcpdp_get_role_terms($fields = 'all', $hide_empty = true) {
         $terms = get_terms([
    -        'taxonomy' => WP_Parser\Plugin::ROLE_TAX_SLUG,
    +        'taxonomy' => Aivec\Plugins\DocParser\Registrations::ROLE_TAX_SLUG,
             'hide_empty' => $hide_empty,
             'fields' => $fields,
         ]);
    @@ -532,7 +532,7 @@ function avcpdp_get_reference_post_list_having_roles($posts_per_page = 50) {
             'posts_per_page' => $posts_per_page,
             'tax_query' => [
                 [
    -                'taxonomy' => WP_Parser\Plugin::ROLE_TAX_SLUG,
    +                'taxonomy' => Aivec\Plugins\DocParser\Registrations::ROLE_TAX_SLUG,
                     'field' => 'slug',
                     'terms' => avcpdp_get_role_terms('slugs'),
                 ],
    @@ -577,7 +577,7 @@ function avcpdp_get_reference_post_roles($post_id = null) {
             return [];
         }
     
    -    $terms = wp_get_post_terms($post_id, WP_Parser\Plugin::ROLE_TAX_SLUG);
    +    $terms = wp_get_post_terms($post_id, Aivec\Plugins\DocParser\Registrations::ROLE_TAX_SLUG);
         if ($terms instanceof WP_Error) {
             return [];
         }
    @@ -593,7 +593,7 @@ function avcpdp_get_reference_post_roles($post_id = null) {
      * @return WP_Term|false
      */
     function avcpdp_get_role_term_by_slug($slug) {
    -    return get_term_by('slug', $slug, WP_Parser\Plugin::ROLE_TAX_SLUG);
    +    return get_term_by('slug', $slug, Aivec\Plugins\DocParser\Registrations::ROLE_TAX_SLUG);
     }
     
     /**
    diff --git a/src/js/parsed-content.js b/src/js/parsed-content.js
    deleted file mode 100644
    index e08b57c..0000000
    --- a/src/js/parsed-content.js
    +++ /dev/null
    @@ -1,90 +0,0 @@
    -/**
    - * Admin extras backend JS.
    - */
    -
    -(function ($) {
    -  var ticketNumber = $("#wporg_parsed_ticket"),
    -    attachButton = $("#wporg_ticket_attach"),
    -    detachButton = $("#wporg_ticket_detach"),
    -    ticketInfo = $("#wporg_ticket_info"),
    -    spinner = $(".attachment_controls .spinner");
    -
    -  var handleTicket = function (event) {
    -    event.preventDefault();
    -
    -    var $this = $(this),
    -      attachAction = "attach" == event.data.action;
    -
    -    spinner.addClass("is-active");
    -
    -    // Searching ... text.
    -    if (attachAction) {
    -      ticketInfo.text(wporgParsedContent.searchText);
    -    }
    -
    -    var request = wp.ajax.post(
    -      attachAction ? "wporg_attach_ticket" : "wporg_detach_ticket",
    -      {
    -        ticket: ticketNumber.val(),
    -        nonce: $this.data("nonce"),
    -        post_id: $this.data("id"),
    -      }
    -    );
    -
    -    // Success.
    -    request.done(function (response) {
    -      // Refresh the nonce.
    -      $this.data("nonce", response.new_nonce);
    -
    -      // Hide or show the parsed content boxes.
    -      $(".wporg_parsed_content").each(function () {
    -        attachAction ? $(this).show() : $(this).hide();
    -      });
    -
    -      $(".wporg_parsed_readonly").each(function () {
    -        attachAction ? $(this).hide() : $(this).show();
    -      });
    -
    -      var otherButton = attachAction ? detachButton : attachButton;
    -
    -      // Toggle the buttons.
    -      $this.hide();
    -      otherButton.css("display", "inline-block");
    -
    -      // Update the ticket info text.
    -      ticketInfo.html(response.message).show();
    -
    -      // Clear the ticket number when detaching.
    -      if (!attachAction) {
    -        ticketNumber.val("");
    -      }
    -
    -      spinner.removeClass("is-active");
    -
    -      // Set or unset the ticket link icon.
    -      $(".ticket_info_icon").toggleClass(
    -        "dashicons dashicons-external",
    -        attachAction
    -      );
    -
    -      // Set the ticket number to readonly when a ticket is attached.
    -      attachAction
    -        ? ticketNumber.prop("readonly", "readonly")
    -        : ticketNumber.removeAttr("readonly");
    -    });
    -
    -    // Error.
    -    request.fail(function (response) {
    -      // Refresh the nonce.
    -      $this.data("nonce", response.new_nonce);
    -
    -      // Retry text.
    -      ticketInfo.text(wporgParsedContent.retryText);
    -
    -      spinner.removeClass("is-active");
    -    });
    -  };
    -
    -  attachButton.on("click", { action: "attach" }, handleTicket);
    -  detachButton.on("click", { action: "detach" }, handleTicket);
    -})(jQuery);
    diff --git a/src/template-functions.php b/src/template-functions.php
    index b3d9bbc..91749aa 100644
    --- a/src/template-functions.php
    +++ b/src/template-functions.php
    @@ -1 +1,335 @@
     post_type, $post_types, true)) {
    +        return $content;
    +    }
    +
    +    $before_content = ('wp-parser-hook' === $post->post_type) ? get_hook_prototype() : get_prototype();
    +    $before_content .= '

    ' . get_the_excerpt() . '

    '; + $before_content .= '
    '; + + $after_content = '
    '; + $after_content .= '

    Arguments

    '; + + $args = ('wp-parser-hook' === $post->post_type) ? get_hook_arguments() : get_arguments(); + + foreach ($args as $arg) { + $after_content .= '
    '; + $after_content .= '

    ' . implode('|', $arg['types']) . ' ' . $arg['name'] . '

    '; + $after_content .= empty($arg['desc']) ? '' : wpautop($arg['desc'], false); + $after_content .= '
    '; + } + + $after_content .= '
    '; + + $source = get_source_link(); + + if ($source) { + $after_content .= '
    Source'; + } + + $before_content = apply_filters('wp_parser_before_content', $before_content); + $after_content = apply_filters('wp_parser_after_content', $after_content); + + echo $before_content . $content . $after_content; +} + +/** + * Get the current function's return types + * + * @return array + */ +function get_return_type() { + $function_data = get_post_meta(get_the_ID(), '_wp-parser_tags', true); + $return_type = wp_list_filter($function_data, ['name' => 'return']); + + if (!empty($return_type)) { + // Grab the description from the return type + $return_type = array_shift($return_type); + $return_type = $return_type['types']; + } else { + $return_type = ['void']; + } + + return apply_filters('wp_parser_return_type', $return_type); +} + +/** + * Print the current function's return type + * + * @see return_type + * @return void + */ +function the_return_type() { + echo implode('|', get_return_type()); +} + +/** + * Get the current function's return description + * + * @return string + */ +function get_return_desc() { + $function_data = get_post_meta(get_the_ID(), '_wp-parser_tags', true); + $return_desc = wp_list_filter($function_data, ['name' => 'return']); + + if (!empty($return_desc)) { + // Grab the description from the return type + $return_desc = array_shift($return_desc); + $return_desc = $return_desc['content']; + } else { + $return_desc = ''; + } + + return apply_filters('wp_parser_return_desc', $return_desc); +} + +/** + * Print the current function's return description + * + * @return void + */ +function the_return_desc() { + echo get_return_desc(); +} + +/** + * Do any of the current function's arguments have a default value? + * + * @return bool + */ +function arguments_have_default_values() { + $return = wp_list_filter(get_post_meta(get_the_ID(), '_wp-parser_args', true), ['name' => 'default']); + + return apply_filters('wp_parser_arguments_have_default_values', !empty($return)); +} + +/** + * Is the current function deprecated? + * + * @return bool + */ +function is_function_deprecated() { + /* + * Filters whether the current function is considered deprecated. + * + * @param bool Whether the current function should be considered deprecated. + */ + return apply_filters('wp_parser_is_function_deprecated', is_deprecated()); +} + +/** + * Determines if the current element is deprecated. + * + * Works for conceivably any parsed post type that stores DocBlock tag values in meta. + * + * @return bool Whether the current element is considered deprecated. + */ +function is_deprecated() { + $tags = get_post_meta(get_the_ID(), '_wp-parser_tags', true); + $deprecated = wp_list_filter($tags, ['name' => 'deprecated']); + + $post_type = get_post_type(get_the_ID()); + + /* + * Filters whether the current element is deprecated. + * + * @param bool $deprecated Whether the current element should be considered deprecated. + * @param string $post_type Post type for the current element. + */ + return apply_filters('wp_parser_is_deprecated', !empty($deprecated), $post_type); +} + +/** + * Return the current function's arguments. + * + * @return array array( [0] => array( 'name' => '', 'type' => '', 'desc' => '' ), ... ) + */ +function get_arguments() { + $args_data = get_post_meta(get_the_ID(), '_wp-parser_args', true); + $function_data = get_post_meta(get_the_ID(), '_wp-parser_tags', true); + $params = wp_list_filter($function_data, ['name' => 'param']); + + $return_args = []; + + if (empty($args_data)) { + $args_data = []; + } + + foreach ($args_data as $arg) { + $param_tag = wp_list_filter($params, ['variable' => $arg['name']]); + $param_tag = array_shift($param_tag); + $param = [ + 'name' => $arg['name'], + 'types' => [], + ]; + + if (!empty($arg['default'])) { + $param['default_value'] = $arg['default']; + } + + if (!empty($arg['type'])) { + $param['types'] = [$arg['type']]; + } elseif (!empty($param_tag['types'])) { + $param['types'] = $param_tag['types']; + } + + if (!empty($param_tag['content'])) { + $param['desc'] = $param_tag['content']; + } + + $return_args[] = $param; + } + + return apply_filters('wp_parser_get_arguments', $return_args); +} + +/** + * Return the current hook's arguments. + * + * @return array array( [0] => array( 'name' => '', 'type' => '', 'desc' => '' ), ... ) + */ +function get_hook_arguments() { + $args_data = get_post_meta(get_the_ID(), '_wp-parser_args', true); + $hook_data = get_post_meta(get_the_ID(), '_wp-parser_tags', true); + $params = wp_list_filter($hook_data, ['name' => 'param']); + + $return_args = []; + + if (empty($args_data)) { + $args_data = []; + } + + foreach ($args_data as $arg) { + $param_tag = array_shift($params); + $param = [ + 'name' => '$(unnamed)', + 'types' => [], + 'value' => $arg, + ]; + + if (!empty($param_tag['variable'])) { + $param['name'] = $param_tag['variable']; + } elseif (0 === strpos($arg, '$')) { + $param['name'] = $arg; + } + + if (!empty($param_tag['types'])) { + $param['types'] = $param_tag['types']; + } + + if (!empty($param_tag['content'])) { + $param['desc'] = $param_tag['content']; + } + + $return_args[] = $param; + } + + return apply_filters('wp_parser_get_hook_arguments', $return_args); +} + +/** + * Retrieve the function's prototype as HTML + * + * Use the wp_parser_prototype filter to change the content of this. + * + * @return string Prototype HTML + */ +function get_prototype() { + $type = get_return_type(); + + $friendly_args = []; + $args = get_arguments(); + foreach ($args as $arg) { + $friendly = sprintf('%s %s', implode('|', $arg['types']), $arg['name']); + $friendly .= empty($arg['default_value']) ? '' : ' = ' . $arg['default_value'] . ''; + + $friendly_args[] = $friendly; + } + $friendly_args = implode(', ', $friendly_args); + + $name = get_the_title(); + + $prototype = sprintf('

    %s %s ( %s )

    ', implode('|', $type), $name, $friendly_args); + + return apply_filters('wp_parser_prototype', $prototype); +} + +/** + * Print the function's prototype + * + * @see get_prototype + * @return void + */ +function the_prototype() { + echo get_prototype(); +} + +/** + * Retrieve the hook's prototype as HTML. + * + * Use the wp_parser_hook_prototype filter to change the content of this. + * + * @return string Prototype HTML + */ +function get_hook_prototype() { + $friendly_args = []; + $args = get_hook_arguments(); + foreach ($args as $arg) { + $friendly = sprintf('%s %s', implode('|', $arg['types']), $arg['name']); + $has_value = !empty($arg['value']) && 0 !== strpos($arg['value'], '$'); + $friendly .= $has_value ? ' = ' . $arg['value'] . '' : ''; + + $friendly_args[] = $friendly; + } + $friendly_args = implode(', ', $friendly_args); + + $name = get_the_title(); + + $prototype = sprintf('

    %s ( %s )

    ', $name, $friendly_args); + + return apply_filters('wp_parser_hook_prototype', $prototype); +} + +/** + * Returns the URL to the current function on the bbP/BP trac. + * + * @return string + */ +function get_source_link() { + $trac_url = apply_filters('wp_parser_source_link_base', false); + if (empty($trac_url)) { + return ''; + } + + // Find the current post in the wp-parser-source-file term + $term = get_the_terms(get_the_ID(), 'wp-parser-source-file'); + if (!empty($term) && !is_wp_error($term)) { + $term = array_shift($term); + $line_num = (int)get_post_meta(get_the_ID(), '_wp-parser_line_num', true); + + // The format here takes the base URL, the term name, and the line number + $format = apply_filters('wp_parser_source_link_format', '%s%s#L%d'); + // Link to the specific file name and the line number on trac + $trac_url = sprintf($format, $trac_url, $term->name, $line_num); + } + + return $trac_url; +} diff --git a/tests/phpunit/includes/export-testcase.php b/tests/phpunit/includes/export-testcase.php index b3fe845..a56408e 100644 --- a/tests/phpunit/includes/export-testcase.php +++ b/tests/phpunit/includes/export-testcase.php @@ -6,6 +6,8 @@ namespace WP_Parser\Tests; +use Aivec\Plugins\DocParser\Importer\Parser; + /** * Parent test case for data export tests. */ @@ -28,7 +30,7 @@ protected function parse_file() { $file = rtrim( $file, 'php' ) . 'inc'; $path = dirname( $file ); - $export_data = \WP_Parser\parse_files( array( $file ), $path ); + $export_data = Parser::parseFiles( array( $file ), $path ); $this->export_data = $export_data[0]; } From 1ddf3ccef3d6bcf747c5b55836a1ab8a63c75fce Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Tue, 14 Sep 2021 16:57:55 +0900 Subject: [PATCH 24/66] chore: finish fixing all linting errors --- composer.json | 5 +- composer.lock | 387 +++++++- languages/messages.pot | 589 ++++++----- languages/wp-parser-en.mo | Bin 2601 -> 2601 bytes languages/wp-parser-en.po | 542 +++++------ languages/wp-parser-ja.mo | Bin 6660 -> 6660 bytes languages/wp-parser-ja.po | 534 +++++----- src/CLI/Commands.php | 3 + src/Explanations/Explanations.php | 3 +- src/Importer/FileReflector.php | 3 +- src/Importer/Importer.php | 60 +- src/Importer/MethodCallReflector.php | 7 +- src/Importer/Parser.php | 15 +- src/Importer/Relationships.php | 77 +- src/ParsedContent.php | 6 +- src/api-functions.php | 2 + tests/phpunit/includes/bootstrap.php | 22 +- tests/phpunit/includes/export-testcase.php | 911 +++++++++--------- tests/phpunit/includes/testcases/import.php | 33 +- tests/phpunit/tests/export/docblocks.php | 258 +++-- tests/phpunit/tests/export/hooks.php | 68 +- tests/phpunit/tests/export/namespace.php | 20 +- .../phpunit/tests/export/uses/constructor.php | 148 ++- tests/phpunit/tests/export/uses/methods.php | 190 ++-- tests/phpunit/tests/export/uses/nested.php | 407 ++++---- tests/phpunit/tests/import/file.php | 246 +++-- tests/source/actions.php | 1 + tests/source/bad-class-doc.php | 2 +- tests/source/class-property-doc.php | 2 +- tests/source/class_method_doc.php | 74 +- tests/source/deprecated-file.php | 23 +- tests/source/filters.php | 4 +- tests/source/functions.php | 27 +- tests/source/good-class.php | 15 +- tests/source/relationships.php | 112 +-- 35 files changed, 2536 insertions(+), 2260 deletions(-) diff --git a/composer.json b/composer.json index 60ff0e0..c126b92 100644 --- a/composer.json +++ b/composer.json @@ -31,7 +31,8 @@ "psr/log": "~1.0" }, "require-dev": { - "wp-cli/i18n-command": "^2.2" + "wp-cli/i18n-command": "^2.2", + "aivec/phpcs-wp": "^2.0" }, "autoload": { "files": [ @@ -43,6 +44,8 @@ } }, "scripts": { + "lint": "phpcs -ps --standard=AivecWP-5 --ignore=*/tests/* .", + "lint:fix": "phpcbf -ps --standard=AivecWP-5 --ignore=*/tests/* .", "i18n:create-pot": "./vendor/bin/wp i18n make-pot . languages/messages.pot", "i18n:update-pos": "@composer i18n:create-pot && find ./languages -name \"*.po\" | xargs -I % msgmerge -o % % languages/messages.pot", "i18n:make-mo": "./vendor/bin/wp i18n make-mo languages" diff --git a/composer.lock b/composer.lock index 9ace13c..14d8347 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4b8595be9077523c1780ddc65ed3a95a", + "content-hash": "37b4bb896739e4a866615359ddaa899f", "packages": [ { "name": "composer/installers", @@ -491,6 +491,110 @@ } ], "packages-dev": [ + { + "name": "aivec/phpcs-wp", + "version": "v2.0.10", + "source": { + "type": "git", + "url": "https://github.com/aivec/phpcs-wp.git", + "reference": "6cbcf3c5437b69ee174b0fba655529ce047cb112" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aivec/phpcs-wp/zipball/6cbcf3c5437b69ee174b0fba655529ce047cb112", + "reference": "6cbcf3c5437b69ee174b0fba655529ce047cb112", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "php": ">=5.6.0,<8.0.0-dev", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3" + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Aivec coding standards for vanilla PHP and WordPress PHP libraries/projects/plugins/themes", + "support": { + "issues": "https://github.com/aivec/phpcs-wp/issues", + "source": "https://github.com/aivec/phpcs-wp/tree/v2.0.10" + }, + "time": "2021-09-13T13:58:46+00:00" + }, + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v0.7.1", + "source": { + "type": "git", + "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", + "reference": "fe390591e0241955f22eb9ba327d137e501c771c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c", + "reference": "fe390591e0241955f22eb9ba327d137e501c771c", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "phpcompatibility/php-compatibility": "^9.0", + "sensiolabs/security-checker": "^4.1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", + "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + }, + "time": "2020-12-07T18:04:37+00:00" + }, { "name": "gettext/gettext", "version": "v4.8.5", @@ -745,6 +849,178 @@ }, "time": "2019-11-23T21:40:31+00:00" }, + { + "name": "phpcompatibility/php-compatibility", + "version": "9.3.5", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" + }, + "conflict": { + "squizlabs/php_codesniffer": "2.6.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "homepage": "https://github.com/wimg", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" + } + ], + "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", + "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", + "keywords": [ + "compatibility", + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibility" + }, + "time": "2019-12-27T09:44:58+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-paragonie", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", + "reference": "ddabec839cc003651f2ce695c938686d1086cf43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/ddabec839cc003651f2ce695c938686d1086cf43", + "reference": "ddabec839cc003651f2ce695c938686d1086cf43", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "paragonie/random_compat": "dev-master", + "paragonie/sodium_compat": "dev-master" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" + } + ], + "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", + "homepage": "http://phpcompatibility.com/", + "keywords": [ + "compatibility", + "paragonie", + "phpcs", + "polyfill", + "standards" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" + }, + "time": "2021-02-15T10:24:51+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-wp", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", + "reference": "a792ab623069f0ce971b2417edef8d9632e32f75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/a792ab623069f0ce971b2417edef8d9632e32f75", + "reference": "a792ab623069f0ce971b2417edef8d9632e32f75", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0", + "phpcompatibility/phpcompatibility-paragonie": "^1.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" + } + ], + "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", + "homepage": "http://phpcompatibility.com/", + "keywords": [ + "compatibility", + "phpcs", + "standards", + "wordpress" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" + }, + "time": "2021-07-21T11:09:57+00:00" + }, { "name": "rmccue/requests", "version": "v1.8.1", @@ -805,6 +1081,62 @@ }, "time": "2021-06-04T09:56:25+00:00" }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.6.0", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2021-04-09T00:54:41+00:00" + }, { "name": "symfony/finder", "version": "v5.3.7", @@ -1189,6 +1521,57 @@ "source": "https://github.com/wp-cli/wp-cli" }, "time": "2021-05-14T13:44:51+00:00" + }, + { + "name": "wp-coding-standards/wpcs", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", + "reference": "7da1894633f168fe244afc6de00d141f27517b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7da1894633f168fe244afc6de00d141f27517b62", + "reference": "7da1894633f168fe244afc6de00d141f27517b62", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.3.1" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || ^0.6", + "phpcompatibility/php-compatibility": "^9.0", + "phpcsstandards/phpcsdevtools": "^1.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.6 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Contributors", + "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", + "keywords": [ + "phpcs", + "standards", + "wordpress" + ], + "support": { + "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", + "source": "https://github.com/WordPress/WordPress-Coding-Standards", + "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" + }, + "time": "2020-05-13T23:57:56+00:00" } ], "aliases": [], @@ -1203,5 +1586,5 @@ "php": ">=5.4" }, "platform-dev": [], - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.0.0" } diff --git a/languages/messages.pot b/languages/messages.pot index d0ddbb0..d88c271 100644 --- a/languages/messages.pot +++ b/languages/messages.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2021-09-06T11:47:24+09:00\n" +"POT-Creation-Date: 2021-09-14T16:32:24+09:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.5.0\n" "X-Domain: wp-parser\n" @@ -34,539 +34,516 @@ msgstr "" msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" msgstr "" -#: lib/class-importer.php:292 -msgid "Functions Reference" -msgstr "" - -#: lib/class-importer.php:296 -msgid "Hooks Reference" +#: src/api-functions.php:21 +#: src/Registrations.php:190 +#: src/Registrations.php:192 +#: src/Registrations.php:194 +#: src/Registrations.php:204 +msgid "Classes" msgstr "" -#: lib/class-plugin.php:135 -#: lib/class-plugin.php:137 -#: lib/class-plugin.php:139 -#: lib/class-plugin.php:149 #: src/api-functions.php:22 +#: src/Registrations.php:130 +#: src/Registrations.php:132 +#: src/Registrations.php:134 +#: src/Registrations.php:144 msgid "Functions" msgstr "" -#: lib/class-plugin.php:138 -msgid "Function" -msgstr "" - -#: lib/class-plugin.php:140 -msgid "New Function" -msgstr "" - -#: lib/class-plugin.php:141 -#: lib/class-plugin.php:173 -#: lib/class-plugin.php:205 -#: lib/class-plugin.php:237 -#: lib/class-plugin.php:272 -msgid "Add New" -msgstr "" - -#: lib/class-plugin.php:142 -msgid "Add New Function" -msgstr "" - -#: lib/class-plugin.php:143 -msgid "Edit Function" -msgstr "" - -#: lib/class-plugin.php:144 -msgid "View Function" -msgstr "" - -#: lib/class-plugin.php:145 -msgid "Search Functions" +#: src/api-functions.php:23 +#: src/Registrations.php:220 +#: src/Registrations.php:222 +#: src/Registrations.php:224 +#: src/Registrations.php:234 +msgid "Hooks" msgstr "" -#: lib/class-plugin.php:146 -msgid "No Functions found" +#: src/api-functions.php:24 +#: src/Registrations.php:160 +#: src/Registrations.php:162 +#: src/Registrations.php:164 +#: src/Registrations.php:174 +msgid "Methods" msgstr "" -#: lib/class-plugin.php:147 -msgid "No Functions found in trash" +#: src/Explanations/Explanations.php:93 +#: src/Explanations/Explanations.php:95 +msgid "Explanations" msgstr "" -#: lib/class-plugin.php:148 -msgid "Parent Function" +#: src/Explanations/Explanations.php:94 +#: src/Explanations/Explanations.php:232 +msgid "Explanation" msgstr "" -#: lib/class-plugin.php:167 -#: lib/class-plugin.php:169 -#: lib/class-plugin.php:171 -#: lib/class-plugin.php:181 -#: src/api-functions.php:24 -msgid "Methods" +#: src/Explanations/Explanations.php:96 +#: src/Explanations/Explanations.php:413 +#: src/Explanations/Explanations.php:414 +#: src/Explanations/Explanations.php:442 +#: src/Explanations/Explanations.php:524 +msgid "Edit Explanation" msgstr "" -#: lib/class-plugin.php:170 -msgid "Method" +#: src/Explanations/Explanations.php:97 +msgid "View Explanation" msgstr "" -#: lib/class-plugin.php:172 -msgid "New Method" +#: src/Explanations/Explanations.php:98 +msgid "Search Explanations" msgstr "" -#: lib/class-plugin.php:174 -msgid "Add New Method" +#: src/Explanations/Explanations.php:99 +msgid "No Explanations found" msgstr "" -#: lib/class-plugin.php:175 -msgid "Edit Method" +#: src/Explanations/Explanations.php:100 +msgid "No Explanations found in trash" msgstr "" -#: lib/class-plugin.php:176 -msgid "View Method" +#. translators: Number of pending explanation posts +#: src/Explanations/Explanations.php:191 +msgid "Explanations %s" msgstr "" -#: lib/class-plugin.php:177 -msgid "Search Methods" +#: src/Explanations/Explanations.php:238 +msgid "Status:" msgstr "" -#: lib/class-plugin.php:178 -msgid "No Methods found" +#: src/Explanations/Explanations.php:249 +msgid "Last Modified:" msgstr "" -#: lib/class-plugin.php:179 -msgid "No Methods found in trash" +#: src/Explanations/Explanations.php:278 +msgid "Associated with: " msgstr "" -#: lib/class-plugin.php:180 -msgid "Parent Method" +#: src/Explanations/Explanations.php:330 +msgid "Explanation Editor" msgstr "" -#: lib/class-plugin.php:199 -#: lib/class-plugin.php:201 -#: lib/class-plugin.php:203 -#: lib/class-plugin.php:213 -#: src/api-functions.php:21 -msgid "Classes" +#: src/Explanations/Explanations.php:421 +#: src/Explanations/Explanations.php:454 +msgid "Add Explanation" msgstr "" -#: lib/class-plugin.php:202 -msgid "Class" +#: src/Explanations/Explanations.php:446 +msgid "Unpublish" msgstr "" -#: lib/class-plugin.php:204 -msgid "New Class" +#: src/Explanations/Explanations.php:451 +#: src/Explanations/Explanations.php:484 +msgid "None" msgstr "" -#: lib/class-plugin.php:206 -msgid "Add New Class" +#: src/Explanations/Explanations.php:474 +#: src/Explanations/Explanations.php:526 +msgid "Draft" msgstr "" -#: lib/class-plugin.php:207 -msgid "Edit Class" +#: src/Explanations/Explanations.php:477 +#: src/Explanations/Explanations.php:527 +msgid "Pending Review" msgstr "" -#: lib/class-plugin.php:208 -msgid "View Class" +#: src/Explanations/Explanations.php:480 +#: src/Explanations/Explanations.php:528 +msgid "Published" msgstr "" -#: lib/class-plugin.php:209 -msgid "Search Classes" +#: src/Explanations/Explanations.php:546 +msgid "Explanation already exists." msgstr "" -#: lib/class-plugin.php:210 -msgid "No Classes found" +#: src/Explanations/Explanations.php:565 +msgid "Explanation could not be created." msgstr "" -#: lib/class-plugin.php:211 -msgid "No Classes found in trash" +#: src/Explanations/Explanations.php:591 +msgid "Explanation could not be un-published." msgstr "" -#: lib/class-plugin.php:212 -msgid "Parent Class" +#: src/Explanations/Explanations.php:614 +msgid "Has explanation?" msgstr "" -#: lib/class-plugin.php:231 -#: lib/class-plugin.php:233 -#: lib/class-plugin.php:235 -#: lib/class-plugin.php:245 -#: src/api-functions.php:23 -msgid "Hooks" +#: src/Explanations/Explanations.php:615 +msgid "Explanation?" msgstr "" -#: lib/class-plugin.php:234 -msgid "Hook" +#: src/Explanations/Explanations.php:638 +msgid "Post has an explanation." msgstr "" -#: lib/class-plugin.php:236 -msgid "New Hook" +#: src/Importer/Importer.php:307 +msgid "Functions Reference" msgstr "" -#: lib/class-plugin.php:238 -msgid "Add New Hook" +#: src/Importer/Importer.php:311 +msgid "Hooks Reference" msgstr "" -#: lib/class-plugin.php:239 -msgid "Edit Hook" +#: src/Importer/Relationships.php:97 +#: src/Importer/Relationships.php:157 +msgid "Uses Functions" msgstr "" -#: lib/class-plugin.php:240 -msgid "View Hook" +#: src/Importer/Relationships.php:98 +#: src/Importer/Relationships.php:117 +#: src/Importer/Relationships.php:136 +msgid "Used by Functions" msgstr "" -#: lib/class-plugin.php:241 -msgid "Search Hooks" +#: src/Importer/Relationships.php:116 +#: src/Importer/Relationships.php:177 +msgid "Uses Methods" msgstr "" -#: lib/class-plugin.php:242 -msgid "No Hooks found" +#: src/Importer/Relationships.php:135 +#: src/Importer/Relationships.php:197 +msgid "Uses Hooks" msgstr "" -#: lib/class-plugin.php:243 -msgid "No Hooks found in trash" +#: src/Importer/Relationships.php:158 +#: src/Importer/Relationships.php:178 +#: src/Importer/Relationships.php:196 +msgid "Used by Methods" msgstr "" -#: lib/class-plugin.php:244 -msgid "Parent Hook" +#: src/ParsedContent.php:83 +msgid "Parsed Content" msgstr "" -#: lib/class-plugin.php:266 -#: lib/class-plugin.php:268 -#: lib/class-plugin.php:270 -#: lib/class-plugin.php:279 -msgid "Reference Landing Pages" +#: src/ParsedContent.php:112 +msgid "Parsed Summary:" msgstr "" -#: lib/class-plugin.php:269 -msgid "Reference Landing Page" +#: src/ParsedContent.php:121 +#: src/ParsedContent.php:148 +msgid "Translated Summary:" msgstr "" -#: lib/class-plugin.php:271 -msgid "New Reference Landing Page" +#: src/ParsedContent.php:139 +msgid "Parsed Description:" msgstr "" -#: lib/class-plugin.php:273 -msgid "Add New Reference Landing Page" +#: src/ParsedContent.php:166 +msgid "Tags (args, return)" msgstr "" -#: lib/class-plugin.php:274 -msgid "Edit Reference Landing Page" +#. translators: the type +#: src/ParsedContent.php:178 +#: src/ParsedContent.php:224 +msgid "(%s)" msgstr "" -#: lib/class-plugin.php:275 -msgid "View Reference Landing Page" +#. translators: the arg name +#: src/ParsedContent.php:198 +msgid "%s (Translated)" msgstr "" -#: lib/class-plugin.php:276 -msgid "Search Reference Landing Pages" +#: src/ParsedContent.php:221 +msgid "Parsed Return:" msgstr "" -#: lib/class-plugin.php:277 -msgid "No Pages found" +#: src/ParsedContent.php:237 +msgid "Translated Return:" msgstr "" -#: lib/class-plugin.php:278 -msgid "No Pages found in trash" +#: src/Registrations.php:133 +msgid "Function" msgstr "" -#: lib/class-plugin.php:328 -#: lib/class-plugin.php:330 -#: lib/class-plugin.php:344 -msgid "Files" +#: src/Registrations.php:135 +msgid "New Function" msgstr "" -#: lib/class-plugin.php:331 -msgctxt "taxonomy general name" -msgid "File" +#: src/Registrations.php:136 +#: src/Registrations.php:166 +#: src/Registrations.php:196 +#: src/Registrations.php:226 +#: src/Registrations.php:259 +msgid "Add New" msgstr "" -#: lib/class-plugin.php:332 -msgid "Search Files" +#: src/Registrations.php:137 +msgid "Add New Function" msgstr "" -#: lib/class-plugin.php:334 -msgid "All Files" +#: src/Registrations.php:138 +msgid "Edit Function" msgstr "" -#: lib/class-plugin.php:335 -msgid "Parent File" +#: src/Registrations.php:139 +msgid "View Function" msgstr "" -#: lib/class-plugin.php:336 -msgid "Parent File:" +#: src/Registrations.php:140 +msgid "Search Functions" msgstr "" -#: lib/class-plugin.php:337 -msgid "Edit File" +#: src/Registrations.php:141 +msgid "No Functions found" msgstr "" -#: lib/class-plugin.php:338 -msgid "Update File" +#: src/Registrations.php:142 +msgid "No Functions found in trash" msgstr "" -#: lib/class-plugin.php:339 -#: lib/class-plugin.php:340 -msgid "New File" +#: src/Registrations.php:143 +msgid "Parent Function" msgstr "" -#: lib/class-plugin.php:341 -msgid "Files separated by comma" +#: src/Registrations.php:163 +msgid "Method" msgstr "" -#: lib/class-plugin.php:342 -msgid "Add or remove Files" +#: src/Registrations.php:165 +msgid "New Method" msgstr "" -#: lib/class-plugin.php:343 -msgid "Choose from the most used Files" +#: src/Registrations.php:167 +msgid "Add New Method" msgstr "" -#: lib/class-plugin.php:388 -msgid "@since" +#: src/Registrations.php:168 +msgid "Edit Method" msgstr "" -#: lib/class-plugin.php:408 -msgid "Namespaces" +#: src/Registrations.php:169 +msgid "View Method" msgstr "" -#: lib/class-plugin.php:424 -msgid "Source Type" +#: src/Registrations.php:170 +msgid "Search Methods" msgstr "" -#: lib/class-plugin.php:441 -#: lib/class-plugin.php:531 -msgid "Plugin" +#: src/Registrations.php:171 +msgid "No Methods found" msgstr "" -#: lib/class-plugin.php:449 -#: lib/class-plugin.php:535 -msgid "Theme" +#: src/Registrations.php:172 +msgid "No Methods found in trash" msgstr "" -#: lib/class-plugin.php:457 -#: lib/class-plugin.php:539 -msgid "Composer Package" +#: src/Registrations.php:173 +msgid "Parent Method" msgstr "" -#: lib/class-plugin.php:470 -msgid "Role" +#: src/Registrations.php:193 +msgid "Class" msgstr "" -#: lib/class-plugin.php:485 -msgid "Display" +#: src/Registrations.php:195 +msgid "New Class" msgstr "" -#: lib/class-plugin.php:486 -msgid "Condition" +#: src/Registrations.php:197 +msgid "Add New Class" msgstr "" -#: lib/class-plugin.php:487 -msgid "Utility" +#: src/Registrations.php:198 +msgid "Edit Class" msgstr "" -#: lib/class-plugin.php:488 -msgid "Setter" +#: src/Registrations.php:199 +msgid "View Class" msgstr "" -#: lib/class-plugin.php:489 -msgid "Getter" +#: src/Registrations.php:200 +msgid "Search Classes" msgstr "" -#: lib/class-plugin.php:677 -msgctxt "separator" -msgid " or " +#: src/Registrations.php:201 +msgid "No Classes found" msgstr "" -#: lib/class-relationships.php:90 -#: lib/class-relationships.php:150 -msgid "Uses Functions" +#: src/Registrations.php:202 +msgid "No Classes found in trash" msgstr "" -#: lib/class-relationships.php:91 -#: lib/class-relationships.php:110 -#: lib/class-relationships.php:129 -msgid "Used by Functions" +#: src/Registrations.php:203 +msgid "Parent Class" msgstr "" -#: lib/class-relationships.php:109 -#: lib/class-relationships.php:170 -msgid "Uses Methods" +#: src/Registrations.php:223 +msgid "Hook" msgstr "" -#: lib/class-relationships.php:128 -#: lib/class-relationships.php:190 -msgid "Uses Hooks" +#: src/Registrations.php:225 +msgid "New Hook" msgstr "" -#: lib/class-relationships.php:151 -#: lib/class-relationships.php:171 -#: lib/class-relationships.php:189 -msgid "Used by Methods" +#: src/Registrations.php:227 +msgid "Add New Hook" msgstr "" -#: src/Admin.php:112 -msgid "Reset votes (%d)" +#: src/Registrations.php:228 +msgid "Edit Hook" msgstr "" -#: src/Explanations.php:91 -#: src/Explanations.php:93 -msgid "Explanations" +#: src/Registrations.php:229 +msgid "View Hook" msgstr "" -#: src/Explanations.php:92 -#: src/Explanations.php:231 -msgid "Explanation" +#: src/Registrations.php:230 +msgid "Search Hooks" msgstr "" -#: src/Explanations.php:94 -#: src/Explanations.php:418 -#: src/Explanations.php:419 -#: src/Explanations.php:448 -#: src/Explanations.php:528 -msgid "Edit Explanation" +#: src/Registrations.php:231 +msgid "No Hooks found" msgstr "" -#: src/Explanations.php:95 -msgid "View Explanation" +#: src/Registrations.php:232 +msgid "No Hooks found in trash" msgstr "" -#: src/Explanations.php:96 -msgid "Search Explanations" +#: src/Registrations.php:233 +msgid "Parent Hook" msgstr "" -#: src/Explanations.php:97 -msgid "No Explanations found" +#: src/Registrations.php:253 +#: src/Registrations.php:255 +#: src/Registrations.php:257 +#: src/Registrations.php:266 +msgid "Reference Landing Pages" msgstr "" -#: src/Explanations.php:98 -msgid "No Explanations found in trash" +#: src/Registrations.php:256 +msgid "Reference Landing Page" msgstr "" -#: src/Explanations.php:189 -msgid "Explanations %s" +#: src/Registrations.php:258 +msgid "New Reference Landing Page" msgstr "" -#: src/Explanations.php:237 -msgid "Status:" +#: src/Registrations.php:260 +msgid "Add New Reference Landing Page" msgstr "" -#: src/Explanations.php:248 -msgid "Last Modified:" +#: src/Registrations.php:261 +msgid "Edit Reference Landing Page" msgstr "" -#: src/Explanations.php:278 -msgid "Associated with: " +#: src/Registrations.php:262 +msgid "View Reference Landing Page" msgstr "" -#: src/Explanations.php:331 -msgid "Explanation Editor" +#: src/Registrations.php:263 +msgid "Search Reference Landing Pages" msgstr "" -#: src/Explanations.php:426 -#: src/Explanations.php:460 -msgid "Add Explanation" +#: src/Registrations.php:264 +msgid "No Pages found" msgstr "" -#: src/Explanations.php:452 -msgid "Unpublish" +#: src/Registrations.php:265 +msgid "No Pages found in trash" msgstr "" -#: src/Explanations.php:457 -#: src/Explanations.php:492 -msgid "None" +#: src/Registrations.php:301 +#: src/Registrations.php:303 +#: src/Registrations.php:317 +msgid "Files" msgstr "" -#: src/Explanations.php:482 -#: src/Explanations.php:530 -msgid "Draft" +#: src/Registrations.php:304 +msgctxt "taxonomy general name" +msgid "File" msgstr "" -#: src/Explanations.php:485 -#: src/Explanations.php:531 -msgid "Pending Review" +#: src/Registrations.php:305 +msgid "Search Files" msgstr "" -#: src/Explanations.php:488 -#: src/Explanations.php:532 -msgid "Published" +#: src/Registrations.php:307 +msgid "All Files" msgstr "" -#: src/Explanations.php:550 -msgid "Explanation already exists." +#: src/Registrations.php:308 +msgid "Parent File" msgstr "" -#: src/Explanations.php:569 -msgid "Explanation could not be created." +#: src/Registrations.php:309 +msgid "Parent File:" msgstr "" -#: src/Explanations.php:595 -msgid "Explanation could not be un-published." +#: src/Registrations.php:310 +msgid "Edit File" msgstr "" -#: src/Explanations.php:620 -msgid "Has explanation?" +#: src/Registrations.php:311 +msgid "Update File" msgstr "" -#: src/Explanations.php:621 -msgid "Explanation?" +#: src/Registrations.php:312 +#: src/Registrations.php:313 +msgid "New File" msgstr "" -#: src/Explanations.php:645 -msgid "Post has an explanation." +#: src/Registrations.php:314 +msgid "Files separated by comma" msgstr "" -#: src/ParsedContent.php:68 -msgid "Parsed Content" +#: src/Registrations.php:315 +msgid "Add or remove Files" msgstr "" -#: src/ParsedContent.php:89 -msgid "Core Trac" +#: src/Registrations.php:316 +msgid "Choose from the most used Files" msgstr "" -#: src/ParsedContent.php:90 -msgid "A valid, open ticket from %s is required to edit parsed content." +#: src/Registrations.php:357 +msgid "@since" msgstr "" -#: src/ParsedContent.php:98 -msgid "Parsed Summary:" +#: src/Registrations.php:375 +msgid "Namespaces" msgstr "" -#: src/ParsedContent.php:107 -msgid "Parsed Description:" +#: src/Registrations.php:389 +msgid "Source Type" msgstr "" -#: src/ParsedContent.php:127 -msgid "Trac Ticket Number:" +#: src/Registrations.php:405 +#: src/Registrations.php:500 +msgid "Plugin" msgstr "" -#: src/ParsedContent.php:132 -msgid "Attach a Core Trac ticket" +#: src/Registrations.php:413 +#: src/Registrations.php:504 +msgid "Theme" msgstr "" -#: src/ParsedContent.php:133 -msgid "Attach Ticket" +#: src/Registrations.php:421 +#: src/Registrations.php:508 +msgid "Composer Package" msgstr "" -#: src/ParsedContent.php:135 -msgid "Detach the Trac ticket" +#: src/Registrations.php:433 +msgid "Role" msgstr "" -#: src/ParsedContent.php:136 -msgid "Detach Ticket" +#: src/Registrations.php:447 +msgid "Display" msgstr "" -#: src/ParsedContent.php:183 -msgid "Searching ..." +#: src/Registrations.php:448 +msgid "Condition" msgstr "" -#: src/ParsedContent.php:184 -msgid "Invalid ticket number, please try again." +#: src/Registrations.php:449 +msgid "Utility" msgstr "" -#: src/ParsedContent.php:238 -msgid "Invalid ticket number." +#: src/Registrations.php:450 +msgid "Setter" msgstr "" -#: src/ParsedContent.php:263 -msgid "Ticket detached." +#: src/Registrations.php:451 +msgid "Getter" msgstr "" -#: src/ParsedContent.php:269 -msgid "Ticket still attached." +#: src/Registrations.php:657 +msgctxt "separator" +msgid " or " msgstr "" diff --git a/languages/wp-parser-en.mo b/languages/wp-parser-en.mo index 4147538d0088025eba1088abcdec2d1a8c124384..0a8da7337cdd6da1138cf52fb07cd2c030d30bf5 100644 GIT binary patch delta 21 ccmZ1}vQlJ&D?5jwNr<7Dm9f!gU-mmp07Z%hBLDyZ delta 21 ccmZ1}vQlJ&D?5jQS%{&bm5KRgU-mmp07Z=kB>(^b diff --git a/languages/wp-parser-en.po b/languages/wp-parser-en.po index 780a408..3601d15 100644 --- a/languages/wp-parser-en.po +++ b/languages/wp-parser-en.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: AVC WP Parser %%VERSION%%\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-phpdoc-parser\n" -"POT-Creation-Date: 2021-09-06T11:47:24+09:00\n" +"POT-Creation-Date: 2021-09-14T16:32:24+09:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -42,527 +42,505 @@ msgstr "" msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" msgstr "https://github.com/aivec/phpdoc-parser/graphs/contributors" -#: lib/class-importer.php:292 +#: src/api-functions.php:21 src/Registrations.php:190 src/Registrations.php:192 +#: src/Registrations.php:194 src/Registrations.php:204 +msgid "Classes" +msgstr "Classes" + +#: src/api-functions.php:22 src/Registrations.php:130 src/Registrations.php:132 +#: src/Registrations.php:134 src/Registrations.php:144 +msgid "Functions" +msgstr "Functions" + +#: src/api-functions.php:23 src/Registrations.php:220 src/Registrations.php:222 +#: src/Registrations.php:224 src/Registrations.php:234 +msgid "Hooks" +msgstr "Hooks" + +#: src/api-functions.php:24 src/Registrations.php:160 src/Registrations.php:162 +#: src/Registrations.php:164 src/Registrations.php:174 +msgid "Methods" +msgstr "Methods" + +#: src/Explanations/Explanations.php:93 src/Explanations/Explanations.php:95 +msgid "Explanations" +msgstr "" + +#: src/Explanations/Explanations.php:94 src/Explanations/Explanations.php:232 +msgid "Explanation" +msgstr "" + +#: src/Explanations/Explanations.php:96 src/Explanations/Explanations.php:413 +#: src/Explanations/Explanations.php:414 src/Explanations/Explanations.php:442 +#: src/Explanations/Explanations.php:524 +msgid "Edit Explanation" +msgstr "" + +#: src/Explanations/Explanations.php:97 +msgid "View Explanation" +msgstr "" + +#: src/Explanations/Explanations.php:98 +msgid "Search Explanations" +msgstr "" + +#: src/Explanations/Explanations.php:99 +msgid "No Explanations found" +msgstr "" + +#: src/Explanations/Explanations.php:100 +msgid "No Explanations found in trash" +msgstr "" + +#. translators: Number of pending explanation posts +#: src/Explanations/Explanations.php:191 +msgid "Explanations %s" +msgstr "" + +#: src/Explanations/Explanations.php:238 +msgid "Status:" +msgstr "" + +#: src/Explanations/Explanations.php:249 +msgid "Last Modified:" +msgstr "" + +#: src/Explanations/Explanations.php:278 +msgid "Associated with: " +msgstr "" + +#: src/Explanations/Explanations.php:330 +msgid "Explanation Editor" +msgstr "" + +#: src/Explanations/Explanations.php:421 src/Explanations/Explanations.php:454 +msgid "Add Explanation" +msgstr "" + +#: src/Explanations/Explanations.php:446 +msgid "Unpublish" +msgstr "" + +#: src/Explanations/Explanations.php:451 src/Explanations/Explanations.php:484 +msgid "None" +msgstr "" + +#: src/Explanations/Explanations.php:474 src/Explanations/Explanations.php:526 +msgid "Draft" +msgstr "" + +#: src/Explanations/Explanations.php:477 src/Explanations/Explanations.php:527 +msgid "Pending Review" +msgstr "" + +#: src/Explanations/Explanations.php:480 src/Explanations/Explanations.php:528 +msgid "Published" +msgstr "" + +#: src/Explanations/Explanations.php:546 +msgid "Explanation already exists." +msgstr "" + +#: src/Explanations/Explanations.php:565 +msgid "Explanation could not be created." +msgstr "" + +#: src/Explanations/Explanations.php:591 +msgid "Explanation could not be un-published." +msgstr "" + +#: src/Explanations/Explanations.php:614 +msgid "Has explanation?" +msgstr "" + +#: src/Explanations/Explanations.php:615 +msgid "Explanation?" +msgstr "" + +#: src/Explanations/Explanations.php:638 +msgid "Post has an explanation." +msgstr "" + +#: src/Importer/Importer.php:307 msgid "Functions Reference" msgstr "Functions Reference" -#: lib/class-importer.php:296 +#: src/Importer/Importer.php:311 msgid "Hooks Reference" msgstr "Hooks Reference" -#: lib/class-plugin.php:135 lib/class-plugin.php:137 lib/class-plugin.php:139 -#: lib/class-plugin.php:149 src/api-functions.php:22 -msgid "Functions" +#: src/Importer/Relationships.php:97 src/Importer/Relationships.php:157 +#, fuzzy +msgid "Uses Functions" +msgstr "Functions" + +#: src/Importer/Relationships.php:98 src/Importer/Relationships.php:117 +#: src/Importer/Relationships.php:136 +#, fuzzy +msgid "Used by Functions" msgstr "Functions" -#: lib/class-plugin.php:138 +#: src/Importer/Relationships.php:116 src/Importer/Relationships.php:177 +#, fuzzy +msgid "Uses Methods" +msgstr "Methods" + +#: src/Importer/Relationships.php:135 src/Importer/Relationships.php:197 +#, fuzzy +msgid "Uses Hooks" +msgstr "Hooks" + +#: src/Importer/Relationships.php:158 src/Importer/Relationships.php:178 +#: src/Importer/Relationships.php:196 +#, fuzzy +msgid "Used by Methods" +msgstr "Methods" + +#: src/ParsedContent.php:83 +msgid "Parsed Content" +msgstr "" + +#: src/ParsedContent.php:112 +msgid "Parsed Summary:" +msgstr "" + +#: src/ParsedContent.php:121 src/ParsedContent.php:148 +msgid "Translated Summary:" +msgstr "" + +#: src/ParsedContent.php:139 +msgid "Parsed Description:" +msgstr "" + +#: src/ParsedContent.php:166 +msgid "Tags (args, return)" +msgstr "" + +#. translators: the type +#: src/ParsedContent.php:178 src/ParsedContent.php:224 +msgid "(%s)" +msgstr "" + +#. translators: the arg name +#: src/ParsedContent.php:198 +msgid "%s (Translated)" +msgstr "" + +#: src/ParsedContent.php:221 +msgid "Parsed Return:" +msgstr "" + +#: src/ParsedContent.php:237 +msgid "Translated Return:" +msgstr "" + +#: src/Registrations.php:133 #, fuzzy msgid "Function" msgstr "Functions" -#: lib/class-plugin.php:140 +#: src/Registrations.php:135 #, fuzzy msgid "New Function" msgstr "Functions" -#: lib/class-plugin.php:141 lib/class-plugin.php:173 lib/class-plugin.php:205 -#: lib/class-plugin.php:237 lib/class-plugin.php:272 +#: src/Registrations.php:136 src/Registrations.php:166 +#: src/Registrations.php:196 src/Registrations.php:226 +#: src/Registrations.php:259 msgid "Add New" msgstr "" -#: lib/class-plugin.php:142 +#: src/Registrations.php:137 #, fuzzy msgid "Add New Function" msgstr "Functions" -#: lib/class-plugin.php:143 +#: src/Registrations.php:138 #, fuzzy msgid "Edit Function" msgstr "Functions" -#: lib/class-plugin.php:144 +#: src/Registrations.php:139 #, fuzzy msgid "View Function" msgstr "Functions" -#: lib/class-plugin.php:145 +#: src/Registrations.php:140 #, fuzzy msgid "Search Functions" msgstr "Functions" -#: lib/class-plugin.php:146 +#: src/Registrations.php:141 #, fuzzy msgid "No Functions found" msgstr "Functions" -#: lib/class-plugin.php:147 +#: src/Registrations.php:142 msgid "No Functions found in trash" msgstr "" -#: lib/class-plugin.php:148 +#: src/Registrations.php:143 #, fuzzy msgid "Parent Function" msgstr "Functions" -#: lib/class-plugin.php:167 lib/class-plugin.php:169 lib/class-plugin.php:171 -#: lib/class-plugin.php:181 src/api-functions.php:24 -msgid "Methods" -msgstr "Methods" - -#: lib/class-plugin.php:170 +#: src/Registrations.php:163 #, fuzzy msgid "Method" msgstr "Methods" -#: lib/class-plugin.php:172 +#: src/Registrations.php:165 #, fuzzy msgid "New Method" msgstr "Methods" -#: lib/class-plugin.php:174 +#: src/Registrations.php:167 msgid "Add New Method" msgstr "" -#: lib/class-plugin.php:175 +#: src/Registrations.php:168 #, fuzzy msgid "Edit Method" msgstr "Methods" -#: lib/class-plugin.php:176 +#: src/Registrations.php:169 #, fuzzy msgid "View Method" msgstr "Methods" -#: lib/class-plugin.php:177 +#: src/Registrations.php:170 #, fuzzy msgid "Search Methods" msgstr "Methods" -#: lib/class-plugin.php:178 +#: src/Registrations.php:171 #, fuzzy msgid "No Methods found" msgstr "Methods" -#: lib/class-plugin.php:179 +#: src/Registrations.php:172 msgid "No Methods found in trash" msgstr "" -#: lib/class-plugin.php:180 +#: src/Registrations.php:173 #, fuzzy msgid "Parent Method" msgstr "Methods" -#: lib/class-plugin.php:199 lib/class-plugin.php:201 lib/class-plugin.php:203 -#: lib/class-plugin.php:213 src/api-functions.php:21 -msgid "Classes" -msgstr "Classes" - -#: lib/class-plugin.php:202 +#: src/Registrations.php:193 #, fuzzy msgid "Class" msgstr "Classes" -#: lib/class-plugin.php:204 +#: src/Registrations.php:195 #, fuzzy msgid "New Class" msgstr "Classes" -#: lib/class-plugin.php:206 +#: src/Registrations.php:197 msgid "Add New Class" msgstr "" -#: lib/class-plugin.php:207 +#: src/Registrations.php:198 msgid "Edit Class" msgstr "" -#: lib/class-plugin.php:208 +#: src/Registrations.php:199 msgid "View Class" msgstr "" -#: lib/class-plugin.php:209 +#: src/Registrations.php:200 #, fuzzy msgid "Search Classes" msgstr "Classes" -#: lib/class-plugin.php:210 +#: src/Registrations.php:201 #, fuzzy msgid "No Classes found" msgstr "Classes" -#: lib/class-plugin.php:211 +#: src/Registrations.php:202 msgid "No Classes found in trash" msgstr "" -#: lib/class-plugin.php:212 +#: src/Registrations.php:203 msgid "Parent Class" msgstr "" -#: lib/class-plugin.php:231 lib/class-plugin.php:233 lib/class-plugin.php:235 -#: lib/class-plugin.php:245 src/api-functions.php:23 -msgid "Hooks" -msgstr "Hooks" - -#: lib/class-plugin.php:234 +#: src/Registrations.php:223 #, fuzzy msgid "Hook" msgstr "Hooks" -#: lib/class-plugin.php:236 +#: src/Registrations.php:225 #, fuzzy msgid "New Hook" msgstr "Hooks" -#: lib/class-plugin.php:238 +#: src/Registrations.php:227 msgid "Add New Hook" msgstr "" -#: lib/class-plugin.php:239 +#: src/Registrations.php:228 msgid "Edit Hook" msgstr "" -#: lib/class-plugin.php:240 +#: src/Registrations.php:229 msgid "View Hook" msgstr "" -#: lib/class-plugin.php:241 +#: src/Registrations.php:230 msgid "Search Hooks" msgstr "" -#: lib/class-plugin.php:242 +#: src/Registrations.php:231 msgid "No Hooks found" msgstr "" -#: lib/class-plugin.php:243 +#: src/Registrations.php:232 msgid "No Hooks found in trash" msgstr "" -#: lib/class-plugin.php:244 +#: src/Registrations.php:233 msgid "Parent Hook" msgstr "" -#: lib/class-plugin.php:266 lib/class-plugin.php:268 lib/class-plugin.php:270 -#: lib/class-plugin.php:279 +#: src/Registrations.php:253 src/Registrations.php:255 +#: src/Registrations.php:257 src/Registrations.php:266 msgid "Reference Landing Pages" msgstr "" -#: lib/class-plugin.php:269 +#: src/Registrations.php:256 msgid "Reference Landing Page" msgstr "" -#: lib/class-plugin.php:271 +#: src/Registrations.php:258 msgid "New Reference Landing Page" msgstr "" -#: lib/class-plugin.php:273 +#: src/Registrations.php:260 msgid "Add New Reference Landing Page" msgstr "" -#: lib/class-plugin.php:274 +#: src/Registrations.php:261 msgid "Edit Reference Landing Page" msgstr "" -#: lib/class-plugin.php:275 +#: src/Registrations.php:262 msgid "View Reference Landing Page" msgstr "" -#: lib/class-plugin.php:276 +#: src/Registrations.php:263 msgid "Search Reference Landing Pages" msgstr "" -#: lib/class-plugin.php:277 +#: src/Registrations.php:264 msgid "No Pages found" msgstr "" -#: lib/class-plugin.php:278 +#: src/Registrations.php:265 msgid "No Pages found in trash" msgstr "" -#: lib/class-plugin.php:328 lib/class-plugin.php:330 lib/class-plugin.php:344 +#: src/Registrations.php:301 src/Registrations.php:303 +#: src/Registrations.php:317 msgid "Files" msgstr "" -#: lib/class-plugin.php:331 +#: src/Registrations.php:304 msgctxt "taxonomy general name" msgid "File" msgstr "" -#: lib/class-plugin.php:332 +#: src/Registrations.php:305 msgid "Search Files" msgstr "" -#: lib/class-plugin.php:334 +#: src/Registrations.php:307 msgid "All Files" msgstr "" -#: lib/class-plugin.php:335 +#: src/Registrations.php:308 msgid "Parent File" msgstr "" -#: lib/class-plugin.php:336 +#: src/Registrations.php:309 msgid "Parent File:" msgstr "" -#: lib/class-plugin.php:337 +#: src/Registrations.php:310 msgid "Edit File" msgstr "" -#: lib/class-plugin.php:338 +#: src/Registrations.php:311 msgid "Update File" msgstr "" -#: lib/class-plugin.php:339 lib/class-plugin.php:340 +#: src/Registrations.php:312 src/Registrations.php:313 msgid "New File" msgstr "" -#: lib/class-plugin.php:341 +#: src/Registrations.php:314 msgid "Files separated by comma" msgstr "" -#: lib/class-plugin.php:342 +#: src/Registrations.php:315 msgid "Add or remove Files" msgstr "" -#: lib/class-plugin.php:343 +#: src/Registrations.php:316 msgid "Choose from the most used Files" msgstr "" -#: lib/class-plugin.php:388 +#: src/Registrations.php:357 msgid "@since" msgstr "" -#: lib/class-plugin.php:408 +#: src/Registrations.php:375 msgid "Namespaces" msgstr "Namespaces" -#: lib/class-plugin.php:424 +#: src/Registrations.php:389 msgid "Source Type" msgstr "" -#: lib/class-plugin.php:441 lib/class-plugin.php:531 +#: src/Registrations.php:405 src/Registrations.php:500 msgid "Plugin" msgstr "Plugin" -#: lib/class-plugin.php:449 lib/class-plugin.php:535 +#: src/Registrations.php:413 src/Registrations.php:504 msgid "Theme" msgstr "Theme" -#: lib/class-plugin.php:457 lib/class-plugin.php:539 +#: src/Registrations.php:421 src/Registrations.php:508 msgid "Composer Package" msgstr "Composer Package" -#: lib/class-plugin.php:470 +#: src/Registrations.php:433 msgid "Role" msgstr "" -#: lib/class-plugin.php:485 +#: src/Registrations.php:447 msgid "Display" msgstr "Display" -#: lib/class-plugin.php:486 +#: src/Registrations.php:448 msgid "Condition" msgstr "Condition" -#: lib/class-plugin.php:487 +#: src/Registrations.php:449 msgid "Utility" msgstr "Utility" -#: lib/class-plugin.php:488 +#: src/Registrations.php:450 msgid "Setter" msgstr "Setter" -#: lib/class-plugin.php:489 +#: src/Registrations.php:451 msgid "Getter" msgstr "Getter" -#: lib/class-plugin.php:677 +#: src/Registrations.php:657 msgctxt "separator" msgid " or " msgstr "" - -#: lib/class-relationships.php:90 lib/class-relationships.php:150 -#, fuzzy -msgid "Uses Functions" -msgstr "Functions" - -#: lib/class-relationships.php:91 lib/class-relationships.php:110 -#: lib/class-relationships.php:129 -#, fuzzy -msgid "Used by Functions" -msgstr "Functions" - -#: lib/class-relationships.php:109 lib/class-relationships.php:170 -#, fuzzy -msgid "Uses Methods" -msgstr "Methods" - -#: lib/class-relationships.php:128 lib/class-relationships.php:190 -#, fuzzy -msgid "Uses Hooks" -msgstr "Hooks" - -#: lib/class-relationships.php:151 lib/class-relationships.php:171 -#: lib/class-relationships.php:189 -#, fuzzy -msgid "Used by Methods" -msgstr "Methods" - -#: src/Admin.php:112 -msgid "Reset votes (%d)" -msgstr "" - -#: src/Explanations.php:91 src/Explanations.php:93 -msgid "Explanations" -msgstr "" - -#: src/Explanations.php:92 src/Explanations.php:231 -msgid "Explanation" -msgstr "" - -#: src/Explanations.php:94 src/Explanations.php:418 src/Explanations.php:419 -#: src/Explanations.php:448 src/Explanations.php:528 -msgid "Edit Explanation" -msgstr "" - -#: src/Explanations.php:95 -msgid "View Explanation" -msgstr "" - -#: src/Explanations.php:96 -msgid "Search Explanations" -msgstr "" - -#: src/Explanations.php:97 -msgid "No Explanations found" -msgstr "" - -#: src/Explanations.php:98 -msgid "No Explanations found in trash" -msgstr "" - -#: src/Explanations.php:189 -msgid "Explanations %s" -msgstr "" - -#: src/Explanations.php:237 -msgid "Status:" -msgstr "" - -#: src/Explanations.php:248 -msgid "Last Modified:" -msgstr "" - -#: src/Explanations.php:278 -msgid "Associated with: " -msgstr "" - -#: src/Explanations.php:331 -msgid "Explanation Editor" -msgstr "" - -#: src/Explanations.php:426 src/Explanations.php:460 -msgid "Add Explanation" -msgstr "" - -#: src/Explanations.php:452 -msgid "Unpublish" -msgstr "" - -#: src/Explanations.php:457 src/Explanations.php:492 -msgid "None" -msgstr "" - -#: src/Explanations.php:482 src/Explanations.php:530 -msgid "Draft" -msgstr "" - -#: src/Explanations.php:485 src/Explanations.php:531 -msgid "Pending Review" -msgstr "" - -#: src/Explanations.php:488 src/Explanations.php:532 -msgid "Published" -msgstr "" - -#: src/Explanations.php:550 -msgid "Explanation already exists." -msgstr "" - -#: src/Explanations.php:569 -msgid "Explanation could not be created." -msgstr "" - -#: src/Explanations.php:595 -msgid "Explanation could not be un-published." -msgstr "" - -#: src/Explanations.php:620 -msgid "Has explanation?" -msgstr "" - -#: src/Explanations.php:621 -msgid "Explanation?" -msgstr "" - -#: src/Explanations.php:645 -msgid "Post has an explanation." -msgstr "" - -#: src/ParsedContent.php:68 -msgid "Parsed Content" -msgstr "" - -#: src/ParsedContent.php:89 -msgid "Core Trac" -msgstr "" - -#: src/ParsedContent.php:90 -msgid "A valid, open ticket from %s is required to edit parsed content." -msgstr "" - -#: src/ParsedContent.php:98 -msgid "Parsed Summary:" -msgstr "" - -#: src/ParsedContent.php:107 -msgid "Parsed Description:" -msgstr "" - -#: src/ParsedContent.php:127 -msgid "Trac Ticket Number:" -msgstr "" - -#: src/ParsedContent.php:132 -msgid "Attach a Core Trac ticket" -msgstr "" - -#: src/ParsedContent.php:133 -msgid "Attach Ticket" -msgstr "" - -#: src/ParsedContent.php:135 -msgid "Detach the Trac ticket" -msgstr "" - -#: src/ParsedContent.php:136 -msgid "Detach Ticket" -msgstr "" - -#: src/ParsedContent.php:183 -msgid "Searching ..." -msgstr "" - -#: src/ParsedContent.php:184 -msgid "Invalid ticket number, please try again." -msgstr "" - -#: src/ParsedContent.php:238 -msgid "Invalid ticket number." -msgstr "" - -#: src/ParsedContent.php:263 -msgid "Ticket detached." -msgstr "" - -#: src/ParsedContent.php:269 -msgid "Ticket still attached." -msgstr "" diff --git a/languages/wp-parser-ja.mo b/languages/wp-parser-ja.mo index a31836ac3612abbc2906670dd4aad8bb96506c08..fd726e11a2dd3270c6c99044c8c3aa16d61839a3 100644 GIT binary patch delta 21 ccmZoMX))PQ%*SD95@Kj(Wo)#$ny-@^07v@\n" "Language-Team: LANGUAGE \n" @@ -42,501 +42,479 @@ msgstr "" msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" msgstr "https://github.com/aivec/phpdoc-parser/graphs/contributors" -#: lib/class-importer.php:292 +#: src/api-functions.php:21 src/Registrations.php:190 src/Registrations.php:192 +#: src/Registrations.php:194 src/Registrations.php:204 +msgid "Classes" +msgstr "クラス" + +#: src/api-functions.php:22 src/Registrations.php:130 src/Registrations.php:132 +#: src/Registrations.php:134 src/Registrations.php:144 +msgid "Functions" +msgstr "ファンクション" + +#: src/api-functions.php:23 src/Registrations.php:220 src/Registrations.php:222 +#: src/Registrations.php:224 src/Registrations.php:234 +msgid "Hooks" +msgstr "フック" + +#: src/api-functions.php:24 src/Registrations.php:160 src/Registrations.php:162 +#: src/Registrations.php:164 src/Registrations.php:174 +msgid "Methods" +msgstr "関数" + +#: src/Explanations/Explanations.php:93 src/Explanations/Explanations.php:95 +msgid "Explanations" +msgstr "説明文" + +#: src/Explanations/Explanations.php:94 src/Explanations/Explanations.php:232 +msgid "Explanation" +msgstr "説明文" + +#: src/Explanations/Explanations.php:96 src/Explanations/Explanations.php:413 +#: src/Explanations/Explanations.php:414 src/Explanations/Explanations.php:442 +#: src/Explanations/Explanations.php:524 +msgid "Edit Explanation" +msgstr "説明文を編集" + +#: src/Explanations/Explanations.php:97 +msgid "View Explanation" +msgstr "説明文を見る" + +#: src/Explanations/Explanations.php:98 +msgid "Search Explanations" +msgstr "説明文を検索" + +#: src/Explanations/Explanations.php:99 +msgid "No Explanations found" +msgstr "説明文の結果がありません" + +#: src/Explanations/Explanations.php:100 +msgid "No Explanations found in trash" +msgstr "ゴミ箱の中に説明文がありません" + +#. translators: Number of pending explanation posts +#: src/Explanations/Explanations.php:191 +msgid "Explanations %s" +msgstr "説明: %s" + +#: src/Explanations/Explanations.php:238 +msgid "Status:" +msgstr "ステータス:" + +#: src/Explanations/Explanations.php:249 +msgid "Last Modified:" +msgstr "更新日時:" + +#: src/Explanations/Explanations.php:278 +msgid "Associated with: " +msgstr "関連資料: " + +#: src/Explanations/Explanations.php:330 +msgid "Explanation Editor" +msgstr "説明文エディター" + +#: src/Explanations/Explanations.php:421 src/Explanations/Explanations.php:454 +msgid "Add Explanation" +msgstr "説明文を新規追加" + +#: src/Explanations/Explanations.php:446 +msgid "Unpublish" +msgstr "非公開" + +#: src/Explanations/Explanations.php:451 src/Explanations/Explanations.php:484 +msgid "None" +msgstr "なし" + +#: src/Explanations/Explanations.php:474 src/Explanations/Explanations.php:526 +msgid "Draft" +msgstr "" + +#: src/Explanations/Explanations.php:477 src/Explanations/Explanations.php:527 +msgid "Pending Review" +msgstr "" + +#: src/Explanations/Explanations.php:480 src/Explanations/Explanations.php:528 +msgid "Published" +msgstr "公開済み" + +#: src/Explanations/Explanations.php:546 +msgid "Explanation already exists." +msgstr "" + +#: src/Explanations/Explanations.php:565 +msgid "Explanation could not be created." +msgstr "" + +#: src/Explanations/Explanations.php:591 +msgid "Explanation could not be un-published." +msgstr "" + +#: src/Explanations/Explanations.php:614 +msgid "Has explanation?" +msgstr "" + +#: src/Explanations/Explanations.php:615 +msgid "Explanation?" +msgstr "" + +#: src/Explanations/Explanations.php:638 +msgid "Post has an explanation." +msgstr "" + +#: src/Importer/Importer.php:307 msgid "Functions Reference" msgstr "ファンクション・レファレンス" -#: lib/class-importer.php:296 +#: src/Importer/Importer.php:311 msgid "Hooks Reference" msgstr "フック・レファレンス" -#: lib/class-plugin.php:135 lib/class-plugin.php:137 lib/class-plugin.php:139 -#: lib/class-plugin.php:149 src/api-functions.php:22 -msgid "Functions" -msgstr "ファンクション" +#: src/Importer/Relationships.php:97 src/Importer/Relationships.php:157 +msgid "Uses Functions" +msgstr "利用しているファンクション" + +#: src/Importer/Relationships.php:98 src/Importer/Relationships.php:117 +#: src/Importer/Relationships.php:136 +msgid "Used by Functions" +msgstr "利用されているファンクション" -#: lib/class-plugin.php:138 +#: src/Importer/Relationships.php:116 src/Importer/Relationships.php:177 +msgid "Uses Methods" +msgstr "利用している関数" + +#: src/Importer/Relationships.php:135 src/Importer/Relationships.php:197 +msgid "Uses Hooks" +msgstr "利用しているフック" + +#: src/Importer/Relationships.php:158 src/Importer/Relationships.php:178 +#: src/Importer/Relationships.php:196 +msgid "Used by Methods" +msgstr "利用されている関数" + +#: src/ParsedContent.php:83 +msgid "Parsed Content" +msgstr "" + +#: src/ParsedContent.php:112 +msgid "Parsed Summary:" +msgstr "" + +#: src/ParsedContent.php:121 src/ParsedContent.php:148 +msgid "Translated Summary:" +msgstr "" + +#: src/ParsedContent.php:139 +msgid "Parsed Description:" +msgstr "" + +#: src/ParsedContent.php:166 +msgid "Tags (args, return)" +msgstr "" + +#. translators: the type +#: src/ParsedContent.php:178 src/ParsedContent.php:224 +msgid "(%s)" +msgstr "" + +#. translators: the arg name +#: src/ParsedContent.php:198 +msgid "%s (Translated)" +msgstr "" + +#: src/ParsedContent.php:221 +msgid "Parsed Return:" +msgstr "" + +#: src/ParsedContent.php:237 +msgid "Translated Return:" +msgstr "" + +#: src/Registrations.php:133 msgid "Function" msgstr "ファンクション" -#: lib/class-plugin.php:140 +#: src/Registrations.php:135 msgid "New Function" msgstr "ファンクションを新規追加" -#: lib/class-plugin.php:141 lib/class-plugin.php:173 lib/class-plugin.php:205 -#: lib/class-plugin.php:237 lib/class-plugin.php:272 +#: src/Registrations.php:136 src/Registrations.php:166 +#: src/Registrations.php:196 src/Registrations.php:226 +#: src/Registrations.php:259 msgid "Add New" msgstr "新規追加" -#: lib/class-plugin.php:142 +#: src/Registrations.php:137 msgid "Add New Function" msgstr "ファンクションを新規追加" -#: lib/class-plugin.php:143 +#: src/Registrations.php:138 msgid "Edit Function" msgstr "ファンクションを編集" -#: lib/class-plugin.php:144 +#: src/Registrations.php:139 msgid "View Function" msgstr "ファンクションを見る" -#: lib/class-plugin.php:145 +#: src/Registrations.php:140 msgid "Search Functions" msgstr "ファンクションを検索" -#: lib/class-plugin.php:146 +#: src/Registrations.php:141 msgid "No Functions found" msgstr "ファンクションの結果がありません" -#: lib/class-plugin.php:147 +#: src/Registrations.php:142 msgid "No Functions found in trash" msgstr "ゴミ箱の中にファンクションがありません" -#: lib/class-plugin.php:148 +#: src/Registrations.php:143 msgid "Parent Function" msgstr "親ファンクション" -#: lib/class-plugin.php:167 lib/class-plugin.php:169 lib/class-plugin.php:171 -#: lib/class-plugin.php:181 src/api-functions.php:24 -msgid "Methods" -msgstr "関数" - -#: lib/class-plugin.php:170 +#: src/Registrations.php:163 msgid "Method" msgstr "関数" -#: lib/class-plugin.php:172 +#: src/Registrations.php:165 msgid "New Method" msgstr "関数を新規追加" -#: lib/class-plugin.php:174 +#: src/Registrations.php:167 msgid "Add New Method" msgstr "関数を新規追加" -#: lib/class-plugin.php:175 +#: src/Registrations.php:168 msgid "Edit Method" msgstr "関数を編集" -#: lib/class-plugin.php:176 +#: src/Registrations.php:169 msgid "View Method" msgstr "関数を見る" -#: lib/class-plugin.php:177 +#: src/Registrations.php:170 msgid "Search Methods" msgstr "関数を検索" -#: lib/class-plugin.php:178 +#: src/Registrations.php:171 msgid "No Methods found" msgstr "関数の結果がありません" -#: lib/class-plugin.php:179 +#: src/Registrations.php:172 msgid "No Methods found in trash" msgstr "ゴミ箱の中に関数がありません" -#: lib/class-plugin.php:180 +#: src/Registrations.php:173 msgid "Parent Method" msgstr "親関数" -#: lib/class-plugin.php:199 lib/class-plugin.php:201 lib/class-plugin.php:203 -#: lib/class-plugin.php:213 src/api-functions.php:21 -msgid "Classes" -msgstr "クラス" - -#: lib/class-plugin.php:202 +#: src/Registrations.php:193 msgid "Class" msgstr "クラス" -#: lib/class-plugin.php:204 +#: src/Registrations.php:195 msgid "New Class" msgstr "クラスを新規追加" -#: lib/class-plugin.php:206 +#: src/Registrations.php:197 msgid "Add New Class" msgstr "クラスを新規追加" -#: lib/class-plugin.php:207 +#: src/Registrations.php:198 msgid "Edit Class" msgstr "クラスを編集" -#: lib/class-plugin.php:208 +#: src/Registrations.php:199 msgid "View Class" msgstr "クラスを見る" -#: lib/class-plugin.php:209 +#: src/Registrations.php:200 msgid "Search Classes" msgstr "クラスを検索" -#: lib/class-plugin.php:210 +#: src/Registrations.php:201 msgid "No Classes found" msgstr "クラスの結果がありません" -#: lib/class-plugin.php:211 +#: src/Registrations.php:202 msgid "No Classes found in trash" msgstr "ゴミ箱の中にクラスがありません" -#: lib/class-plugin.php:212 +#: src/Registrations.php:203 msgid "Parent Class" msgstr "親クラス" -#: lib/class-plugin.php:231 lib/class-plugin.php:233 lib/class-plugin.php:235 -#: lib/class-plugin.php:245 src/api-functions.php:23 -msgid "Hooks" -msgstr "フック" - -#: lib/class-plugin.php:234 +#: src/Registrations.php:223 msgid "Hook" msgstr "フック" -#: lib/class-plugin.php:236 +#: src/Registrations.php:225 msgid "New Hook" msgstr "フックを新規追加" -#: lib/class-plugin.php:238 +#: src/Registrations.php:227 msgid "Add New Hook" msgstr "フックを新規追加" -#: lib/class-plugin.php:239 +#: src/Registrations.php:228 msgid "Edit Hook" msgstr "フックを編集" -#: lib/class-plugin.php:240 +#: src/Registrations.php:229 msgid "View Hook" msgstr "フックを見る" -#: lib/class-plugin.php:241 +#: src/Registrations.php:230 msgid "Search Hooks" msgstr "フックを検索" -#: lib/class-plugin.php:242 +#: src/Registrations.php:231 msgid "No Hooks found" msgstr "フックの結果がありません" -#: lib/class-plugin.php:243 +#: src/Registrations.php:232 msgid "No Hooks found in trash" msgstr "ゴミ箱の中にフックがありません" -#: lib/class-plugin.php:244 +#: src/Registrations.php:233 msgid "Parent Hook" msgstr "親フック" -#: lib/class-plugin.php:266 lib/class-plugin.php:268 lib/class-plugin.php:270 -#: lib/class-plugin.php:279 +#: src/Registrations.php:253 src/Registrations.php:255 +#: src/Registrations.php:257 src/Registrations.php:266 msgid "Reference Landing Pages" msgstr "レファレンスのランディングページ" -#: lib/class-plugin.php:269 +#: src/Registrations.php:256 msgid "Reference Landing Page" msgstr "レファレンスのランディングページ" -#: lib/class-plugin.php:271 +#: src/Registrations.php:258 msgid "New Reference Landing Page" msgstr "レファレンスのランディングページを新規追加" -#: lib/class-plugin.php:273 +#: src/Registrations.php:260 msgid "Add New Reference Landing Page" msgstr "レファレンスのランディングページを新規追加" -#: lib/class-plugin.php:274 +#: src/Registrations.php:261 msgid "Edit Reference Landing Page" msgstr "レファレンスのランディングページを編集" -#: lib/class-plugin.php:275 +#: src/Registrations.php:262 msgid "View Reference Landing Page" msgstr "レファレンスのランディングページを見る" -#: lib/class-plugin.php:276 +#: src/Registrations.php:263 msgid "Search Reference Landing Pages" msgstr "レファレンスのランディングページを検索" -#: lib/class-plugin.php:277 +#: src/Registrations.php:264 msgid "No Pages found" msgstr "レファレンスのランディングページの結果がありません" -#: lib/class-plugin.php:278 +#: src/Registrations.php:265 msgid "No Pages found in trash" msgstr "ゴミ箱の中にレファレンスのランディングページがありません" -#: lib/class-plugin.php:328 lib/class-plugin.php:330 lib/class-plugin.php:344 +#: src/Registrations.php:301 src/Registrations.php:303 +#: src/Registrations.php:317 msgid "Files" msgstr "ファイル" -#: lib/class-plugin.php:331 +#: src/Registrations.php:304 msgctxt "taxonomy general name" msgid "File" msgstr "ファイル" -#: lib/class-plugin.php:332 +#: src/Registrations.php:305 msgid "Search Files" msgstr "ファイルを検索" -#: lib/class-plugin.php:334 +#: src/Registrations.php:307 msgid "All Files" msgstr "全てのファイル" -#: lib/class-plugin.php:335 +#: src/Registrations.php:308 msgid "Parent File" msgstr "親ファイル" -#: lib/class-plugin.php:336 +#: src/Registrations.php:309 msgid "Parent File:" msgstr "親ファイル:" -#: lib/class-plugin.php:337 +#: src/Registrations.php:310 msgid "Edit File" msgstr "ファイルを編集" -#: lib/class-plugin.php:338 +#: src/Registrations.php:311 msgid "Update File" msgstr "ファイルを更新" -#: lib/class-plugin.php:339 lib/class-plugin.php:340 +#: src/Registrations.php:312 src/Registrations.php:313 msgid "New File" msgstr "ファイルを新規追加" -#: lib/class-plugin.php:341 +#: src/Registrations.php:314 msgid "Files separated by comma" msgstr "コンマで区切られているファイル" -#: lib/class-plugin.php:342 +#: src/Registrations.php:315 msgid "Add or remove Files" msgstr "ファイルを新規追加・削除する" -#: lib/class-plugin.php:343 +#: src/Registrations.php:316 msgid "Choose from the most used Files" msgstr "よく使われているファイルから選択" -#: lib/class-plugin.php:388 +#: src/Registrations.php:357 msgid "@since" msgstr "@since" -#: lib/class-plugin.php:408 +#: src/Registrations.php:375 msgid "Namespaces" msgstr "ネームスペース" -#: lib/class-plugin.php:424 +#: src/Registrations.php:389 msgid "Source Type" msgstr "ソースタイプ" -#: lib/class-plugin.php:441 lib/class-plugin.php:531 +#: src/Registrations.php:405 src/Registrations.php:500 msgid "Plugin" msgstr "プラグイン" -#: lib/class-plugin.php:449 lib/class-plugin.php:535 +#: src/Registrations.php:413 src/Registrations.php:504 msgid "Theme" msgstr "テーマ" -#: lib/class-plugin.php:457 lib/class-plugin.php:539 +#: src/Registrations.php:421 src/Registrations.php:508 msgid "Composer Package" msgstr "Composerパッケージ" -#: lib/class-plugin.php:470 +#: src/Registrations.php:433 msgid "Role" msgstr "区分" -#: lib/class-plugin.php:485 +#: src/Registrations.php:447 msgid "Display" msgstr "表示系" -#: lib/class-plugin.php:486 +#: src/Registrations.php:448 msgid "Condition" msgstr "条件判断" -#: lib/class-plugin.php:487 +#: src/Registrations.php:449 msgid "Utility" msgstr "ユーティリティー" -#: lib/class-plugin.php:488 +#: src/Registrations.php:450 msgid "Setter" msgstr "データセット" -#: lib/class-plugin.php:489 +#: src/Registrations.php:451 msgid "Getter" msgstr "デート取得" -#: lib/class-plugin.php:677 +#: src/Registrations.php:657 msgctxt "separator" msgid " or " msgstr "" - -#: lib/class-relationships.php:90 lib/class-relationships.php:150 -msgid "Uses Functions" -msgstr "利用しているファンクション" - -#: lib/class-relationships.php:91 lib/class-relationships.php:110 -#: lib/class-relationships.php:129 -msgid "Used by Functions" -msgstr "利用されているファンクション" - -#: lib/class-relationships.php:109 lib/class-relationships.php:170 -msgid "Uses Methods" -msgstr "利用している関数" - -#: lib/class-relationships.php:128 lib/class-relationships.php:190 -msgid "Uses Hooks" -msgstr "利用しているフック" - -#: lib/class-relationships.php:151 lib/class-relationships.php:171 -#: lib/class-relationships.php:189 -msgid "Used by Methods" -msgstr "利用されている関数" - -#: src/Admin.php:112 -msgid "Reset votes (%d)" -msgstr "" - -#: src/Explanations.php:91 src/Explanations.php:93 -msgid "Explanations" -msgstr "説明文" - -#: src/Explanations.php:92 src/Explanations.php:231 -msgid "Explanation" -msgstr "説明文" - -#: src/Explanations.php:94 src/Explanations.php:418 src/Explanations.php:419 -#: src/Explanations.php:448 src/Explanations.php:528 -msgid "Edit Explanation" -msgstr "説明文を編集" - -#: src/Explanations.php:95 -msgid "View Explanation" -msgstr "説明文を見る" - -#: src/Explanations.php:96 -msgid "Search Explanations" -msgstr "説明文を検索" - -#: src/Explanations.php:97 -msgid "No Explanations found" -msgstr "説明文の結果がありません" - -#: src/Explanations.php:98 -msgid "No Explanations found in trash" -msgstr "ゴミ箱の中に説明文がありません" - -#: src/Explanations.php:189 -msgid "Explanations %s" -msgstr "説明: %s" - -#: src/Explanations.php:237 -msgid "Status:" -msgstr "ステータス:" - -#: src/Explanations.php:248 -msgid "Last Modified:" -msgstr "更新日時:" - -#: src/Explanations.php:278 -msgid "Associated with: " -msgstr "関連資料: " - -#: src/Explanations.php:331 -msgid "Explanation Editor" -msgstr "説明文エディター" - -#: src/Explanations.php:426 src/Explanations.php:460 -msgid "Add Explanation" -msgstr "説明文を新規追加" - -#: src/Explanations.php:452 -msgid "Unpublish" -msgstr "非公開" - -#: src/Explanations.php:457 src/Explanations.php:492 -msgid "None" -msgstr "なし" - -#: src/Explanations.php:482 src/Explanations.php:530 -msgid "Draft" -msgstr "" - -#: src/Explanations.php:485 src/Explanations.php:531 -msgid "Pending Review" -msgstr "" - -#: src/Explanations.php:488 src/Explanations.php:532 -msgid "Published" -msgstr "公開済み" - -#: src/Explanations.php:550 -msgid "Explanation already exists." -msgstr "" - -#: src/Explanations.php:569 -msgid "Explanation could not be created." -msgstr "" - -#: src/Explanations.php:595 -msgid "Explanation could not be un-published." -msgstr "" - -#: src/Explanations.php:620 -msgid "Has explanation?" -msgstr "" - -#: src/Explanations.php:621 -msgid "Explanation?" -msgstr "" - -#: src/Explanations.php:645 -msgid "Post has an explanation." -msgstr "" - -#: src/ParsedContent.php:68 -msgid "Parsed Content" -msgstr "" - -#: src/ParsedContent.php:89 -msgid "Core Trac" -msgstr "" - -#: src/ParsedContent.php:90 -msgid "A valid, open ticket from %s is required to edit parsed content." -msgstr "" - -#: src/ParsedContent.php:98 -msgid "Parsed Summary:" -msgstr "" - -#: src/ParsedContent.php:107 -msgid "Parsed Description:" -msgstr "" - -#: src/ParsedContent.php:127 -msgid "Trac Ticket Number:" -msgstr "" - -#: src/ParsedContent.php:132 -msgid "Attach a Core Trac ticket" -msgstr "" - -#: src/ParsedContent.php:133 -msgid "Attach Ticket" -msgstr "" - -#: src/ParsedContent.php:135 -msgid "Detach the Trac ticket" -msgstr "" - -#: src/ParsedContent.php:136 -msgid "Detach Ticket" -msgstr "" - -#: src/ParsedContent.php:183 -msgid "Searching ..." -msgstr "" - -#: src/ParsedContent.php:184 -msgid "Invalid ticket number, please try again." -msgstr "" - -#: src/ParsedContent.php:238 -msgid "Invalid ticket number." -msgstr "" - -#: src/ParsedContent.php:263 -msgid "Ticket detached." -msgstr "" - -#: src/ParsedContent.php:269 -msgid "Ticket still attached." -msgstr "" diff --git a/src/CLI/Commands.php b/src/CLI/Commands.php index 6b9cc8d..038b7c2 100644 --- a/src/CLI/Commands.php +++ b/src/CLI/Commands.php @@ -7,6 +7,9 @@ use WP_CLI; use WP_CLI_Command; +// phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps +// phpcs:disable PSR2.Methods.MethodDeclaration.Underscore + /** * Converts PHPDoc markup into a template ready for import to a WordPress blog. */ diff --git a/src/Explanations/Explanations.php b/src/Explanations/Explanations.php index 74acbc6..64b9db0 100644 --- a/src/Explanations/Explanations.php +++ b/src/Explanations/Explanations.php @@ -186,7 +186,8 @@ public function adminMenu() { foreach ($menu as $i => $item) { if ($menu_slug == $item[2]) { // Modify it to include the pending count. - $menu[$i][0] = sprintf( // phpcs:ignore + $menu[$i][0] = sprintf( // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited + // translators: Number of pending explanation posts __('Explanations %s', 'wp-parser'), "" . number_format_i18n($count) . '' ); diff --git a/src/Importer/FileReflector.php b/src/Importer/FileReflector.php index 66c3012..66899cc 100644 --- a/src/Importer/FileReflector.php +++ b/src/Importer/FileReflector.php @@ -62,6 +62,7 @@ class FileReflector extends BaseFileReflector * so they can be assigned to the hooks to which they may belong. * * @param \PHPParser_Node $node + * @return void */ public function enterNode(\PHPParser_Node $node) { parent::enterNode($node); @@ -161,7 +162,7 @@ public function leaveNode(\PHPParser_Node $node) { /* * @var MethodCallReflector $method_call */ - $method_call->set_class($class); + $method_call->setClass($class); } } diff --git a/src/Importer/Importer.php b/src/Importer/Importer.php index 4d48912..07826d0 100644 --- a/src/Importer/Importer.php +++ b/src/Importer/Importer.php @@ -344,7 +344,7 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio return 'wp-includes/version.php' === $f['path']; }); if ($ver_file) { - $this->version = $this->import_version(reset($ver_file)); + $this->version = $this->importVersion(reset($ver_file)); } $root = ''; @@ -352,7 +352,7 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio $this->logger->info(sprintf('Processing file %1$s of %2$s "%3$s".', number_format_i18n($file_number), number_format_i18n($num_of_files), $file['path'])); $file_number++; - $this->import_file($file, $skip_sleep, $import_ignored_functions); + $this->importFile($file, $skip_sleep, $import_ignored_functions); if (empty($root) && (isset($file['root']) && $file['root'])) { $root = $file['root']; @@ -426,7 +426,7 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio * @param array $args * @return array|mixed|\WP_Error */ - protected function insert_term($term, $taxonomy, $args = []) { + protected function insertTerm($term, $taxonomy, $args = []) { $parent = isset($args['parent']) ? $args['parent'] : 0; if (isset($this->inserted_terms[$taxonomy][$term . $parent])) { @@ -450,8 +450,9 @@ protected function insert_term($term, $taxonomy, $args = []) { * @param array $file * @param bool $skip_sleep Optional; defaults to false. If true, the sleep() calls are skipped. * @param bool $import_ignored Optional; defaults to false. If true, functions and classes marked `@ignore` will be imported. + * @return void */ - public function import_file(array $file, $skip_sleep = false, $import_ignored = false) { + public function importFile(array $file, $skip_sleep = false, $import_ignored = false) { /* * Filter whether to proceed with importing a prospective file. * @@ -468,7 +469,7 @@ public function import_file(array $file, $skip_sleep = false, $import_ignored = // Maybe add this file to the file taxonomy $slug = sanitize_title(str_replace('/', '_', $file['path'])); - $term = $this->insert_term($file['path'], $this->taxonomy_file, ['slug' => $slug]); + $term = $this->insertTerm($file['path'], $this->taxonomy_file, ['slug' => $slug]); if (is_wp_error($term)) { $this->errors[] = sprintf('Problem creating file tax item "%1$s" for %2$s: %3$s', $slug, $file['path'], $term->get_error_message()); @@ -504,7 +505,7 @@ public function import_file(array $file, $skip_sleep = false, $import_ignored = $count = 0; foreach ($file['functions'] as $function) { - $this->import_function($function, 0, $import_ignored); + $this->importFunction($function, 0, $import_ignored); $count++; if (!$skip_sleep && 0 == $count % 10) { // TODO figure our why are we still doing this @@ -513,7 +514,7 @@ public function import_file(array $file, $skip_sleep = false, $import_ignored = } foreach ($file['classes'] as $class) { - $this->import_class($class, $import_ignored); + $this->importClass($class, $import_ignored); $count++; if (!$skip_sleep && 0 == $count % 10) { @@ -522,7 +523,7 @@ public function import_file(array $file, $skip_sleep = false, $import_ignored = } foreach ($file['hooks'] as $hook) { - $this->import_hook($hook, 0, $import_ignored); + $this->importHook($hook, 0, $import_ignored); $count++; if (!$skip_sleep && 0 == $count % 10) { @@ -537,14 +538,13 @@ public function import_file(array $file, $skip_sleep = false, $import_ignored = * @param array $data Function. * @param int $parent_post_id Optional; post ID of the parent (class or function) this item belongs to. Defaults to zero (no parent). * @param bool $import_ignored Optional; defaults to false. If true, functions marked `@ignore` will be imported. - * - * @return bool|int Post ID of this function, false if any failure. + * @return void */ - public function import_function(array $data, $parent_post_id = 0, $import_ignored = false) { - $function_id = $this->import_item($data, $parent_post_id, $import_ignored); + public function importFunction(array $data, $parent_post_id = 0, $import_ignored = false) { + $function_id = $this->importItem($data, $parent_post_id, $import_ignored); foreach ($data['hooks'] as $hook) { - $this->import_hook($hook, $function_id, $import_ignored); + $this->importHook($hook, $function_id, $import_ignored); } } @@ -556,7 +556,7 @@ public function import_function(array $data, $parent_post_id = 0, $import_ignore * @param bool $import_ignored Optional; defaults to false. If true, hooks marked `@ignore` will be imported. * @return bool|int Post ID of this hook, false if any failure. */ - public function import_hook(array $data, $parent_post_id = 0, $import_ignored = false) { + public function importHook(array $data, $parent_post_id = 0, $import_ignored = false) { /* * Filter whether to skip parsing duplicate hooks. * @@ -583,7 +583,7 @@ public function import_hook(array $data, $parent_post_id = 0, $import_ignored = } } - $hook_id = $this->import_item($data, $parent_post_id, $import_ignored, ['post_type' => $this->post_type_hook]); + $hook_id = $this->importItem($data, $parent_post_id, $import_ignored, ['post_type' => $this->post_type_hook]); if (!$hook_id) { return false; @@ -601,9 +601,9 @@ public function import_hook(array $data, $parent_post_id = 0, $import_ignored = * @param bool $import_ignored Optional; defaults to false. If true, functions marked `@ignore` will be imported. * @return bool|int Post ID of this function, false if any failure. */ - protected function import_class(array $data, $import_ignored = false) { + protected function importClass(array $data, $import_ignored = false) { // Insert this class - $class_id = $this->import_item($data, 0, $import_ignored, ['post_type' => $this->post_type_class]); + $class_id = $this->importItem($data, 0, $import_ignored, ['post_type' => $this->post_type_class]); if (!$class_id) { return false; @@ -634,7 +634,7 @@ protected function import_class(array $data, $import_ignored = false) { foreach ($data['methods'] as $method) { // Namespace method names with the class name $method['name'] = $data['name'] . '::' . $method['name']; - $this->import_method($method, $class_id, $import_ignored); + $this->importMethod($method, $class_id, $import_ignored); } return $class_id; @@ -650,9 +650,9 @@ protected function import_class(array $data, $import_ignored = false) { * marked `@ignore` will be imported. * @return bool|int Post ID of this function, false if any failure. */ - protected function import_method(array $data, $parent_post_id = 0, $import_ignored = false) { + protected function importMethod(array $data, $parent_post_id = 0, $import_ignored = false) { // Insert this method. - $method_id = $this->import_item($data, $parent_post_id, $import_ignored, ['post_type' => $this->post_type_method]); + $method_id = $this->importItem($data, $parent_post_id, $import_ignored, ['post_type' => $this->post_type_method]); if (!$method_id) { return false; @@ -667,7 +667,7 @@ protected function import_method(array $data, $parent_post_id = 0, $import_ignor // Now add the hooks. if (!empty($data['hooks'])) { foreach ($data['hooks'] as $hook) { - $this->import_hook($hook, $method_id, $import_ignored); + $this->importHook($hook, $method_id, $import_ignored); } } @@ -680,7 +680,7 @@ protected function import_method(array $data, $parent_post_id = 0, $import_ignor * @param array $data Data * @return string|false WordPress version number, or false if not known. */ - protected function import_version($data) { + protected function importVersion($data) { $version_path = $data['root'] . '/' . $data['path']; if (!is_readable($version_path)) { @@ -702,16 +702,15 @@ protected function import_version($data) { * Create a post for an item (a class or a function). * * Anything that needs to be dealt identically for functions or methods should go in this function. - * Anything more specific should go in either import_function() or import_class() as appropriate. + * Anything more specific should go in either importFunction() or importClass() as appropriate. * * @param array $data Data. * @param int $parent_post_id Optional; post ID of the parent (class or function) this item belongs to. Defaults to zero (no parent). * @param bool $import_ignored Optional; defaults to false. If true, functions or classes marked `@ignore` will be imported. * @param array $arg_overrides Optional; array of parameters that override the defaults passed to wp_update_post(). - * * @return bool|int Post ID of this item, false if any failure. */ - public function import_item(array $data, $parent_post_id = 0, $import_ignored = false, array $arg_overrides = []) { + public function importItem(array $data, $parent_post_id = 0, $import_ignored = false, array $arg_overrides = []) { /* * @var \wpdb $wpdb */ @@ -840,7 +839,7 @@ public function import_item(array $data, $parent_post_id = 0, $import_ignored = } $namespaces = (!empty($data['namespace'])) ? explode('\\', $data['namespace']) : []; - $this->_set_namespaces($post_id, $namespaces); + $this->setNamespaces($post_id, $namespaces); // Assign `wp-parser-source-type` term wp_set_object_terms( @@ -855,7 +854,7 @@ public function import_item(array $data, $parent_post_id = 0, $import_ignored = // Loop through all @since versions. foreach ($since_versions as $since_version) { if (!empty($since_version['content'])) { - $since_term = $this->insert_term($since_version['content'], $this->taxonomy_since_version); + $since_term = $this->insertTerm($since_version['content'], $this->taxonomy_since_version); // Assign the tax item to the post if (!is_wp_error($since_term)) { @@ -904,7 +903,7 @@ public function import_item(array $data, $parent_post_id = 0, $import_ignored = } // If the package doesn't already exist in the taxonomy, add it - $package_term = $this->insert_term($pack_value, $this->taxonomy_package, $package_term_args); + $package_term = $this->insertTerm($pack_value, $this->taxonomy_package, $package_term_args); $package_term_ids[] = (int)$package_term['term_id']; if ('main' === $pack_name && false === $main_package_id && !is_wp_error($package_term)) { @@ -1013,12 +1012,13 @@ public function import_item(array $data, $parent_post_id = 0, $import_ignored = * * @param int $post_id The ID of the post item being processed. * @param array $namespaces An array of namespaces strings + * @return void */ - protected function _set_namespaces($post_id, $namespaces) { + protected function setNamespaces($post_id, $namespaces) { $ns_term = false; $ns_terms = []; foreach ($namespaces as $namespace) { - $ns_term = $this->insert_term( + $ns_term = $this->insertTerm( $namespace, $this->taxonomy_namespace, [ diff --git a/src/Importer/MethodCallReflector.php b/src/Importer/MethodCallReflector.php index bc6d6fc..15ab7f0 100644 --- a/src/Importer/MethodCallReflector.php +++ b/src/Importer/MethodCallReflector.php @@ -5,6 +5,8 @@ use phpDocumentor\Reflection\BaseReflector; use phpDocumentor\Reflection\ClassReflector; +// phpcs:disable PSR2.Methods.MethodDeclaration.Underscore + /** * A reflection of a method call expression. */ @@ -44,9 +46,8 @@ public function getName() { // If the caller is a function, convert it to the function name if (is_a($caller, 'PHPParser_Node_Expr_FuncCall')) { - // Add parentheses to signify this is a function call /* - * @var \PHPParser_Node_Expr_FuncCall $caller + * Add parentheses to signify this is a function call */ $caller = implode('\\', $caller->name->parts) . '()'; } @@ -65,7 +66,7 @@ public function getName() { * @param ClassReflector $class * @return void */ - public function set_class(ClassReflector $class) { + public function setClass(ClassReflector $class) { $this->called_in_class = $class; } diff --git a/src/Importer/Parser.php b/src/Importer/Parser.php index 208b55b..1947225 100644 --- a/src/Importer/Parser.php +++ b/src/Importer/Parser.php @@ -254,8 +254,9 @@ function ($matches) use ($replacement_string) { } /** - * @param BaseReflector|ReflectionAbstract $element + * Exports doc block * + * @param BaseReflector|ReflectionAbstract $element * @return array */ public static function exportDocblock($element) { @@ -312,8 +313,9 @@ public static function exportDocblock($element) { } /** - * @param HookReflector[] $hooks + * Exports hooks * + * @param HookReflector[] $hooks * @return array */ public static function exportHooks(array $hooks) { @@ -334,8 +336,9 @@ public static function exportHooks(array $hooks) { } /** - * @param ArgumentReflector[] $arguments + * Exports arguments * + * @param ArgumentReflector[] $arguments * @return array */ public static function exportArguments(array $arguments) { @@ -353,8 +356,9 @@ public static function exportArguments(array $arguments) { } /** - * @param PropertyReflector[] $properties + * Exports properties * + * @param PropertyReflector[] $properties * @return array */ public static function exportProperties(array $properties) { @@ -377,8 +381,9 @@ public static function exportProperties(array $properties) { } /** - * @param MethodReflector[] $methods + * Exports methods * + * @param MethodReflector[] $methods * @return array */ public static function exportMethods(array $methods) { diff --git a/src/Importer/Relationships.php b/src/Importer/Relationships.php index c7d01a9..5041a8a 100644 --- a/src/Importer/Relationships.php +++ b/src/Importer/Relationships.php @@ -43,14 +43,16 @@ class Relationships /** * Adds the actions. + * + * @return void */ public function init() { - add_action('plugins_loaded', [$this, 'require_posts_to_posts']); - add_action('wp_loaded', [$this, 'register_post_relationships']); + add_action('plugins_loaded', [$this, 'requirePostsToPosts']); + add_action('wp_loaded', [$this, 'registerPostRelationships']); - add_action('wp_parser_import_item', [$this, 'import_item'], 10, 3); - add_action('wp_parser_starting_import', [$this, 'wp_parser_starting_import']); - add_action('wp_parser_ending_import', [$this, 'wp_parser_ending_import'], 10, 1); + add_action('wp_parser_import_item', [$this, 'importItem'], 10, 3); + add_action('wp_parser_starting_import', [$this, 'wpParserStartingImport']); + add_action('wp_parser_ending_import', [$this, 'wpParserEndingImport'], 10, 1); } /** @@ -58,7 +60,7 @@ public function init() { * * @return void */ - public function require_posts_to_posts() { + public function requirePostsToPosts() { // Initializes the database tables \P2P_Storage::init(); @@ -73,9 +75,10 @@ public function require_posts_to_posts() { * 'cardinality' => 'many-to-many' * 'reciprocal' => false * - * @link https://github.com/scribu/wp-posts-to-posts/wiki/p2p_register_connection_type + * @link https://github.com/scribu/wp-posts-to-posts/wiki/p2p_register_connection_type + * @return void */ - public function register_post_relationships() { + public function registerPostRelationships() { /* * Functions to functions, methods and hooks */ @@ -201,10 +204,13 @@ public function register_post_relationships() { /** * Bring Importer post types into this class. + * * Runs at import start. + * + * @return void */ - public function wp_parser_starting_import() { - if (!$this->p2p_tables_exist()) { + public function wpParserStartingImport() { + if (!$this->p2pTablesExist()) { \P2P_Storage::init(); \P2P_Storage::install(); } @@ -221,7 +227,7 @@ public function wp_parser_starting_import() { * * @return bool Whether or not the posts 2 posts tables exist. */ - public function p2p_tables_exist() { + public function p2pTablesExist() { global $wpdb; $tables = $wpdb->get_col('SHOW TABLES'); @@ -238,8 +244,9 @@ public function p2p_tables_exist() { * @param int $post_id Post ID of item just imported. * @param array $data Parser data * @param array $post_data Post data + * @return void */ - public function import_item($post_id, $data, $post_data) { + public function importItem($post_id, $data, $post_data) { $from_type = $post_data['post_type']; $slug = $post_data['post_name']; @@ -250,7 +257,7 @@ public function import_item($post_id, $data, $post_data) { // Functions to Functions $to_type = $this->post_types['function']; foreach ((array)@$data['uses']['functions'] as $to_function) { - $to_function_slug = $this->names_to_slugs($to_function['name'], $data['namespace']); + $to_function_slug = $this->namesToSlugs($to_function['name'], $data['namespace']); $this->relationships[$from_type][$post_id][$to_type][] = $to_function_slug; } @@ -263,7 +270,7 @@ public function import_item($post_id, $data, $post_data) { } else { $to_method_slug = $to_method['name']; } - $to_method_slug = $this->names_to_slugs($to_method_slug, $data['namespace']); + $to_method_slug = $this->namesToSlugs($to_method_slug, $data['namespace']); $this->relationships[$from_type][$post_id][$to_type][] = $to_method_slug; } @@ -272,7 +279,7 @@ public function import_item($post_id, $data, $post_data) { $to_type = $this->post_types['hook']; foreach ((array)@$data['hooks'] as $to_hook) { // Never a namespace on a hook so don't send one. - $to_hook_slug = $this->names_to_slugs($to_hook['name']); + $to_hook_slug = $this->namesToSlugs($to_hook['name']); $this->relationships[$from_type][$post_id][$to_type][] = $to_hook_slug; } @@ -282,7 +289,7 @@ public function import_item($post_id, $data, $post_data) { // Methods to Functions $to_type = $this->post_types['function']; foreach ((array)@$data['uses']['functions'] as $to_function) { - $to_function_slug = $this->names_to_slugs($to_function['name'], $data['namespace']); + $to_function_slug = $this->namesToSlugs($to_function['name'], $data['namespace']); $this->relationships[$from_type][$post_id][$to_type][] = $to_function_slug; } @@ -299,7 +306,7 @@ public function import_item($post_id, $data, $post_data) { } else { $to_method_slug = $to_method['name']; } - $to_method_slug = $this->names_to_slugs($to_method_slug, $data['namespace']); + $to_method_slug = $this->namesToSlugs($to_method_slug, $data['namespace']); $this->relationships[$from_type][$post_id][$to_type][] = $to_method_slug; } @@ -307,7 +314,7 @@ public function import_item($post_id, $data, $post_data) { // Methods to Hooks $to_type = $this->post_types['hook']; foreach ((array)@$data['hooks'] as $to_hook) { - $to_hook_slug = $this->names_to_slugs($to_hook['name']); + $to_hook_slug = $this->namesToSlugs($to_hook['name']); $this->relationships[$from_type][$post_id][$to_type][] = $to_hook_slug; } @@ -316,8 +323,11 @@ public function import_item($post_id, $data, $post_data) { /** * After import has run, go back and connect all the posts. + * + * @param Importer $importer + * @return void */ - public function wp_parser_ending_import(Importer $importer) { + public function wpParserEndingImport(Importer $importer) { global $wpdb; if (defined('WP_CLI') && WP_CLI) { @@ -334,7 +344,6 @@ public function wp_parser_ending_import(Importer $importer) { // p2p_delete_connections('methods_to_functions'); // p2p_delete_connections('methods_to_methods'); // p2p_delete_connections('methods_to_hooks'); - $wtr = $wpdb->prefix . 'term_relationships'; $wtt = $wpdb->prefix . 'term_taxonomy'; $wt = $wpdb->prefix . 'terms'; @@ -386,7 +395,7 @@ public function wp_parser_ending_import(Importer $importer) { continue; } - $this->relationships[$from_type][$from_id][$to_type] = $this->get_ids_for_slugs($to_slugs, $this->slugs_to_ids[$to_type]); + $this->relationships[$from_type][$from_id][$to_type] = $this->getIdsForSlugs($to_slugs, $this->slugs_to_ids[$to_type]); } } } @@ -482,21 +491,21 @@ public function wp_parser_ending_import(Importer $importer) { * namespace `\Foo\Bar\` by just calling `Bar\baz()`. PHP will first look * for `\Foo\Bar\baz()` and if it can't find it fall back to `\Bar\baz()`. * - * @see Importer::import_item() - * @param string $name The name of the item a slug is needed for. - * @param string $namespace The namespace the item is in when for context. - * @return array An array of slugs, starting with the context of the - * namespace, and falling back to the global namespace. + * @see Importer::importItem() + * @param string $name The name of the item a slug is needed for. + * @param string $namespace The namespace the item is in when for context. + * @return array An array of slugs, starting with the context of the + * namespace, and falling back to the global namespace. */ - public function names_to_slugs($name, $namespace = null) { + public function namesToSlugs($name, $namespace = null) { $fully_qualified = (0 === strpos('\\', $name)); $name = ltrim($name, '\\'); $names = []; if ($namespace && !$fully_qualified) { - $names[] = $this->name_to_slug($namespace . '\\' . $name); + $names[] = $this->namesToSlug($namespace . '\\' . $name); } - $names[] = $this->name_to_slug($name); + $names[] = $this->namesToSlug($name); return $names; } @@ -506,10 +515,10 @@ public function names_to_slugs($name, $namespace = null) { * * Replaces '::' and '\' to dashes and then runs the name through `sanitize_title()`. * - * @param string $name Method, function, or hook name + * @param string $name Method, function, or hook name * @return string The post slug for the passed name. */ - public function name_to_slug($name) { + public function namesToSlug($name) { return sanitize_title(str_replace('\\', '-', str_replace('::', '-', $name))); } @@ -517,11 +526,11 @@ public function name_to_slug($name) { * Convert a post slug to an array( 'slug' => id ) * Ignores slugs that are not found in $slugs_to_ids * - * @param array $slugs Array of post slugs. - * @param array $slugs_to_ids Map of slugs to IDs. + * @param array $slugs Array of post slugs. + * @param array $slugs_to_ids Map of slugs to IDs. * @return array */ - public function get_ids_for_slugs(array $slugs, array $slugs_to_ids) { + public function getIdsForSlugs(array $slugs, array $slugs_to_ids) { $slugs_with_ids = []; foreach ($slugs as $index => $scoped_slugs) { diff --git a/src/ParsedContent.php b/src/ParsedContent.php index d75632e..afb1d54 100644 --- a/src/ParsedContent.php +++ b/src/ParsedContent.php @@ -174,6 +174,7 @@ public function addParsedMetaBox($post) {
    +
    @@ -192,7 +193,10 @@ public function addParsedMetaBox($post) { ?> - +
    diff --git a/src/api-functions.php b/src/api-functions.php index 095dd2e..823f95e 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -928,6 +928,7 @@ function avcpdp_get_explanation_content($_post) { $orig = $post; // Set global post to the explanation post. + // phpcs:disable WordPress.WP.GlobalVariablesOverride.Prohibited $post = avcpdp_get_explanation($_post); // Get explanation's raw post content. @@ -952,6 +953,7 @@ function avcpdp_get_explanation_content($_post) { // Restore original global post. $post = $orig; + // phpcs:enable WordPress.WP.GlobalVariablesOverride.Prohibited // Restore filter. add_filter('the_content', ['Aivec\Plugins\DocParser\Formatting', 'fixUnintendedMarkdown'], 1); diff --git a/tests/phpunit/includes/bootstrap.php b/tests/phpunit/includes/bootstrap.php index f51b139..28ce1be 100644 --- a/tests/phpunit/includes/bootstrap.php +++ b/tests/phpunit/includes/bootstrap.php @@ -1,10 +1,10 @@ getFileName(); - $file = rtrim( $file, 'php' ) . 'inc'; - $path = dirname( $file ); - - $export_data = Parser::parseFiles( array( $file ), $path ); - - $this->export_data = $export_data[0]; - } - - /** - * Parse the file to get the exported data before the first test. - */ - public function setUp() { - - parent::setUp(); - - if ( ! $this->export_data ) { - $this->parse_file(); - } - } - - /** - * Assert that an entity contains another entity. - * - * @param array $entity The exported entity data. - * @param string $type The type of thing that this entity should contain. - * @param array $expected The expected data for the thing the entity should contain. - */ - protected function assertEntityContains( $entity, $type, $expected ) { - - $this->assertArrayHasKey( $type, $entity ); - - foreach ( $entity[ $type ] as $exported ) { - if ( $exported['line'] == $expected['line'] ) { - foreach ( $expected as $key => $expected_value ) { - $this->assertEquals( $expected_value, $exported[ $key ] ); - } - - return; - } - } - - $this->fail( "No matching {$type} contained by {$entity['name']}." ); - } - - /** - * Assert that a file contains the declaration of a hook. - * - * @param array $hook The expected export data for the hook. - */ - protected function assertFileContainsHook( $hook ) { - - $this->assertEntityContains( $this->export_data, 'hooks', $hook ); - } - - /** - * Assert that an entity uses another entity. - * - * @param array $entity The exported entity data. - * @param string $type The type of thing that this entity should use. - * @param array $used The expected data for the thing the entity should use. - */ - protected function assertEntityUses( $entity, $type, $used ) { - - if ( ! $this->entity_uses( $entity, $type, $used ) ) { - - $name = isset( $entity['path'] ) ? $entity['path'] : $entity['name']; - - $this->fail( "No matching {$type} used by {$name}." ); - } - } - - /** - * Assert that an entity doesn't use another entity. - * - * @param array $entity The exported entity data. - * @param string $type The type of thing that this entity shouldn't use. - * @param array $used The expected data for the thing the entity shouldn't use. - */ - protected function assertEntityNotUses( $entity, $type, $used ) { - - if ( $this->entity_uses( $entity, $type, $used ) ) { - - $name = isset( $entity['path'] ) ? $entity['path'] : $entity['name']; - - $this->fail( "Matching {$type} used by {$name}." ); - } - } - - /** - * Assert that a function uses another entity. - * - * @param string $type The type of entity. E.g. 'functions', 'methods'. - * @param string $function_name The name of the function that uses this function. - * @param array $entity The expected exported data for the used entity. - */ - protected function assertFunctionUses( $type, $function_name, $entity ) { - - $function_data = $this->find_entity_data_in( - $this->export_data - , 'functions' - , $function_name - ); - - $this->assertInternalType( 'array', $function_data ); - $this->assertEntityUses( $function_data, $type, $entity ); - } - - /** - * Assert that a function doesn't use another entity. - * - * @param string $type The type of entity. E.g. 'functions', 'methods'. - * @param string $function_name The name of the function that uses this function. - * @param array $entity The expected exported data for the used entity. - */ - protected function assertFunctionNotUses( $type, $function_name, $entity ) { - - $function_data = $this->find_entity_data_in( - $this->export_data - , 'functions' - , $function_name - ); - - $this->assertInternalType( 'array', $function_data ); - $this->assertEntityNotUses( $function_data, $type, $entity ); - } - - /** - * Assert that a method uses another entity. - * - * @param string $type The type of entity. E.g. 'functions', 'methods'. - * @param string $class_name The name of the class that the method is used in. - * @param string $method_name The name of the method that uses this method. - * @param array $entity The expected exported data for this entity. - */ - protected function assertMethodUses( $type, $class_name, $method_name, $entity ) { - - $class_data = $this->find_entity_data_in( - $this->export_data - , 'classes' - , $class_name - ); - - $this->assertInternalType( 'array', $class_data ); - - $method_data = $this->find_entity_data_in( - $class_data - , 'methods' - , $method_name - ); - - $this->assertInternalType( 'array', $method_data ); - $this->assertEntityUses( $method_data, $type, $entity ); - } - - /** - * Assert that a method doesn't use another entity. - * - * @param string $type The type of entity. E.g. 'functions', 'methods'. - * @param string $class_name The name of the class that the method is used in. - * @param string $method_name The name of the method that uses this method. - * @param array $entity The expected exported data for this entity. - */ - protected function assertMethodNotUses( $type, $class_name, $method_name, $entity ) { - - $class_data = $this->find_entity_data_in( - $this->export_data - , 'classes' - , $class_name - ); - - $this->assertInternalType( 'array', $class_data ); - - $method_data = $this->find_entity_data_in( - $class_data - , 'methods' - , $method_name - ); - - $this->assertInternalType( 'array', $method_data ); - $this->assertEntityNotUses( $method_data, $type, $entity ); - } - - /** - * Assert that a file uses a function. - * - * @param array $function The expected export data for the function. - */ - protected function assertFileUsesFunction( $function ) { - - $this->assertEntityUses( $this->export_data, 'functions', $function ); - } - - /** - * Assert that a function uses another function. - * - * @param string $function_name The name of the function that uses this function. - * @param array $function The expected exported data for the used function. - */ - protected function assertFunctionUsesFunction( $function_name, $function ) { - - $this->assertFunctionUses( 'functions', $function_name, $function ); - } - - /** - * Assert that a method uses a function. - * - * @param string $class_name The name of the class that the method is used in. - * @param string $method_name The name of the method that uses this method. - * @param array $function The expected exported data for this function. - */ - protected function assertMethodUsesFunction( $class_name, $method_name, $function ) { - - $this->assertMethodUses( 'functions', $class_name, $method_name, $function ); - } - - /** - * Assert that a file uses a function. - * - * @param array $function The expected export data for the function. - */ - protected function assertFileNotUsesFunction( $function ) { - - $this->assertEntityNotUses( $this->export_data, 'functions', $function ); - } - - /** - * Assert that a function uses another function. - * - * @param string $function_name The name of the function that uses this function. - * @param array $function The expected exported data for the used function. - */ - protected function assertFunctionNotUsesFunction( $function_name, $function ) { - - $this->assertFunctionNotUses( 'functions', $function_name, $function ); - } - - /** - * Assert that a method uses a function. - * - * @param string $class_name The name of the class that the method is used in. - * @param string $method_name The name of the method that uses this method. - * @param array $function The expected exported data for this function. - */ - protected function assertMethodNotUsesFunction( $class_name, $method_name, $function ) { - - $this->assertMethodNotUses( 'functions', $class_name, $method_name, $function ); - } - - /** - * Assert that a file uses an method. - * - * @param array $method The expected export data for the method. - */ - protected function assertFileUsesMethod( $method ) { - - $this->assertEntityUses( $this->export_data, 'methods', $method ); - } - - /** - * Assert that a function uses a method. - * - * @param string $function_name The name of the function that uses this method. - * @param array $method The expected exported data for this method. - */ - protected function assertFunctionUsesMethod( $function_name, $method ) { - - $this->assertFunctionUses( 'methods', $function_name, $method ); - } - - /** - * Assert that a method uses a method. - * - * @param string $class_name The name of the class that the method is used in. - * @param string $method_name The name of the method that uses this method. - * @param array $method The expected exported data for this method. - */ - protected function assertMethodUsesMethod( $class_name, $method_name, $method ) { - - $this->assertMethodUses( 'methods', $class_name, $method_name, $method ); - } - - /** - * Assert that a file uses an method. - * - * @param array $method The expected export data for the method. - */ - protected function assertFileNotUsesMethod( $method ) { - - $this->assertEntityNotUses( $this->export_data, 'methods', $method ); - } - - /** - * Assert that a function uses a method. - * - * @param string $function_name The name of the function that uses this method. - * @param array $method The expected exported data for this method. - */ - protected function assertFunctionNotUsesMethod( $function_name, $method ) { - - $this->assertFunctionNotUses( 'methods', $function_name, $method ); - } - - /** - * Assert that a method uses a method. - * - * @param string $class_name The name of the class that the method is used in. - * @param string $method_name The name of the method that uses this method. - * @param array $method The expected exported data for this method. - */ - protected function assertMethodNotUsesMethod( $class_name, $method_name, $method ) { - - $this->assertMethodNotUses( 'methods', $class_name, $method_name, $method ); - } - - /** - * Assert that an entity has a docblock. - * - * @param array $entity The exported entity data. - * @param array $docs The expected data for the entity's docblock. - * @param string $doc_key The key in the entity array that should hold the docs. - */ - protected function assertEntityHasDocs( $entity, $docs, $doc_key = 'doc' ) { - - $this->assertArrayHasKey( $doc_key, $entity ); - - foreach ( $docs as $key => $expected_value ) { - $this->assertEquals( $expected_value, $entity[ $doc_key ][ $key ] ); - } - } - - /** - * Assert that a file has a docblock. - * - * @param array $docs The expected data for the file's docblock. - */ - protected function assertFileHasDocs( $docs ) { - - $this->assertEntityHasDocs( $this->export_data, $docs, 'file' ); - } - - /** - * Assert that a function has a docblock. - * - * @param array $func The function name. - * @param array $docs The expected data for the function's docblock. - */ - protected function assertFunctionHasDocs( $func, $docs ) { - - $func = $this->find_entity_data_in( $this->export_data, 'functions', $func ); - $this->assertEntityHasDocs( $func, $docs ); - } - - /** - * Assert that a class has a docblock. - * - * @param array $class The class name. - * @param array $docs The expected data for the class's docblock. - */ - protected function assertClassHasDocs( $class, $docs ) { - - $class = $this->find_entity_data_in( $this->export_data, 'classes', $class ); - $this->assertEntityHasDocs( $class, $docs ); - } - - /** - * Assert that a method has a docblock. - * - * @param string $class The name of the class that the method is used in. - * @param string $method The method name. - * @param array $docs The expected data for the method's docblock. - */ - protected function assertMethodHasDocs( $class, $method, $docs ) { - - $class = $this->find_entity_data_in( $this->export_data, 'classes', $class ); - $this->assertInternalType( 'array', $class ); - - $method = $this->find_entity_data_in( $class, 'methods', $method ); - $this->assertEntityHasDocs( $method, $docs ); - } - - /** - * Assert that a property has a docblock. - * - * @param string $class The name of the class that the method is used in. - * @param string $property The property name. - * @param array $docs The expected data for the property's docblock. - */ - protected function assertPropertyHasDocs( $class, $property, $docs ) { - - $class = $this->find_entity_data_in( $this->export_data, 'classes', $class ); - $this->assertInternalType( 'array', $class ); - - $property = $this->find_entity_data_in( $class, 'properties', $property ); - $this->assertEntityHasDocs( $property, $docs ); - } - - /** - * Assert that a hook has a docblock. - * - * @param array $hook The hook name. - * @param array $docs The expected data for the hook's docblock. - */ - protected function assertHookHasDocs( $hook, $docs ) { - - $hook = $this->find_entity_data_in( $this->export_data, 'hooks', $hook ); - $this->assertEntityHasDocs( $hook, $docs ); - } - - /** - * Find the exported data for an entity. - * - * @param array $data The data to search in. - * @param string $type The type of entity. - * @param string $entity_name The name of the function. - * - * @return array|false The data for the entity, or false if it couldn't be found. - */ - protected function find_entity_data_in( $data, $type, $entity ) { - - if ( empty( $data[ $type ] ) ) { - return false; - } - - foreach ( $data[ $type ] as $entity_data ) { - if ( $entity_data['name'] === $entity ) { - return $entity_data; - } - } - - return false; - } - - /** - * Check if one entity uses another entity. - * - * @param array $entity The exported entity data. - * @param string $type The type of thing that this entity should use. - * @param array $used The expected data for the thing the entity should use. - * - * @return bool Whether the entity uses the other. - */ - function entity_uses( $entity, $type, $used ) { - - if ( ! isset( $entity['uses'][ $type ] ) ) { - return false; - } - - foreach ( $entity['uses'][ $type ] as $exported_used ) { - if ( $exported_used['line'] == $used['line'] ) { - $this->assertEquals( $used, $exported_used ); - return true; - } - } - - return false; - } +class Export_UnitTestCase extends \WP_UnitTestCase +{ + /** + * The exported data. + * + * @var string + */ + protected $export_data; + + /** + * Parse the file for the current testcase. + */ + protected function parse_file() { + $class_reflector = new \ReflectionClass($this); + $file = $class_reflector->getFileName(); + $file = rtrim($file, 'php') . 'inc'; + $path = dirname($file); + + $export_data = Parser::parseFiles([$file], $path); + + $this->export_data = $export_data[0]; + } + + /** + * Parse the file to get the exported data before the first test. + */ + public function setUp() { + parent::setUp(); + + if (!$this->export_data) { + $this->parse_file(); + } + } + + /** + * Assert that an entity contains another entity. + * + * @param array $entity The exported entity data. + * @param string $type The type of thing that this entity should contain. + * @param array $expected The expected data for the thing the entity should contain. + */ + protected function assertEntityContains($entity, $type, $expected) { + $this->assertArrayHasKey($type, $entity); + + foreach ($entity[$type] as $exported) { + if ($exported['line'] == $expected['line']) { + foreach ($expected as $key => $expected_value) { + $this->assertEquals($expected_value, $exported[$key]); + } + + return; + } + } + + $this->fail("No matching {$type} contained by {$entity['name']}."); + } + + /** + * Assert that a file contains the declaration of a hook. + * + * @param array $hook The expected export data for the hook. + */ + protected function assertFileContainsHook($hook) { + $this->assertEntityContains($this->export_data, 'hooks', $hook); + } + + /** + * Assert that an entity uses another entity. + * + * @param array $entity The exported entity data. + * @param string $type The type of thing that this entity should use. + * @param array $used The expected data for the thing the entity should use. + */ + protected function assertEntityUses($entity, $type, $used) { + if (!$this->entity_uses($entity, $type, $used)) { + $name = isset($entity['path']) ? $entity['path'] : $entity['name']; + + $this->fail("No matching {$type} used by {$name}."); + } + } + + /** + * Assert that an entity doesn't use another entity. + * + * @param array $entity The exported entity data. + * @param string $type The type of thing that this entity shouldn't use. + * @param array $used The expected data for the thing the entity shouldn't use. + */ + protected function assertEntityNotUses($entity, $type, $used) { + if ($this->entity_uses($entity, $type, $used)) { + $name = isset($entity['path']) ? $entity['path'] : $entity['name']; + + $this->fail("Matching {$type} used by {$name}."); + } + } + + /** + * Assert that a function uses another entity. + * + * @param string $type The type of entity. E.g. 'functions', 'methods'. + * @param string $function_name The name of the function that uses this function. + * @param array $entity The expected exported data for the used entity. + */ + protected function assertFunctionUses($type, $function_name, $entity) { + $function_data = $this->find_entity_data_in( + $this->export_data, + 'functions', + $function_name + ); + + $this->assertInternalType('array', $function_data); + $this->assertEntityUses($function_data, $type, $entity); + } + + /** + * Assert that a function doesn't use another entity. + * + * @param string $type The type of entity. E.g. 'functions', 'methods'. + * @param string $function_name The name of the function that uses this function. + * @param array $entity The expected exported data for the used entity. + */ + protected function assertFunctionNotUses($type, $function_name, $entity) { + $function_data = $this->find_entity_data_in( + $this->export_data, + 'functions', + $function_name + ); + + $this->assertInternalType('array', $function_data); + $this->assertEntityNotUses($function_data, $type, $entity); + } + + /** + * Assert that a method uses another entity. + * + * @param string $type The type of entity. E.g. 'functions', 'methods'. + * @param string $class_name The name of the class that the method is used in. + * @param string $method_name The name of the method that uses this method. + * @param array $entity The expected exported data for this entity. + */ + protected function assertMethodUses($type, $class_name, $method_name, $entity) { + $class_data = $this->find_entity_data_in( + $this->export_data, + 'classes', + $class_name + ); + + $this->assertInternalType('array', $class_data); + + $method_data = $this->find_entity_data_in( + $class_data, + 'methods', + $method_name + ); + + $this->assertInternalType('array', $method_data); + $this->assertEntityUses($method_data, $type, $entity); + } + + /** + * Assert that a method doesn't use another entity. + * + * @param string $type The type of entity. E.g. 'functions', 'methods'. + * @param string $class_name The name of the class that the method is used in. + * @param string $method_name The name of the method that uses this method. + * @param array $entity The expected exported data for this entity. + */ + protected function assertMethodNotUses($type, $class_name, $method_name, $entity) { + $class_data = $this->find_entity_data_in( + $this->export_data, + 'classes', + $class_name + ); + + $this->assertInternalType('array', $class_data); + + $method_data = $this->find_entity_data_in( + $class_data, + 'methods', + $method_name + ); + + $this->assertInternalType('array', $method_data); + $this->assertEntityNotUses($method_data, $type, $entity); + } + + /** + * Assert that a file uses a function. + * + * @param array $function The expected export data for the function. + */ + protected function assertFileUsesFunction($function) { + $this->assertEntityUses($this->export_data, 'functions', $function); + } + + /** + * Assert that a function uses another function. + * + * @param string $function_name The name of the function that uses this function. + * @param array $function The expected exported data for the used function. + */ + protected function assertFunctionUsesFunction($function_name, $function) { + $this->assertFunctionUses('functions', $function_name, $function); + } + + /** + * Assert that a method uses a function. + * + * @param string $class_name The name of the class that the method is used in. + * @param string $method_name The name of the method that uses this method. + * @param array $function The expected exported data for this function. + */ + protected function assertMethodUsesFunction($class_name, $method_name, $function) { + $this->assertMethodUses('functions', $class_name, $method_name, $function); + } + + /** + * Assert that a file uses a function. + * + * @param array $function The expected export data for the function. + */ + protected function assertFileNotUsesFunction($function) { + $this->assertEntityNotUses($this->export_data, 'functions', $function); + } + + /** + * Assert that a function uses another function. + * + * @param string $function_name The name of the function that uses this function. + * @param array $function The expected exported data for the used function. + */ + protected function assertFunctionNotUsesFunction($function_name, $function) { + $this->assertFunctionNotUses('functions', $function_name, $function); + } + + /** + * Assert that a method uses a function. + * + * @param string $class_name The name of the class that the method is used in. + * @param string $method_name The name of the method that uses this method. + * @param array $function The expected exported data for this function. + */ + protected function assertMethodNotUsesFunction($class_name, $method_name, $function) { + $this->assertMethodNotUses('functions', $class_name, $method_name, $function); + } + + /** + * Assert that a file uses an method. + * + * @param array $method The expected export data for the method. + */ + protected function assertFileUsesMethod($method) { + $this->assertEntityUses($this->export_data, 'methods', $method); + } + + /** + * Assert that a function uses a method. + * + * @param string $function_name The name of the function that uses this method. + * @param array $method The expected exported data for this method. + */ + protected function assertFunctionUsesMethod($function_name, $method) { + $this->assertFunctionUses('methods', $function_name, $method); + } + + /** + * Assert that a method uses a method. + * + * @param string $class_name The name of the class that the method is used in. + * @param string $method_name The name of the method that uses this method. + * @param array $method The expected exported data for this method. + */ + protected function assertMethodUsesMethod($class_name, $method_name, $method) { + $this->assertMethodUses('methods', $class_name, $method_name, $method); + } + + /** + * Assert that a file uses an method. + * + * @param array $method The expected export data for the method. + */ + protected function assertFileNotUsesMethod($method) { + $this->assertEntityNotUses($this->export_data, 'methods', $method); + } + + /** + * Assert that a function uses a method. + * + * @param string $function_name The name of the function that uses this method. + * @param array $method The expected exported data for this method. + */ + protected function assertFunctionNotUsesMethod($function_name, $method) { + $this->assertFunctionNotUses('methods', $function_name, $method); + } + + /** + * Assert that a method uses a method. + * + * @param string $class_name The name of the class that the method is used in. + * @param string $method_name The name of the method that uses this method. + * @param array $method The expected exported data for this method. + */ + protected function assertMethodNotUsesMethod($class_name, $method_name, $method) { + $this->assertMethodNotUses('methods', $class_name, $method_name, $method); + } + + /** + * Assert that an entity has a docblock. + * + * @param array $entity The exported entity data. + * @param array $docs The expected data for the entity's docblock. + * @param string $doc_key The key in the entity array that should hold the docs. + */ + protected function assertEntityHasDocs($entity, $docs, $doc_key = 'doc') { + $this->assertArrayHasKey($doc_key, $entity); + + foreach ($docs as $key => $expected_value) { + $this->assertEquals($expected_value, $entity[$doc_key][$key]); + } + } + + /** + * Assert that a file has a docblock. + * + * @param array $docs The expected data for the file's docblock. + */ + protected function assertFileHasDocs($docs) { + $this->assertEntityHasDocs($this->export_data, $docs, 'file'); + } + + /** + * Assert that a function has a docblock. + * + * @param array $func The function name. + * @param array $docs The expected data for the function's docblock. + */ + protected function assertFunctionHasDocs($func, $docs) { + $func = $this->find_entity_data_in($this->export_data, 'functions', $func); + $this->assertEntityHasDocs($func, $docs); + } + + /** + * Assert that a class has a docblock. + * + * @param array $class The class name. + * @param array $docs The expected data for the class's docblock. + */ + protected function assertClassHasDocs($class, $docs) { + $class = $this->find_entity_data_in($this->export_data, 'classes', $class); + $this->assertEntityHasDocs($class, $docs); + } + + /** + * Assert that a method has a docblock. + * + * @param string $class The name of the class that the method is used in. + * @param string $method The method name. + * @param array $docs The expected data for the method's docblock. + */ + protected function assertMethodHasDocs($class, $method, $docs) { + $class = $this->find_entity_data_in($this->export_data, 'classes', $class); + $this->assertInternalType('array', $class); + + $method = $this->find_entity_data_in($class, 'methods', $method); + $this->assertEntityHasDocs($method, $docs); + } + + /** + * Assert that a property has a docblock. + * + * @param string $class The name of the class that the method is used in. + * @param string $property The property name. + * @param array $docs The expected data for the property's docblock. + */ + protected function assertPropertyHasDocs($class, $property, $docs) { + $class = $this->find_entity_data_in($this->export_data, 'classes', $class); + $this->assertInternalType('array', $class); + + $property = $this->find_entity_data_in($class, 'properties', $property); + $this->assertEntityHasDocs($property, $docs); + } + + /** + * Assert that a hook has a docblock. + * + * @param array $hook The hook name. + * @param array $docs The expected data for the hook's docblock. + */ + protected function assertHookHasDocs($hook, $docs) { + $hook = $this->find_entity_data_in($this->export_data, 'hooks', $hook); + $this->assertEntityHasDocs($hook, $docs); + } + + /** + * Find the exported data for an entity. + * + * @param array $data The data to search in. + * @param string $type The type of entity. + * @param string $entity_name The name of the function. + * + * @return array|false The data for the entity, or false if it couldn't be found. + */ + protected function find_entity_data_in($data, $type, $entity) { + if (empty($data[$type])) { + return false; + } + + foreach ($data[$type] as $entity_data) { + if ($entity_data['name'] === $entity) { + return $entity_data; + } + } + + return false; + } + + /** + * Check if one entity uses another entity. + * + * @param array $entity The exported entity data. + * @param string $type The type of thing that this entity should use. + * @param array $used The expected data for the thing the entity should use. + * + * @return bool Whether the entity uses the other. + */ + function entity_uses($entity, $type, $used) { + if (!isset($entity['uses'][$type])) { + return false; + } + + foreach ($entity['uses'][$type] as $exported_used) { + if ($exported_used['line'] == $used['line']) { + $this->assertEquals($used, $exported_used); + return true; + } + } + + return false; + } } diff --git a/tests/phpunit/includes/testcases/import.php b/tests/phpunit/includes/testcases/import.php index defcf29..6bad2b6 100644 --- a/tests/phpunit/includes/testcases/import.php +++ b/tests/phpunit/includes/testcases/import.php @@ -9,23 +9,22 @@ /** * Parent test case for data export tests. */ -class Import_UnitTestCase extends Export_UnitTestCase { +class Import_UnitTestCase extends Export_UnitTestCase +{ + /** + * The importer instace used in the tests. + * + * @var \WP_Parser\Importer + */ + protected $importer; - /** - * The importer instace used in the tests. - * - * @var \WP_Parser\Importer - */ - protected $importer; + /** + * Set up before the tests. + */ + public function setUp() { + parent::setUp(); - /** - * Set up before the tests. - */ - public function setUp() { - - parent::setUp(); - - $this->importer = new \WP_Parser\Importer; - $this->importer->import( array( $this->export_data ) ); - } + $this->importer = new \WP_Parser\Importer(); + $this->importer->import([$this->export_data]); + } } diff --git a/tests/phpunit/tests/export/docblocks.php b/tests/phpunit/tests/export/docblocks.php index 0d49b15..0e84f28 100644 --- a/tests/phpunit/tests/export/docblocks.php +++ b/tests/phpunit/tests/export/docblocks.php @@ -9,137 +9,129 @@ /** * Test that docblocks are exported correctly. */ -class Export_Docblocks extends Export_UnitTestCase { - - /** - * Test that line breaks are removed when the description is exported. - */ - public function test_linebreaks_removed() { - - $this->assertStringMatchesFormat( - '%s' - , $this->export_data['classes'][0]['doc']['long_description'] - ); - } - - /** - * Test that hooks which aren't documented don't receive docs from another node. - */ - public function test_undocumented_hook() { - - $this->assertHookHasDocs( - 'undocumented_hook' - , array( - 'description' => '', - ) - ); - } - - /** - * Test that hook docbloks are picked up. - */ - public function test_hook_docblocks() { - - $this->assertHookHasDocs( - 'test_action' - , array( 'description' => 'A test action.' ) - ); - - $this->assertHookHasDocs( - 'test_filter' - , array( 'description' => 'A filter.' ) - ); - - $this->assertHookHasDocs( - 'test_ref_array_action' - , array( 'description' => 'A reference array action.' ) - ); - - $this->assertHookHasDocs( - 'test_ref_array_filter' - , array( 'description' => 'A reference array filter.' ) - ); - } - - /** - * Test that file-level docs are exported. - */ - public function test_file_docblocks() { - - $this->assertFileHasDocs( - array( 'description' => 'This is the file-level docblock summary.' ) - ); - } - - /** - * Test that function docs are exported. - */ - public function test_function_docblocks() { - - $this->assertFunctionHasDocs( - 'test_func' - , array( - 'description' => 'This is a function docblock.', - 'long_description' => '

    This function is just a test, but we\'ve added this description anyway.

    ', - 'tags' => array( - array( - 'name' => 'since', - 'content' => '2.6.0', - ), - array( - 'name' => 'param', - 'content' => 'A string value.', - 'types' => array( 'string' ), - 'variable' => '$var', - ), - array( - 'name' => 'param', - 'content' => 'A number.', - 'types' => array( 'int' ), - 'variable' => '$num', - ), - array( - 'name' => 'return', - 'content' => 'Whether the function was called correctly.', - 'types' => array( 'bool' ), - ), - ), - ) - ); - } - - /** - * Test that class docs are exported. - */ - public function test_class_docblocks() { - - $this->assertClassHasDocs( - 'Test_Class' - , array( 'description' => 'This is a class docblock.' ) - ); - } - - /** - * Test that method docs are exported. - */ - public function test_method_docblocks() { - - $this->assertMethodHasDocs( - 'Test_Class' - , 'test_method' - , array( 'description' => 'This is a method docblock.' ) - ); - } - - /** - * Test that function docs are exported. - */ - public function test_property_docblocks() { - - $this->assertPropertyHasDocs( - 'Test_Class' - , '$a_string' - , array( 'description' => 'This is a docblock for a class property.' ) - ); - } +class Export_Docblocks extends Export_UnitTestCase +{ + /** + * Test that line breaks are removed when the description is exported. + */ + public function test_linebreaks_removed() { + $this->assertStringMatchesFormat( + '%s', + $this->export_data['classes'][0]['doc']['long_description'] + ); + } + + /** + * Test that hooks which aren't documented don't receive docs from another node. + */ + public function test_undocumented_hook() { + $this->assertHookHasDocs( + 'undocumented_hook', + [ + 'description' => '', + ] + ); + } + + /** + * Test that hook docbloks are picked up. + */ + public function test_hook_docblocks() { + $this->assertHookHasDocs( + 'test_action', + ['description' => 'A test action.'] + ); + + $this->assertHookHasDocs( + 'test_filter', + ['description' => 'A filter.'] + ); + + $this->assertHookHasDocs( + 'test_ref_array_action', + ['description' => 'A reference array action.'] + ); + + $this->assertHookHasDocs( + 'test_ref_array_filter', + ['description' => 'A reference array filter.'] + ); + } + + /** + * Test that file-level docs are exported. + */ + public function test_file_docblocks() { + $this->assertFileHasDocs( + ['description' => 'This is the file-level docblock summary.'] + ); + } + + /** + * Test that function docs are exported. + */ + public function test_function_docblocks() { + $this->assertFunctionHasDocs( + 'test_func', + [ + 'description' => 'This is a function docblock.', + 'long_description' => '

    This function is just a test, but we\'ve added this description anyway.

    ', + 'tags' => [ + [ + 'name' => 'since', + 'content' => '2.6.0', + ], + [ + 'name' => 'param', + 'content' => 'A string value.', + 'types' => ['string'], + 'variable' => '$var', + ], + [ + 'name' => 'param', + 'content' => 'A number.', + 'types' => ['int'], + 'variable' => '$num', + ], + [ + 'name' => 'return', + 'content' => 'Whether the function was called correctly.', + 'types' => ['bool'], + ], + ], + ] + ); + } + + /** + * Test that class docs are exported. + */ + public function test_class_docblocks() { + $this->assertClassHasDocs( + 'Test_Class', + ['description' => 'This is a class docblock.'] + ); + } + + /** + * Test that method docs are exported. + */ + public function test_method_docblocks() { + $this->assertMethodHasDocs( + 'Test_Class', + 'test_method', + ['description' => 'This is a method docblock.'] + ); + } + + /** + * Test that function docs are exported. + */ + public function test_property_docblocks() { + $this->assertPropertyHasDocs( + 'Test_Class', + '$a_string', + ['description' => 'This is a docblock for a class property.'] + ); + } } diff --git a/tests/phpunit/tests/export/hooks.php b/tests/phpunit/tests/export/hooks.php index adf4ef8..d4a9428 100644 --- a/tests/phpunit/tests/export/hooks.php +++ b/tests/phpunit/tests/export/hooks.php @@ -9,31 +9,45 @@ /** * Test that hooks are exported correctly. */ -class Export_Hooks extends Export_UnitTestCase { - - /** - * Test that hook names are standardized on export. - */ - public function test_hook_names_standardized() { - - $this->assertFileContainsHook( - array( 'name' => 'plain_action', 'line' => 3 ) - ); - - $this->assertFileContainsHook( - array( 'name' => 'action_with_double_quotes', 'line' => 4 ) - ); - - $this->assertFileContainsHook( - array( 'name' => '{$variable}-action', 'line' => 5 ) - ); - - $this->assertFileContainsHook( - array( 'name' => 'another-{$variable}-action', 'line' => 6 ) - ); - - $this->assertFileContainsHook( - array( 'name' => 'hook_{$object->property}_pre', 'line' => 7 ) - ); - } +class Export_Hooks extends Export_UnitTestCase +{ + /** + * Test that hook names are standardized on export. + */ + public function test_hook_names_standardized() { + $this->assertFileContainsHook( + [ + 'name' => 'plain_action', + 'line' => 3, + ] + ); + + $this->assertFileContainsHook( + [ + 'name' => 'action_with_double_quotes', + 'line' => 4, + ] + ); + + $this->assertFileContainsHook( + [ + 'name' => '{$variable}-action', + 'line' => 5, + ] + ); + + $this->assertFileContainsHook( + [ + 'name' => 'another-{$variable}-action', + 'line' => 6, + ] + ); + + $this->assertFileContainsHook( + [ + 'name' => 'hook_{$object->property}_pre', + 'line' => 7, + ] + ); + } } diff --git a/tests/phpunit/tests/export/namespace.php b/tests/phpunit/tests/export/namespace.php index dc7834f..28f9c6c 100644 --- a/tests/phpunit/tests/export/namespace.php +++ b/tests/phpunit/tests/export/namespace.php @@ -9,15 +9,15 @@ /** * Test that hooks are exported correctly. */ -class Export_Namespace extends Export_UnitTestCase { +class Export_Namespace extends Export_UnitTestCase +{ + /** + * Test that hook names are standardized on export. + */ + public function test_basic_namespace_support() { + $expected = 'Awesome\\Space'; + $actual = $this->export_data['functions'][0]['namespace']; - /** - * Test that hook names are standardized on export. - */ - public function test_basic_namespace_support() { - $expected = 'Awesome\\Space'; - $actual = $this->export_data['functions'][0]['namespace']; - - $this->assertEquals( $expected, $actual, 'Namespace should be parsed' ); - } + $this->assertEquals($expected, $actual, 'Namespace should be parsed'); + } } diff --git a/tests/phpunit/tests/export/uses/constructor.php b/tests/phpunit/tests/export/uses/constructor.php index 202eb7d..98b9d02 100644 --- a/tests/phpunit/tests/export/uses/constructor.php +++ b/tests/phpunit/tests/export/uses/constructor.php @@ -9,84 +9,80 @@ /** * Test that use of the __construct() method is exported for new Class() statements. */ -class Export_Constructor_Use extends Export_UnitTestCase { +class Export_Constructor_Use extends Export_UnitTestCase +{ + /** + * Test that use is exported when the class name is used explicitly. + */ + public function test_new_class() { + $this->assertFileUsesMethod( + [ + 'name' => '__construct', + 'line' => 3, + 'end_line' => 3, + 'class' => '\WP_Query', + 'static' => false, + ] + ); - /** - * Test that use is exported when the class name is used explicitly. - */ - public function test_new_class() { + $this->assertFunctionUsesMethod( + 'test', + [ + 'name' => '__construct', + 'line' => 6, + 'end_line' => 6, + 'class' => '\My_Class', + 'static' => false, + ] + ); + } - $this->assertFileUsesMethod( - array( - 'name' => '__construct', - 'line' => 3, - 'end_line' => 3, - 'class' => '\WP_Query', - 'static' => false, - ) - ); + /** + * Test that use is exported when the self keyword is used. + */ + public function test_new_self() { + $this->assertMethodUsesMethod( + 'My_Class', + 'instance', + [ + 'name' => '__construct', + 'line' => 12, + 'end_line' => 12, + 'class' => '\My_Class', + 'static' => false, + ] + ); + } - $this->assertFunctionUsesMethod( - 'test' - , array( - 'name' => '__construct', - 'line' => 6, - 'end_line' => 6, - 'class' => '\My_Class', - 'static' => false, - ) - ); - } + /** + * Test that use is exported when the parent keyword is used. + */ + public function test_new_parent() { + $this->assertMethodUsesMethod( + 'My_Class', + 'parent', + [ + 'name' => '__construct', + 'line' => 16, + 'end_line' => 16, + 'class' => '\Parent_Class', + 'static' => false, + ] + ); + } - /** - * Test that use is exported when the self keyword is used. - */ - public function test_new_self() { - - $this->assertMethodUsesMethod( - 'My_Class' - , 'instance' - , array( - 'name' => '__construct', - 'line' => 12, - 'end_line' => 12, - 'class' => '\My_Class', - 'static' => false, - ) - ); - } - - /** - * Test that use is exported when the parent keyword is used. - */ - public function test_new_parent() { - - $this->assertMethodUsesMethod( - 'My_Class' - , 'parent' - , array( - 'name' => '__construct', - 'line' => 16, - 'end_line' => 16, - 'class' => '\Parent_Class', - 'static' => false, - ) - ); - } - - /** - * Test that use is exported when a variable is used. - */ - public function test_new_variable() { - - $this->assertFileUsesMethod( - array( - 'name' => '__construct', - 'line' => 20, - 'end_line' => 20, - 'class' => '$class', - 'static' => false, - ) - ); - } + /** + * Test that use is exported when a variable is used. + */ + public function test_new_variable() { + $this->assertFileUsesMethod( + [ + 'name' => '__construct', + 'line' => 20, + 'end_line' => 20, + 'class' => '$class', + 'static' => false, + ] + ); + } } diff --git a/tests/phpunit/tests/export/uses/methods.php b/tests/phpunit/tests/export/uses/methods.php index 2def239..244de64 100644 --- a/tests/phpunit/tests/export/uses/methods.php +++ b/tests/phpunit/tests/export/uses/methods.php @@ -9,107 +9,105 @@ /** * Test that method use is exported correctly. */ -class Export_Method_Use extends Export_UnitTestCase { +class Export_Method_Use extends Export_UnitTestCase +{ + /** + * Test that static method use is exported. + */ + public function test_static_methods() { + $this->assertFileUsesMethod( + [ + 'name' => 'static_method', + 'line' => 3, + 'end_line' => 3, + 'class' => '\My_Class', + 'static' => true, + ] + ); - /** - * Test that static method use is exported. - */ - public function test_static_methods() { + $this->assertFunctionUsesMethod( + 'test', + [ + 'name' => 'another_method', + 'line' => 8, + 'end_line' => 8, + 'class' => '\Another_Class', + 'static' => true, + ] + ); - $this->assertFileUsesMethod( - array( - 'name' => 'static_method', - 'line' => 3, - 'end_line' => 3, - 'class' => '\My_Class', - 'static' => true, - ) - ); + $this->assertMethodUsesMethod( + 'My_Class', + 'static_method', + [ + 'name' => 'do_static_stuff', + 'line' => 16, + 'end_line' => 16, + 'class' => '\Another_Class', + 'static' => true, + ] + ); - $this->assertFunctionUsesMethod( - 'test' - , array( - 'name' => 'another_method', - 'line' => 8, - 'end_line' => 8, - 'class' => '\Another_Class', - 'static' => true, - ) - ); + $this->assertMethodUsesMethod( + 'My_Class', + 'static_method', + [ + 'name' => 'do_stuff', + 'line' => 17, + 'end_line' => 17, + 'class' => '\My_Class', + 'static' => true, + ] + ); - $this->assertMethodUsesMethod( - 'My_Class' - , 'static_method' - , array( - 'name' => 'do_static_stuff', - 'line' => 16, - 'end_line' => 16, - 'class' => '\Another_Class', - 'static' => true, - ) - ); + $this->assertMethodUsesMethod( + 'My_Class', + 'static_method', + [ + 'name' => 'do_parental_stuff', + 'line' => 19, + 'end_line' => 19, + 'class' => '\Parent_Class', + 'static' => true, + ] + ); + } - $this->assertMethodUsesMethod( - 'My_Class' - , 'static_method' - , array( - 'name' => 'do_stuff', - 'line' => 17, - 'end_line' => 17, - 'class' => '\My_Class', - 'static' => true, - ) - ); + /** + * Test that instance method use is exported. + */ + public function test_instance_methods() { + $this->assertFileUsesMethod( + [ + 'name' => 'update', + 'line' => 5, + 'end_line' => 5, + 'class' => '$wpdb', + 'static' => false, + ] + ); - $this->assertMethodUsesMethod( - 'My_Class' - , 'static_method' - , array( - 'name' => 'do_parental_stuff', - 'line' => 19, - 'end_line' => 19, - 'class' => '\Parent_Class', - 'static' => true, - ) - ); - } + $this->assertFunctionUsesMethod( + 'test', + [ + 'name' => 'call_method', + 'line' => 10, + 'end_line' => 10, + 'class' => 'get_class()', + 'static' => false, + ] + ); - /** - * Test that instance method use is exported. - */ - public function test_instance_methods() { - - $this->assertFileUsesMethod( - array( - 'name' => 'update', - 'line' => 5, - 'end_line' => 5, - 'class' => '$wpdb', - 'static' => false, - ) - ); - - $this->assertFunctionUsesMethod( - 'test' - , array( - 'name' => 'call_method', - 'line' => 10, - 'end_line' => 10, - 'class' => 'get_class()', - 'static' => false, - ) - ); - - $this->assertMethodUsesMethod( - 'My_Class' - , 'static_method' - , array( - 'name' => 'go', - 'line' => 18, - 'end_line' => 18, - 'class' => '\My_Class', - 'static' => false, - ) - ); - } + $this->assertMethodUsesMethod( + 'My_Class', + 'static_method', + [ + 'name' => 'go', + 'line' => 18, + 'end_line' => 18, + 'class' => '\My_Class', + 'static' => false, + ] + ); + } } diff --git a/tests/phpunit/tests/export/uses/nested.php b/tests/phpunit/tests/export/uses/nested.php index 4caaef6..ef904f5 100644 --- a/tests/phpunit/tests/export/uses/nested.php +++ b/tests/phpunit/tests/export/uses/nested.php @@ -9,210 +9,205 @@ /** * Test that function use is exported correctly when function declarations are nested. */ -class Export_Nested_Function_Use extends Export_UnitTestCase { - - /** - * Test that the uses data of the outer function is correct. - */ - public function test_top_function_uses_correct() { - - $this->assertFunctionUsesFunction( - 'test' - , array( - 'name' => 'a_function', - 'line' => 5, - 'end_line' => 5, - ) - ); - - $this->assertFunctionUsesFunction( - 'test' - , array( - 'name' => 'sub_test', - 'line' => 14, - 'end_line' => 14, - ) - ); - - $this->assertFunctionUsesMethod( - 'test' - , array( - 'name' => 'do_things', - 'line' => 16, - 'end_line' => 16, - 'class' => '\My_Class', - 'static' => true, - ) - ); - - $this->assertFunctionNotUsesFunction( - 'test' - , array( - 'name' => 'b_function', - 'line' => 9, - 'end_line' => 9, - ) - ); - - $this->assertFunctionNotUsesMethod( - 'test' - , array( - 'name' => 'static_method', - 'line' => 11, - 'end_line' => 11, - 'class' => '\My_Class', - 'static' => true, - ) - ); - } - - /** - * Test that the usages of the nested function is correct. - */ - public function test_nested_function_uses_correct() { - - $this->assertFunctionUsesFunction( - 'sub_test' - , array( - 'name' => 'b_function', - 'line' => 9, - 'end_line' => 9, - ) - ); - - $this->assertFunctionUsesMethod( - 'sub_test' - , array( - 'name' => 'static_method', - 'line' => 11, - 'end_line' => 11, - 'class' => '\My_Class', - 'static' => true, - ) - ); - - $this->assertFunctionNotUsesFunction( - 'sub_test' - , array( - 'name' => 'a_function', - 'line' => 5, - 'end_line' => 5, - ) - ); - - $this->assertFunctionNotUsesFunction( - 'sub_test' - , array( - 'name' => 'sub_test', - 'line' => 14, - 'end_line' => 14, - ) - ); - - $this->assertFunctionNotUsesMethod( - 'sub_test' - , array( - 'name' => 'do_things', - 'line' => 16, - 'end_line' => 16, - ) - ); - } - - - /** - * Test that the uses data of the outer method is correct. - */ - public function test_method_uses_correct() { - - $this->assertMethodUsesMethod( - 'My_Class' - , 'a_method' - , array( - 'name' => 'do_it', - 'line' => 23, - 'end_line' => 23, - 'class' => '\My_Class', - 'static' => false, - ) - ); - - $this->assertMethodUsesFunction( - 'My_Class' - , 'a_method' - , array( - 'name' => 'do_things', - 'line' => 32, - 'end_line' => 32, - ) - ); - - $this->assertMethodNotUsesFunction( - 'My_Class' - , 'a_method' - , array( - 'name' => 'b_function', - 'line' => 27, - 'end_line' => 27, - ) - ); - - $this->assertMethodNotUsesMethod( - 'My_Class' - , 'a_method' - , array( - 'name' => 'a_method', - 'line' => 29, - 'end_line' => 29, - 'class' => '\My_Class', - 'static' => true, - ) - ); - } - - /** - * Test that the usages of the nested function within a method is correct. - */ - public function test_nested_function_in_method_uses_correct() { - - $this->assertFunctionUsesFunction( - 'sub_method_test' - , array( - 'name' => 'b_function', - 'line' => 27, - 'end_line' => 27, - ) - ); - - $this->assertFunctionUsesMethod( - 'sub_method_test' - , array( - 'name' => 'a_method', - 'line' => 29, - 'end_line' => 29, - 'class' => '\My_Class', - 'static' => true, - ) - ); - - $this->assertFunctionNotUsesMethod( - 'sub_method_test' - , array( - 'name' => 'do_it', - 'line' => 23, - 'end_line' => 23, - 'class' => '\My_Class', - 'static' => false, - ) - ); - - $this->assertFunctionNotUsesFunction( - 'sub_method_test' - , array( - 'name' => 'do_things', - 'line' => 32, - 'end_line' => 32, - ) - ); - } +class Export_Nested_Function_Use extends Export_UnitTestCase +{ + /** + * Test that the uses data of the outer function is correct. + */ + public function test_top_function_uses_correct() { + $this->assertFunctionUsesFunction( + 'test', + [ + 'name' => 'a_function', + 'line' => 5, + 'end_line' => 5, + ] + ); + + $this->assertFunctionUsesFunction( + 'test', + [ + 'name' => 'sub_test', + 'line' => 14, + 'end_line' => 14, + ] + ); + + $this->assertFunctionUsesMethod( + 'test', + [ + 'name' => 'do_things', + 'line' => 16, + 'end_line' => 16, + 'class' => '\My_Class', + 'static' => true, + ] + ); + + $this->assertFunctionNotUsesFunction( + 'test', + [ + 'name' => 'b_function', + 'line' => 9, + 'end_line' => 9, + ] + ); + + $this->assertFunctionNotUsesMethod( + 'test', + [ + 'name' => 'static_method', + 'line' => 11, + 'end_line' => 11, + 'class' => '\My_Class', + 'static' => true, + ] + ); + } + + /** + * Test that the usages of the nested function is correct. + */ + public function test_nested_function_uses_correct() { + $this->assertFunctionUsesFunction( + 'sub_test', + [ + 'name' => 'b_function', + 'line' => 9, + 'end_line' => 9, + ] + ); + + $this->assertFunctionUsesMethod( + 'sub_test', + [ + 'name' => 'static_method', + 'line' => 11, + 'end_line' => 11, + 'class' => '\My_Class', + 'static' => true, + ] + ); + + $this->assertFunctionNotUsesFunction( + 'sub_test', + [ + 'name' => 'a_function', + 'line' => 5, + 'end_line' => 5, + ] + ); + + $this->assertFunctionNotUsesFunction( + 'sub_test', + [ + 'name' => 'sub_test', + 'line' => 14, + 'end_line' => 14, + ] + ); + + $this->assertFunctionNotUsesMethod( + 'sub_test', + [ + 'name' => 'do_things', + 'line' => 16, + 'end_line' => 16, + ] + ); + } + + /** + * Test that the uses data of the outer method is correct. + */ + public function test_method_uses_correct() { + $this->assertMethodUsesMethod( + 'My_Class', + 'a_method', + [ + 'name' => 'do_it', + 'line' => 23, + 'end_line' => 23, + 'class' => '\My_Class', + 'static' => false, + ] + ); + + $this->assertMethodUsesFunction( + 'My_Class', + 'a_method', + [ + 'name' => 'do_things', + 'line' => 32, + 'end_line' => 32, + ] + ); + + $this->assertMethodNotUsesFunction( + 'My_Class', + 'a_method', + [ + 'name' => 'b_function', + 'line' => 27, + 'end_line' => 27, + ] + ); + + $this->assertMethodNotUsesMethod( + 'My_Class', + 'a_method', + [ + 'name' => 'a_method', + 'line' => 29, + 'end_line' => 29, + 'class' => '\My_Class', + 'static' => true, + ] + ); + } + + /** + * Test that the usages of the nested function within a method is correct. + */ + public function test_nested_function_in_method_uses_correct() { + $this->assertFunctionUsesFunction( + 'sub_method_test', + [ + 'name' => 'b_function', + 'line' => 27, + 'end_line' => 27, + ] + ); + + $this->assertFunctionUsesMethod( + 'sub_method_test', + [ + 'name' => 'a_method', + 'line' => 29, + 'end_line' => 29, + 'class' => '\My_Class', + 'static' => true, + ] + ); + + $this->assertFunctionNotUsesMethod( + 'sub_method_test', + [ + 'name' => 'do_it', + 'line' => 23, + 'end_line' => 23, + 'class' => '\My_Class', + 'static' => false, + ] + ); + + $this->assertFunctionNotUsesFunction( + 'sub_method_test', + [ + 'name' => 'do_things', + 'line' => 32, + 'end_line' => 32, + ] + ); + } } diff --git a/tests/phpunit/tests/import/file.php b/tests/phpunit/tests/import/file.php index 5b073d7..2654ac0 100644 --- a/tests/phpunit/tests/import/file.php +++ b/tests/phpunit/tests/import/file.php @@ -11,128 +11,126 @@ * * @group import */ -class File_Import_Test extends Import_UnitTestCase { - - /** - * Test that the term is created for this file. - */ - public function test_file_term_created() { - - $terms = get_terms( - $this->importer->taxonomy_file - , array( 'hide_empty' => false ) - ); - - $this->assertCount( 1, $terms ); - - $term = $terms[0]; - - $this->assertEquals( 'file.inc', $term->name ); - $this->assertEquals( 'file-inc', $term->slug ); - } - - /** - * Test that a post is created for the function. - */ - public function test_function_post_created() { - - $posts = get_posts( - array( 'post_type' => $this->importer->post_type_function ) - ); - - $this->assertCount( 1, $posts ); - - $post = $posts[0]; - - // Check that the post attributes are correct. - $this->assertEquals( - '

    This function is just here for tests. This is its longer description.

    ' - , $post->post_content - ); - $this->assertEquals( 'This is a function summary.', $post->post_excerpt ); - $this->assertEquals( 'wp_parser_test_func', $post->post_name ); - $this->assertEquals( 0, $post->post_parent ); - $this->assertEquals( 'wp_parser_test_func', $post->post_title ); - - // It should be assigned to the file's taxonomy term. - $terms = wp_get_object_terms( - $post->ID - , $this->importer->taxonomy_file - ); - - $this->assertCount( 1, $terms ); - $this->assertEquals( 'file.inc', $terms[0]->name ); - - // It should be assigned to the correct @since taxonomy term. - $terms = wp_get_object_terms( - $post->ID - , $this->importer->taxonomy_since_version - ); - - $this->assertCount( 1, $terms ); - $this->assertEquals( '1.4.0', $terms[0]->name ); - - // It should be assigned the correct @package taxonomy term. - $terms = wp_get_object_terms( - $post->ID - , $this->importer->taxonomy_package - ); - - $this->assertCount( 1, $terms ); - $this->assertEquals( 'Something', $terms[0]->name ); - - // Check that the metadata was imported. - $this->assertEquals( - array( - array( - 'name' => '$var', - 'default' => null, - 'type' => '', - ), - array( - 'name' => '$ids', - 'default' => 'array()', - 'type' => 'array' , - ), - ) - , get_post_meta( $post->ID, '_wp-parser_args', true ) - ); - - $this->assertEquals( - 25 - , get_post_meta( $post->ID, '_wp-parser_line_num', true ) - ); - - $this->assertEquals( - 28 - , get_post_meta( $post->ID, '_wp-parser_end_line_num', true ) - ); - - $this->assertEquals( - array( - array( - 'name' => 'since', - 'content' => '1.4.0', - ), - array( - 'name' => 'param', - 'content' => 'A string variable which is the first parameter.', - 'types' => array( 'string' ), - 'variable' => '$var', - ), - array( - 'name' => 'param', - 'content' => 'An array of user IDs.', - 'types' => array( 'int[]' ), - 'variable' => '$ids', - ), - array( - 'name' => 'return', - 'content' => 'The return type is random. (Not really.)', - 'types' => array( 'mixed' ), - ), - ) - , get_post_meta( $post->ID, '_wp-parser_tags', true ) - ); - } +class File_Import_Test extends Import_UnitTestCase +{ + /** + * Test that the term is created for this file. + */ + public function test_file_term_created() { + $terms = get_terms( + $this->importer->taxonomy_file, + ['hide_empty' => false] + ); + + $this->assertCount(1, $terms); + + $term = $terms[0]; + + $this->assertEquals('file.inc', $term->name); + $this->assertEquals('file-inc', $term->slug); + } + + /** + * Test that a post is created for the function. + */ + public function test_function_post_created() { + $posts = get_posts( + ['post_type' => $this->importer->post_type_function] + ); + + $this->assertCount(1, $posts); + + $post = $posts[0]; + + // Check that the post attributes are correct. + $this->assertEquals( + '

    This function is just here for tests. This is its longer description.

    ', + $post->post_content + ); + $this->assertEquals('This is a function summary.', $post->post_excerpt); + $this->assertEquals('wp_parser_test_func', $post->post_name); + $this->assertEquals(0, $post->post_parent); + $this->assertEquals('wp_parser_test_func', $post->post_title); + + // It should be assigned to the file's taxonomy term. + $terms = wp_get_object_terms( + $post->ID, + $this->importer->taxonomy_file + ); + + $this->assertCount(1, $terms); + $this->assertEquals('file.inc', $terms[0]->name); + + // It should be assigned to the correct @since taxonomy term. + $terms = wp_get_object_terms( + $post->ID, + $this->importer->taxonomy_since_version + ); + + $this->assertCount(1, $terms); + $this->assertEquals('1.4.0', $terms[0]->name); + + // It should be assigned the correct @package taxonomy term. + $terms = wp_get_object_terms( + $post->ID, + $this->importer->taxonomy_package + ); + + $this->assertCount(1, $terms); + $this->assertEquals('Something', $terms[0]->name); + + // Check that the metadata was imported. + $this->assertEquals( + [ + [ + 'name' => '$var', + 'default' => null, + 'type' => '', + ], + [ + 'name' => '$ids', + 'default' => 'array()', + 'type' => 'array', + ], + ], + get_post_meta($post->ID, '_wp-parser_args', true) + ); + + $this->assertEquals( + 25, + get_post_meta($post->ID, '_wp-parser_line_num', true) + ); + + $this->assertEquals( + 28, + get_post_meta($post->ID, '_wp-parser_end_line_num', true) + ); + + $this->assertEquals( + [ + [ + 'name' => 'since', + 'content' => '1.4.0', + ], + [ + 'name' => 'param', + 'content' => 'A string variable which is the first parameter.', + 'types' => ['string'], + 'variable' => '$var', + ], + [ + 'name' => 'param', + 'content' => 'An array of user IDs.', + 'types' => ['int[]'], + 'variable' => '$ids', + ], + [ + 'name' => 'return', + 'content' => 'The return type is random. (Not really.)', + 'types' => ['mixed'], + ], + ], + get_post_meta($post->ID, '_wp-parser_tags', true) + ); + } } diff --git a/tests/source/actions.php b/tests/source/actions.php index c28c32d..4b5cecc 100644 --- a/tests/source/actions.php +++ b/tests/source/actions.php @@ -12,6 +12,7 @@ * @param mixed $old_value The old option value. * @param mixed $value The new option value. */ + do_action('good_doc_static_action', $option, $old_value, $value); /** diff --git a/tests/source/bad-class-doc.php b/tests/source/bad-class-doc.php index 076fa07..a89f1e2 100644 --- a/tests/source/bad-class-doc.php +++ b/tests/source/bad-class-doc.php @@ -34,4 +34,4 @@ class No_Package_Class */ class No_Description_Class { -} \ No newline at end of file +} diff --git a/tests/source/class-property-doc.php b/tests/source/class-property-doc.php index 141b16c..da53490 100644 --- a/tests/source/class-property-doc.php +++ b/tests/source/class-property-doc.php @@ -88,4 +88,4 @@ class Bad_Property_Doc * @var array */ public $public_missing_access_property = 'string'; -} \ No newline at end of file +} diff --git a/tests/source/class_method_doc.php b/tests/source/class_method_doc.php index 60944b9..7b318b6 100644 --- a/tests/source/class_method_doc.php +++ b/tests/source/class_method_doc.php @@ -24,8 +24,7 @@ class Various_Method_Docs_Class * @param mixed $data Optional. Error data. * @return WP_Error */ - public function public_method_missing_description($code = '', $message = '', $data = '') - { + public function public_method_missing_description($code = '', $message = '', $data = '') { } /** @@ -44,8 +43,7 @@ public function public_method_missing_description($code = '', $message = '', $da * @param mixed $data Optional. Error data. * @return WP_Error */ - public function public_method_missing_since($code = '', $message = '', $data = '') - { + public function public_method_missing_since($code = '', $message = '', $data = '') { } /** @@ -62,8 +60,7 @@ public function public_method_missing_since($code = '', $message = '', $data = ' * * @return WP_Error */ - public function public_method_missing_param($code = '', $message = '', $data = '') - { + public function public_method_missing_param($code = '', $message = '', $data = '') { } /** @@ -82,8 +79,7 @@ public function public_method_missing_param($code = '', $message = '', $data = ' * @param string $message Error message * @param mixed $data Optional. Error data. */ - public function public_method_missing_return($code = '', $message = '', $data = '') - { + public function public_method_missing_return($code = '', $message = '', $data = '') { } /** @@ -102,8 +98,7 @@ public function public_method_missing_return($code = '', $message = '', $data = * @param mixed $data Optional. Error data. * @return WP_Error */ - public function public_method_missing_access($code = '', $message = '', $data = '') - { + public function public_method_missing_access($code = '', $message = '', $data = '') { } /** @@ -122,8 +117,7 @@ public function public_method_missing_access($code = '', $message = '', $data = * @param mixed $data Optional. Error data. * @return WP_Error */ - public function public_method_missing_see($code = '', $message = '', $data = '') - { + public function public_method_missing_see($code = '', $message = '', $data = '') { } /** @@ -142,8 +136,7 @@ public function public_method_missing_see($code = '', $message = '', $data = '') * @param mixed $data Optional. Error data. * @return WP_Error */ - public function public_method_missing_link($code = '', $message = '', $data = '') - { + public function public_method_missing_link($code = '', $message = '', $data = '') { } /** @@ -162,8 +155,7 @@ public function public_method_missing_link($code = '', $message = '', $data = '' * @param mixed $data Optional. Error data. * @return WP_Error */ - public function public_method_missing_global($code = '', $message = '', $data = '') - { + public function public_method_missing_global($code = '', $message = '', $data = '') { } /** @@ -179,8 +171,7 @@ public function public_method_missing_global($code = '', $message = '', $data = * @param mixed $data Optional. Error data. * @return WP_Error */ - protected function protected_method_missing_description($code = '', $message = '', $data = '') - { + protected function protected_method_missing_description($code = '', $message = '', $data = '') { } /** @@ -199,8 +190,7 @@ protected function protected_method_missing_description($code = '', $message = ' * @param mixed $data Optional. Error data. * @return WP_Error */ - protected function protected_method_missing_since($code = '', $message = '', $data = '') - { + protected function protected_method_missing_since($code = '', $message = '', $data = '') { } /** @@ -217,8 +207,7 @@ protected function protected_method_missing_since($code = '', $message = '', $da * * @return WP_Error */ - protected function protected_method_missing_param($code = '', $message = '', $data = '') - { + protected function protected_method_missing_param($code = '', $message = '', $data = '') { } /** @@ -237,8 +226,7 @@ protected function protected_method_missing_param($code = '', $message = '', $da * @param string $message Error message * @param mixed $data Optional. Error data. */ - protected function protected_method_missing_return($code = '', $message = '', $data = '') - { + protected function protected_method_missing_return($code = '', $message = '', $data = '') { } /** @@ -257,8 +245,7 @@ protected function protected_method_missing_return($code = '', $message = '', $d * @param mixed $data Optional. Error data. * @return WP_Error */ - protected function protected_method_missing_access($code = '', $message = '', $data = '') - { + protected function protected_method_missing_access($code = '', $message = '', $data = '') { } /** @@ -277,8 +264,7 @@ protected function protected_method_missing_access($code = '', $message = '', $d * @param mixed $data Optional. Error data. * @return WP_Error */ - protected function protected_method_missing_see($code = '', $message = '', $data = '') - { + protected function protected_method_missing_see($code = '', $message = '', $data = '') { } /** @@ -297,8 +283,7 @@ protected function protected_method_missing_see($code = '', $message = '', $data * @param mixed $data Optional. Error data. * @return WP_Error */ - protected function protected_method_missing_link($code = '', $message = '', $data = '') - { + protected function protected_method_missing_link($code = '', $message = '', $data = '') { } /** @@ -317,8 +302,7 @@ protected function protected_method_missing_link($code = '', $message = '', $dat * @param mixed $data Optional. Error data. * @return WP_Error */ - protected function protected_method_missing_global($code = '', $message = '', $data = '') - { + protected function protected_method_missing_global($code = '', $message = '', $data = '') { } /** @@ -334,8 +318,7 @@ protected function protected_method_missing_global($code = '', $message = '', $d * @param mixed $data Optional. Error data. * @return WP_Error */ - private function private_method_missing_description($code = '', $message = '', $data = '') - { + private function private_method_missing_description($code = '', $message = '', $data = '') { } /** @@ -354,8 +337,7 @@ private function private_method_missing_description($code = '', $message = '', $ * @param mixed $data Optional. Error data. * @return WP_Error */ - private function private_method_missing_since($code = '', $message = '', $data = '') - { + private function private_method_missing_since($code = '', $message = '', $data = '') { } /** @@ -372,8 +354,7 @@ private function private_method_missing_since($code = '', $message = '', $data = * * @return WP_Error */ - private function private_method_missing_param($code = '', $message = '', $data = '') - { + private function private_method_missing_param($code = '', $message = '', $data = '') { } /** @@ -392,8 +373,7 @@ private function private_method_missing_param($code = '', $message = '', $data = * @param string $message Error message * @param mixed $data Optional. Error data. */ - private function private_method_missing_return($code = '', $message = '', $data = '') - { + private function private_method_missing_return($code = '', $message = '', $data = '') { } /** @@ -412,8 +392,7 @@ private function private_method_missing_return($code = '', $message = '', $data * @param mixed $data Optional. Error data. * @return WP_Error */ - private function private_method_missing_access($code = '', $message = '', $data = '') - { + private function private_method_missing_access($code = '', $message = '', $data = '') { } /** @@ -432,8 +411,7 @@ private function private_method_missing_access($code = '', $message = '', $data * @param mixed $data Optional. Error data. * @return WP_Error */ - private function private_method_missing_see($code = '', $message = '', $data = '') - { + private function private_method_missing_see($code = '', $message = '', $data = '') { } /** @@ -452,8 +430,7 @@ private function private_method_missing_see($code = '', $message = '', $data = ' * @param mixed $data Optional. Error data. * @return WP_Error */ - private function private_method_missing_link($code = '', $message = '', $data = '') - { + private function private_method_missing_link($code = '', $message = '', $data = '') { } /** @@ -472,7 +449,6 @@ private function private_method_missing_link($code = '', $message = '', $data = * @param mixed $data Optional. Error data. * @return WP_Error */ - private function private_method_missing_global($code = '', $message = '', $data = '') - { + private function private_method_missing_global($code = '', $message = '', $data = '') { } -} \ No newline at end of file +} diff --git a/tests/source/deprecated-file.php b/tests/source/deprecated-file.php index aa4c5d4..0a5baae 100644 --- a/tests/source/deprecated-file.php +++ b/tests/source/deprecated-file.php @@ -1,28 +1,31 @@ relate_method4(); + $wpdb->relate_method4(); } function relate_function5() { - wpdb::relate_method2()->some_function(); + wpdb::relate_method2()->some_function(); } function relate_function6() { - wp_screen()->relate_method1(); + wp_screen()->relate_method1(); } -class wpdb { - - public function __construct() {} - - public static function relate_method1() { - self::relate_method2(); - } - - public static function relate_method2() { - /** - * Filter a aCustomize setting value in un-slashed form. - * - * @since 3.5.0 - * - * @param mixed $value Value of the setting. - * @param WP_Customize_Setting $this WP_Customize_Setting instance. - */ - $meh = apply_filters( 'meh-hook', $meh ); - } - - public static function relate_method3() { - relate_function1(); - } - - public function relate_method4() { - relate_function2(); - } - - public function relate_method5() { - $this->relate_method4(); - } - - public static function relate_method6() { - wpdb::relate_method1(); - } - - public static function relate_method7() { - global $wpdb; - - $wpdb->relate_method5(); - } +class wpdb +{ + public function __construct() { + } + + public static function relate_method1() { + self::relate_method2(); + } + + public static function relate_method2() { + /** + * Filter a aCustomize setting value in un-slashed form. + * + * @since 3.5.0 + * + * @param mixed $value Value of the setting. + * @param WP_Customize_Setting $this WP_Customize_Setting instance. + */ + $meh = apply_filters('meh-hook', $meh); + } + + public static function relate_method3() { + relate_function1(); + } + + public function relate_method4() { + relate_function2(); + } + + public function relate_method5() { + $this->relate_method4(); + } + + public static function relate_method6() { + wpdb::relate_method1(); + } + + public static function relate_method7() { + global $wpdb; + + $wpdb->relate_method5(); + } } -class WP_Screen { - public function relate_method1() {} +class WP_Screen +{ + public function relate_method1() { + } } From 7c1297acac6a419b554c6ab3efc8e2e00cb26f3c Mon Sep 17 00:00:00 2001 From: Seiyu Inoue Date: Tue, 14 Sep 2021 18:30:02 +0900 Subject: [PATCH 25/66] merge --- src/Master.php | 1 + src/SourceTypeTerm.php | 264 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 265 insertions(+) create mode 100644 src/SourceTypeTerm.php diff --git a/src/Master.php b/src/Master.php index 5113058..72ce451 100644 --- a/src/Master.php +++ b/src/Master.php @@ -24,6 +24,7 @@ public static function init() { (new ParsedContent())->init(); Queries::init(); Formatting::init(); + SourceTypeTerm::init(); if (is_admin()) { Admin::init(); } diff --git a/src/SourceTypeTerm.php b/src/SourceTypeTerm.php new file mode 100644 index 0000000..ff613a7 --- /dev/null +++ b/src/SourceTypeTerm.php @@ -0,0 +1,264 @@ + + * @return void + */ + public static function init() { + // Add SorceTypeTerm Control + $source_type_tax = avcpdp_get_source_type_taxonomy_slug(); + add_action("{$source_type_tax}_term_edit_form_tag", [get_class(), 'addFormAttributeEncTypeMultiPart']); + add_action("{$source_type_tax}_edit_form_fields", [get_class(), 'addFieldsItemImage'], 11, 1); + add_action("edit_{$source_type_tax}", [get_class(), 'updateItemImageTermMeta'], 11, 1); + + // Upload svg + add_filter('upload_mimes', [get_class(), 'addMimesTypeSvg'], 99); + add_filter('wp_check_filetype_and_ext', [get_class(), 'wpCheckFileTypeSvg'], 10, 4); + add_filter('wp_generate_attachment_metadata', [get_class(), 'generateSvgAttachmentMetaData'], 10, 3); + add_filter('wp_prepare_attachment_for_js', [get_class(), 'response4Svg'], 10, 2); + } + + /** + * Adds form attribute to term edit page + * + * @author Seiyu Inoue + * @return void + */ + public static function addFormAttributeEncTypeMultiPart() { + echo ' enctype="multipart/form-data"'; + } + + /** + * Adds item image pick field to term edit page + * + * @author Seiyu Inoue + * @return void + */ + public static function addFieldsItemImage($term) { + $max_upload_size = wp_max_upload_size() ?: 0; + + // wp_nonce_field('item_image', 'item_image_file_nonce'); + // $id = get_the_ID(); + // $post_meta = get_post_meta($id, 'item_image', true); + // if ($post_meta) { + // echo '

    ' . $post_meta['url'] . '

    '; + // } + $welitempid = (int)get_term_meta($term->term_id, 'item_image', true); + $test = get_term_meta($term->term_id, 'item_image', true); + + ?> + + + + +

    +

    + +

    + + + + * @param int $term_id + * @return void + */ + public static function updateItemImageTermMeta($term_id) { + $term_meta = get_term_meta($term_id, 'item_image', true); + if ($term_meta) { + @unlink($term_meta['file']); + } + if (empty($_FILES['item_image'])) { + return; + } + + $file = $_FILES['item_image']; + $file_type = wp_check_filetype($file['name']); + if ($file_type['ext'] != 'svg') { + wp_die('Unsupported file type. (Supported file type: .svg)'); + } + + if (!function_exists('wp_handle_upload')) { + require_once(ABSPATH . 'wp-admin/includes/file.php'); + } + + $overrides = ['test_form' => false]; + $upload = wp_handle_upload($file, $overrides); + + if (isset($upload['error']) && $upload['error']) { + wp_die('Upload error : ' . $upload['error']); + } + + $term_meta = [ + 'file' => $upload['file'], + 'url' => $upload['url'], + 'type' => $upload['type'], + ]; + update_term_meta($term_id, 'item_image', $term_meta); + } + + /** + * Add mime type svg + * + * @author Seiyu Inoue + * @param array $mimes Optional. Array of allowed mime types keyed by their file extension regex. + * @return array $mimes Optional. Array of allowed mime types keyed by their file extension regex. + */ + public static function addMimesTypeSvg($mimes = []) { + $mimes['svg'] = 'image/svg+xml'; + return $mimes; + } + + /** + * Additional check corresponding to file extension svg + * + * @author Seiyu Inoue + * @param mixed $checked filter wp_check_filetype_and_ext return args + * @param mixed $file Full path to the file. + * @param mixed $filename The name of the file (may differ from $file due to $file being in a tmp directory). + * @param mixed $mimes Optional. Array of allowed mime types keyed by their file extension regex. + * @return mixed { + * Values for the extension, mime type, and corrected filename. + * @type string|false $ext File extension, or false if the file doesn't match a mime type. + * @type string|false $type File mime type, or false if the file doesn't match a mime type. + * @type string|false $proper_filename File name with its correct extension, or false if it cannot be determined. + * } + */ + public static function wpCheckFileTypeSvg($checked, $file, $filename, $mimes) { + if ($checked['type']) { + return $checked; + } + + $check_filetype = wp_check_filetype($filename, $mimes); + $ext = $check_filetype['ext']; + $type = $check_filetype['type']; + $proper_filename = $filename; + + if ($type && 0 === strpos($type, 'image/') && $ext !== 'svg') { + $ext = $type = false; + } + $checked = compact('ext', 'type', 'proper_filename'); + return $checked; + } + + /** + * Generate + * + * @author Seiyu Inoue + * @param mixed $metadata + * @param mixed $attachment_id + * @return mixed + */ + public static function generateSvgAttachmentMetaData($metadata, $attachment_id) { + $mime = get_post_mime_type($attachment_id); + if ($mime !== 'image/svg+xml') { + return $metadata; + } + + $svg_path = get_attached_file($attachment_id); + $upload_dir = wp_upload_dir(); + // get the path relative to /uploads/ - found no better way: + $relative_path = str_replace($upload_dir['basedir'], '', $svg_path); + $filename = basename($svg_path); + $dimensions = $this->getSvgDimensions($svg_path); + $metadata = [ + 'width' => intval($dimensions->width), + 'height' => intval($dimensions->height), + 'file' => $relative_path, + ]; + + $sizes = []; + foreach (get_intermediate_image_sizes() as $s) { + $sizes[$s] = [ + 'width' => '', + 'height' => '', + 'crop' => false, + ]; + $sizes[$s]['width'] = isset($_wp_additional_image_sizes[$s]['width']) ? + intval($_wp_additional_image_sizes[$s]['width']) : get_option("{$s}_size_w"); + $sizes[$s]['height'] = isset($_wp_additional_image_sizes[$s]['height']) ? + intval($_wp_additional_image_sizes[$s]['height']) : get_option("{$s}_size_h"); + $sizes[$s]['crop'] = isset($_wp_additional_image_sizes[$s]['crop']) ? + intval($_wp_additional_image_sizes[$s]['crop']) : get_option("{$s}_crop"); + $sizes[$s]['file'] = $filename; + $sizes[$s]['mime-type'] = 'image/svg+xml'; + } + $metadata['sizes'] = $sizes; + + return $metadata; + } + + /** + * Response + * + * @author Seiyu Inoue + * @param mixed $response + * @param mixed $attachment + * @return mixed $response + */ + public static function response4Svg($response, $attachment) { + if ($response['mime'] !== 'image/svg+xml' && !empty($response['sizes'])) { + return $response; + } + $svg_path = get_attached_file($attachment->ID); + // If SVG is external, use the URL instead of the path + $svg_path = file_exists($svg_path) ?: $response['url']; + $dimensions = $this->getSvgDimensions($svg_path); + $response['sizes'] = [ + 'full' => [ + 'url' => $response['url'], + 'width' => $dimensions->width, + 'height' => $dimensions->height, + 'orientation' => $dimensions->width > $dimensions->height ? 'landscape' : 'portrait', + ], + ]; + + return $response; + } + + /** + * Get size information inside svg file + * + * @author Seiyu Inoue + * @param mixed $svg_path svgPath + * @return object { + * svg file size information. + * @type string $width File width. + * @type string $height File height. + * } + */ + public static function getSvgDimensions($svg_path) { + $svg = simplexml_load_file($svg_path); + + if ($svg === false) { + $width = '0'; + $height = '0'; + } else { + $attributes = $svg->attributes(); + $width = (string)$attributes->width; + $height = (string)$attributes->height; + } + + return (object)[ + 'width' => $width, + 'height' => $height, + ]; + } +} From 487441efea9f10d6134451ddf808e2a782ea897f Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Tue, 14 Sep 2021 19:08:26 +0900 Subject: [PATCH 26/66] feat: add ability to trash no longer existing references on import --- src/CLI/Commands.php | 22 +++++++-- src/Importer/Importer.php | 57 ++++++++++++++++++++--- src/Models/ImportConfig.php | 91 +++++++++++++++++++++++++++++++++++++ src/api-functions.php | 41 +++++++++++------ 4 files changed, 189 insertions(+), 22 deletions(-) create mode 100644 src/Models/ImportConfig.php diff --git a/src/CLI/Commands.php b/src/CLI/Commands.php index 038b7c2..66f96fc 100644 --- a/src/CLI/Commands.php +++ b/src/CLI/Commands.php @@ -4,6 +4,7 @@ use Aivec\Plugins\DocParser\Importer\Importer; use Aivec\Plugins\DocParser\Importer\Parser; +use Aivec\Plugins\DocParser\Models\ImportConfig; use WP_CLI; use WP_CLI_Command; @@ -78,7 +79,7 @@ public function import($args, $assoc_args) { * Generate JSON containing the PHPDoc markup, convert it into WordPress posts, and insert into DB. * * @subcommand create - * @synopsis [--quick] [--import-internal] [--user] + * @synopsis [--quick] [--import-internal] [--user] [--trash-old-refs] * * @param array $args * @param array $assoc_args @@ -148,9 +149,24 @@ public function create($args, $assoc_args) { exit; } + if (isset($parser_meta['exclude'])) { + if (!is_array($parser_meta['exclude'])) { + WP_CLI::error('"exclude" must be an array of strings.'); + exit; + } + + foreach ($parser_meta['exclude'] as $target) { + if (!is_string($target)) { + WP_CLI::error('"exclude" must be an array of strings.'); + exit; + } + } + } + $data = $this->_get_phpdoc_data($directory, 'array'); $data = [ - 'meta' => $parser_meta, + 'config' => new ImportConfig($parser_meta['type'], $parser_meta['name'], $parser_meta['exclude']), + 'trash_old_refs' => isset($assoc_args['trash-old-refs']) && $assoc_args['trash-old-refs'] === true, 'files' => $data, ]; @@ -200,7 +216,7 @@ protected function _do_import(array $data, $skip_sleep = false, $import_ignored } // Run the importer - $importer = new Importer($data['meta']); + $importer = new Importer($data['config'], $data['trash_old_refs']); $importer->setLogger(new Logger()); $importer->import($data['files'], $skip_sleep, $import_ignored); diff --git a/src/Importer/Importer.php b/src/Importer/Importer.php index 07826d0..bff755c 100644 --- a/src/Importer/Importer.php +++ b/src/Importer/Importer.php @@ -2,6 +2,7 @@ namespace Aivec\Plugins\DocParser\Importer; +use Aivec\Plugins\DocParser\Models\ImportConfig; use Aivec\Plugins\DocParser\Registrations; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerAwareTrait; @@ -26,6 +27,13 @@ class Importer implements LoggerAwareInterface 'taxonomy_source_type' => Registrations::SOURCE_TYPE_TAX_SLUG, ]; + /** + * Whether to send old references to the trash or not + * + * @var bool + */ + public $trash_old_refs; + /** * Taxonomy name for files * @@ -126,14 +134,30 @@ class Importer implements LoggerAwareInterface */ protected $inserted_terms = []; + /** + * List of all inserted/updated post IDs + * + * @var array + */ + protected $inserted_posts = []; + + /** + * List of all posts IDs associated with the given source **before** import + * + * @var array + */ + protected $previous_posts = []; + /** * Constructor. Sets up post type/taxonomy names. * - * @param array $source_type_meta - * @param array $args Optional. Associative array; class property => value. + * @param ImportConfig $source_type_meta + * @param bool $trash_old_refs + * @param array $args Optional. Associative array; class property => value. */ - public function __construct(array $source_type_meta, array $args = []) { - $this->source_type_meta = $source_type_meta; + public function __construct(ImportConfig $source_type_meta, $trash_old_refs = false, array $args = []) { + $this->source_type_meta = $source_type_meta->jsonSerialize(); + $this->trash_old_refs = $trash_old_refs; $properties = wp_parse_args( $args, self::PROPERTY_MAP @@ -347,6 +371,15 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio $this->version = $this->importVersion(reset($ver_file)); } + if ($this->trash_old_refs === true) { + $previous_posts_q = avcpdp_get_all_parser_posts_for_source( + $this->source_type_meta['type'], + $this->source_type_meta['name'] + ); + $this->previous_posts = $previous_posts_q->get_posts(); + } + + // loop through files and start importing $root = ''; foreach ($data as $file) { $this->logger->info(sprintf('Processing file %1$s of %2$s "%3$s".', number_format_i18n($file_number), number_format_i18n($num_of_files), $file['path'])); @@ -380,6 +413,16 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio $this->logger->info('Updated option wp_parser_imported_wp_version: ' . $wp_version); } + if ($this->trash_old_refs === true) { + $this->logger->info('Trashing old references...'); + + foreach ($this->previous_posts as $ppost_id) { + if (!in_array($ppost_id, $this->inserted_posts, true)) { + wp_trash_post($ppost_id); + } + } + } + /* * Workaround for a WP core bug where hierarchical taxonomy caches are not being cleared * @@ -599,7 +642,7 @@ public function importHook(array $data, $parent_post_id = 0, $import_ignored = f * * @param array $data Class. * @param bool $import_ignored Optional; defaults to false. If true, functions marked `@ignore` will be imported. - * @return bool|int Post ID of this function, false if any failure. + * @return bool|int Post ID of this class, false if any failure. */ protected function importClass(array $data, $import_ignored = false) { // Insert this class @@ -648,7 +691,7 @@ protected function importClass(array $data, $import_ignored = false) { * method belongs to. Defaults to zero (no parent). * @param bool $import_ignored Optional; defaults to false. If true, functions * marked `@ignore` will be imported. - * @return bool|int Post ID of this function, false if any failure. + * @return bool|int Post ID of this method, false if any failure. */ protected function importMethod(array $data, $parent_post_id = 0, $import_ignored = false) { // Insert this method. @@ -1001,6 +1044,8 @@ public function importItem(array $data, $parent_post_id = 0, $import_ignored = f */ do_action('wp_parser_import_item', $post_id, $data, $post_data); + $this->inserted_posts[] = $post_id; + return $post_id; } diff --git a/src/Models/ImportConfig.php b/src/Models/ImportConfig.php new file mode 100644 index 0000000..6ed04c6 --- /dev/null +++ b/src/Models/ImportConfig.php @@ -0,0 +1,91 @@ + + * @param string $source_type + * @param string $name + * @param array $exclude + * @return void + */ + public function __construct($source_type, $name, $exclude = []) { + $this->source_type = $source_type; + $this->name = $name; + $this->exclude = $exclude; + } + + /** + * Serializes instance data for `json_encode` + * + * @author Evan D Shaw + * @return array + */ + public function jsonSerialize() { + return [ + 'type' => $this->source_type, + 'name' => $this->name, + 'exclude' => $this->exclude, + ]; + } + + /** + * Getter for `$this->source_type` + * + * @author Evan D Shaw + * @return string + */ + public function getSourceType() { + return $this->source_type; + } + + /** + * Getter for `$this->name` + * + * @author Evan D Shaw + * @return string + */ + public function getName() { + return $this->name; + } + + /** + * Getter for `$this->exclude` + * + * @author Evan D Shaw + * @return array + */ + public function getExclude() { + return $this->exclude; + } +} diff --git a/src/api-functions.php b/src/api-functions.php index 823f95e..1c37f8d 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -43,19 +43,6 @@ function avcpdp_is_parsed_post_type($post_type = null) { return in_array($post_type, avcpdp_get_parsed_post_types()); } -/** - * Checks if given post type is the code reference landing page post type. - * - * @author Evan D Shaw - * @param int|null $post_id Optional. The post ID. - * @return bool True if post has a parsed post type - */ -function avcpdp_is_reference_landing_page_post_type($post_id = null) { - $post_type = get_post_type($post_id); - - return $post_type === Aivec\Plugins\DocParser\Registrations::CODE_REFERENCE_POST_TYPE; -} - /** * Get the specific type of hook. * @@ -976,3 +963,31 @@ function avcpdp_get_param_translated_content($post_id, $key) { return $translated_key_val; } + +/** + * Returns all wp-parser-* posts associated with a given source type and name pair + * + * @author Evan D Shaw + * @param string $source_type + * @param string $source_name + * @return WP_Query + */ +function avcpdp_get_all_parser_posts_for_source($source_type, $source_name) { + $q = new WP_Query([ + 'fields' => 'ids', + 'post_status' => ['any'], + 'post_type' => avcpdp_get_parsed_post_types(), + 'posts_per_page' => -1, + 'tax_query' => [ + [ + 'taxonomy' => Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG, + 'field' => 'slug', + 'terms' => [$source_type, $source_name], + 'include_children' => false, + 'operator' => 'AND', + ], + ], + ]); + + return $q; +} From 70ae3b232f2db8d37a8282662f58aae316f74277 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 15 Sep 2021 09:48:35 +0900 Subject: [PATCH 27/66] feat: allow controlling file/folder exclusions with docparser-meta.json config --- plugin.php | 8 -------- src/CLI/Commands.php | 20 +++++++++++++++++++- src/Importer/Importer.php | 8 ++++++++ src/Models/ImportConfig.php | 22 +++++++++++++++++++++- 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/plugin.php b/plugin.php index b5380d9..0ee7199 100644 --- a/plugin.php +++ b/plugin.php @@ -24,14 +24,6 @@ Aivec\Plugins\DocParser\Master::init(); -add_filter('wp_parser_exclude_directories', function () { - return ['vendor', 'dist', 'tests', 'semantic', 'node_modules']; -}); - -add_filter('wp_parser_exclude_directories_strict', function () { - return true; -}); - register_activation_hook(__FILE__, ['P2P_Storage', 'init']); register_activation_hook(__FILE__, ['P2P_Storage', 'install']); register_activation_hook(__FILE__, function () { diff --git a/src/CLI/Commands.php b/src/CLI/Commands.php index 66f96fc..f2ec8b1 100644 --- a/src/CLI/Commands.php +++ b/src/CLI/Commands.php @@ -163,9 +163,27 @@ public function create($args, $assoc_args) { } } + if (isset($parser_meta['excludeStrict'])) { + if (!is_bool($parser_meta['excludeStrict'])) { + WP_CLI::error('"excludeStrict" must be a boolean.'); + exit; + } + } + + // handle file/folder exclusions + $exclude = !empty($parser_meta['exclude']) ? $parser_meta['exclude'] : []; + add_filter('wp_parser_exclude_directories', function () use ($exclude) { + return $exclude; + }); + + $exclude_strict = isset($parser_meta['excludeStrict']) ? (bool)$parser_meta['excludeStrict'] : false; + add_filter('wp_parser_exclude_directories_strict', function () use ($exclude_strict) { + return $exclude_strict; + }); + $data = $this->_get_phpdoc_data($directory, 'array'); $data = [ - 'config' => new ImportConfig($parser_meta['type'], $parser_meta['name'], $parser_meta['exclude']), + 'config' => new ImportConfig($parser_meta['type'], $parser_meta['name'], $exclude), 'trash_old_refs' => isset($assoc_args['trash-old-refs']) && $assoc_args['trash-old-refs'] === true, 'files' => $data, ]; diff --git a/src/Importer/Importer.php b/src/Importer/Importer.php index bff755c..4972b6b 100644 --- a/src/Importer/Importer.php +++ b/src/Importer/Importer.php @@ -24,6 +24,7 @@ class Importer implements LoggerAwareInterface 'taxonomy_namespace' => 'wp-parser-namespace', 'taxonomy_package' => 'wp-parser-package', 'taxonomy_since_version' => 'wp-parser-since', + 'taxonomy_version' => 'wp-parser-version', 'taxonomy_source_type' => Registrations::SOURCE_TYPE_TAX_SLUG, ]; @@ -55,6 +56,13 @@ class Importer implements LoggerAwareInterface */ public $taxonomy_since_version; + /** + * Taxonomy name for a sources version + * + * @var string + */ + public $taxonomy_version; + /** * Taxonomy name for an item's `@package/@subpackage` tags * diff --git a/src/Models/ImportConfig.php b/src/Models/ImportConfig.php index 6ed04c6..da129cb 100644 --- a/src/Models/ImportConfig.php +++ b/src/Models/ImportConfig.php @@ -30,6 +30,13 @@ class ImportConfig implements JsonSerializable */ private $exclude; + /** + * Whether to exclude a file/folder in subdirectories as well + * + * @var bool + */ + private $exclude_strict; + /** * Initializes an import config * @@ -37,12 +44,14 @@ class ImportConfig implements JsonSerializable * @param string $source_type * @param string $name * @param array $exclude + * @param bool $exclude_strict * @return void */ - public function __construct($source_type, $name, $exclude = []) { + public function __construct($source_type, $name, $exclude = [], $exclude_strict = false) { $this->source_type = $source_type; $this->name = $name; $this->exclude = $exclude; + $this->exclude_strict = $exclude_strict; } /** @@ -56,6 +65,7 @@ public function jsonSerialize() { 'type' => $this->source_type, 'name' => $this->name, 'exclude' => $this->exclude, + 'excludeStrict' => $this->exclude_strict, ]; } @@ -88,4 +98,14 @@ public function getName() { public function getExclude() { return $this->exclude; } + + /** + * Getter for `$this->exclude_strict` + * + * @author Evan D Shaw + * @return array + */ + public function getExcludeStrict() { + return $this->exclude_strict; + } } From c0273d97959241202e9b3e6f0d1cfebd60f44435 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 15 Sep 2021 12:39:37 +0900 Subject: [PATCH 28/66] feat: add config option to import the source's version number --- languages/messages.pot | 237 +++++++++++++++++++----------------- languages/wp-parser-en.mo | Bin 2601 -> 2601 bytes languages/wp-parser-en.po | 196 +++++++++++++++-------------- languages/wp-parser-ja.mo | Bin 6660 -> 7190 bytes languages/wp-parser-ja.po | 214 ++++++++++++++++---------------- src/CLI/Commands.php | 17 ++- src/Importer/Importer.php | 61 +++------- src/Models/ImportConfig.php | 32 ++++- src/ParsedContent.php | 5 +- src/api-functions.php | 59 ++++++--- 10 files changed, 442 insertions(+), 379 deletions(-) diff --git a/languages/messages.pot b/languages/messages.pot index d88c271..8d49ebe 100644 --- a/languages/messages.pot +++ b/languages/messages.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2021-09-14T16:32:24+09:00\n" +"POT-Creation-Date: 2021-09-15T10:16:52+09:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.5.0\n" "X-Domain: wp-parser\n" @@ -35,34 +35,34 @@ msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" msgstr "" #: src/api-functions.php:21 -#: src/Registrations.php:190 -#: src/Registrations.php:192 -#: src/Registrations.php:194 -#: src/Registrations.php:204 +#: src/Registrations.php:191 +#: src/Registrations.php:193 +#: src/Registrations.php:195 +#: src/Registrations.php:205 msgid "Classes" msgstr "" #: src/api-functions.php:22 -#: src/Registrations.php:130 -#: src/Registrations.php:132 -#: src/Registrations.php:134 -#: src/Registrations.php:144 +#: src/Registrations.php:131 +#: src/Registrations.php:133 +#: src/Registrations.php:135 +#: src/Registrations.php:145 msgid "Functions" msgstr "" #: src/api-functions.php:23 -#: src/Registrations.php:220 -#: src/Registrations.php:222 -#: src/Registrations.php:224 -#: src/Registrations.php:234 +#: src/Registrations.php:221 +#: src/Registrations.php:223 +#: src/Registrations.php:225 +#: src/Registrations.php:235 msgid "Hooks" msgstr "" #: src/api-functions.php:24 -#: src/Registrations.php:160 -#: src/Registrations.php:162 -#: src/Registrations.php:164 -#: src/Registrations.php:174 +#: src/Registrations.php:161 +#: src/Registrations.php:163 +#: src/Registrations.php:165 +#: src/Registrations.php:175 msgid "Methods" msgstr "" @@ -174,38 +174,38 @@ msgstr "" msgid "Post has an explanation." msgstr "" -#: src/Importer/Importer.php:307 +#: src/Importer/Importer.php:339 msgid "Functions Reference" msgstr "" -#: src/Importer/Importer.php:311 +#: src/Importer/Importer.php:343 msgid "Hooks Reference" msgstr "" -#: src/Importer/Relationships.php:97 -#: src/Importer/Relationships.php:157 +#: src/Importer/Relationships.php:100 +#: src/Importer/Relationships.php:160 msgid "Uses Functions" msgstr "" -#: src/Importer/Relationships.php:98 -#: src/Importer/Relationships.php:117 -#: src/Importer/Relationships.php:136 +#: src/Importer/Relationships.php:101 +#: src/Importer/Relationships.php:120 +#: src/Importer/Relationships.php:139 msgid "Used by Functions" msgstr "" -#: src/Importer/Relationships.php:116 -#: src/Importer/Relationships.php:177 +#: src/Importer/Relationships.php:119 +#: src/Importer/Relationships.php:180 msgid "Uses Methods" msgstr "" -#: src/Importer/Relationships.php:135 -#: src/Importer/Relationships.php:197 +#: src/Importer/Relationships.php:138 +#: src/Importer/Relationships.php:200 msgid "Uses Hooks" msgstr "" -#: src/Importer/Relationships.php:158 -#: src/Importer/Relationships.php:178 -#: src/Importer/Relationships.php:196 +#: src/Importer/Relationships.php:161 +#: src/Importer/Relationships.php:181 +#: src/Importer/Relationships.php:199 msgid "Used by Methods" msgstr "" @@ -218,7 +218,6 @@ msgid "Parsed Summary:" msgstr "" #: src/ParsedContent.php:121 -#: src/ParsedContent.php:148 msgid "Translated Summary:" msgstr "" @@ -226,6 +225,10 @@ msgstr "" msgid "Parsed Description:" msgstr "" +#: src/ParsedContent.php:148 +msgid "Translated Description:" +msgstr "" + #: src/ParsedContent.php:166 msgid "Tags (args, return)" msgstr "" @@ -249,301 +252,305 @@ msgstr "" msgid "Translated Return:" msgstr "" -#: src/Registrations.php:133 +#: src/Registrations.php:134 msgid "Function" msgstr "" -#: src/Registrations.php:135 +#: src/Registrations.php:136 msgid "New Function" msgstr "" -#: src/Registrations.php:136 -#: src/Registrations.php:166 -#: src/Registrations.php:196 -#: src/Registrations.php:226 -#: src/Registrations.php:259 +#: src/Registrations.php:137 +#: src/Registrations.php:167 +#: src/Registrations.php:197 +#: src/Registrations.php:227 +#: src/Registrations.php:260 msgid "Add New" msgstr "" -#: src/Registrations.php:137 +#: src/Registrations.php:138 msgid "Add New Function" msgstr "" -#: src/Registrations.php:138 +#: src/Registrations.php:139 msgid "Edit Function" msgstr "" -#: src/Registrations.php:139 +#: src/Registrations.php:140 msgid "View Function" msgstr "" -#: src/Registrations.php:140 +#: src/Registrations.php:141 msgid "Search Functions" msgstr "" -#: src/Registrations.php:141 +#: src/Registrations.php:142 msgid "No Functions found" msgstr "" -#: src/Registrations.php:142 +#: src/Registrations.php:143 msgid "No Functions found in trash" msgstr "" -#: src/Registrations.php:143 +#: src/Registrations.php:144 msgid "Parent Function" msgstr "" -#: src/Registrations.php:163 +#: src/Registrations.php:164 msgid "Method" msgstr "" -#: src/Registrations.php:165 +#: src/Registrations.php:166 msgid "New Method" msgstr "" -#: src/Registrations.php:167 +#: src/Registrations.php:168 msgid "Add New Method" msgstr "" -#: src/Registrations.php:168 +#: src/Registrations.php:169 msgid "Edit Method" msgstr "" -#: src/Registrations.php:169 +#: src/Registrations.php:170 msgid "View Method" msgstr "" -#: src/Registrations.php:170 +#: src/Registrations.php:171 msgid "Search Methods" msgstr "" -#: src/Registrations.php:171 +#: src/Registrations.php:172 msgid "No Methods found" msgstr "" -#: src/Registrations.php:172 +#: src/Registrations.php:173 msgid "No Methods found in trash" msgstr "" -#: src/Registrations.php:173 +#: src/Registrations.php:174 msgid "Parent Method" msgstr "" -#: src/Registrations.php:193 +#: src/Registrations.php:194 msgid "Class" msgstr "" -#: src/Registrations.php:195 +#: src/Registrations.php:196 msgid "New Class" msgstr "" -#: src/Registrations.php:197 +#: src/Registrations.php:198 msgid "Add New Class" msgstr "" -#: src/Registrations.php:198 +#: src/Registrations.php:199 msgid "Edit Class" msgstr "" -#: src/Registrations.php:199 +#: src/Registrations.php:200 msgid "View Class" msgstr "" -#: src/Registrations.php:200 +#: src/Registrations.php:201 msgid "Search Classes" msgstr "" -#: src/Registrations.php:201 +#: src/Registrations.php:202 msgid "No Classes found" msgstr "" -#: src/Registrations.php:202 +#: src/Registrations.php:203 msgid "No Classes found in trash" msgstr "" -#: src/Registrations.php:203 +#: src/Registrations.php:204 msgid "Parent Class" msgstr "" -#: src/Registrations.php:223 +#: src/Registrations.php:224 msgid "Hook" msgstr "" -#: src/Registrations.php:225 +#: src/Registrations.php:226 msgid "New Hook" msgstr "" -#: src/Registrations.php:227 +#: src/Registrations.php:228 msgid "Add New Hook" msgstr "" -#: src/Registrations.php:228 +#: src/Registrations.php:229 msgid "Edit Hook" msgstr "" -#: src/Registrations.php:229 +#: src/Registrations.php:230 msgid "View Hook" msgstr "" -#: src/Registrations.php:230 +#: src/Registrations.php:231 msgid "Search Hooks" msgstr "" -#: src/Registrations.php:231 +#: src/Registrations.php:232 msgid "No Hooks found" msgstr "" -#: src/Registrations.php:232 +#: src/Registrations.php:233 msgid "No Hooks found in trash" msgstr "" -#: src/Registrations.php:233 +#: src/Registrations.php:234 msgid "Parent Hook" msgstr "" -#: src/Registrations.php:253 -#: src/Registrations.php:255 -#: src/Registrations.php:257 -#: src/Registrations.php:266 +#: src/Registrations.php:254 +#: src/Registrations.php:256 +#: src/Registrations.php:258 +#: src/Registrations.php:267 msgid "Reference Landing Pages" msgstr "" -#: src/Registrations.php:256 +#: src/Registrations.php:257 msgid "Reference Landing Page" msgstr "" -#: src/Registrations.php:258 +#: src/Registrations.php:259 msgid "New Reference Landing Page" msgstr "" -#: src/Registrations.php:260 +#: src/Registrations.php:261 msgid "Add New Reference Landing Page" msgstr "" -#: src/Registrations.php:261 +#: src/Registrations.php:262 msgid "Edit Reference Landing Page" msgstr "" -#: src/Registrations.php:262 +#: src/Registrations.php:263 msgid "View Reference Landing Page" msgstr "" -#: src/Registrations.php:263 +#: src/Registrations.php:264 msgid "Search Reference Landing Pages" msgstr "" -#: src/Registrations.php:264 +#: src/Registrations.php:265 msgid "No Pages found" msgstr "" -#: src/Registrations.php:265 +#: src/Registrations.php:266 msgid "No Pages found in trash" msgstr "" -#: src/Registrations.php:301 -#: src/Registrations.php:303 -#: src/Registrations.php:317 +#: src/Registrations.php:302 +#: src/Registrations.php:304 +#: src/Registrations.php:318 msgid "Files" msgstr "" -#: src/Registrations.php:304 +#: src/Registrations.php:305 msgctxt "taxonomy general name" msgid "File" msgstr "" -#: src/Registrations.php:305 +#: src/Registrations.php:306 msgid "Search Files" msgstr "" -#: src/Registrations.php:307 +#: src/Registrations.php:308 msgid "All Files" msgstr "" -#: src/Registrations.php:308 +#: src/Registrations.php:309 msgid "Parent File" msgstr "" -#: src/Registrations.php:309 +#: src/Registrations.php:310 msgid "Parent File:" msgstr "" -#: src/Registrations.php:310 +#: src/Registrations.php:311 msgid "Edit File" msgstr "" -#: src/Registrations.php:311 +#: src/Registrations.php:312 msgid "Update File" msgstr "" -#: src/Registrations.php:312 #: src/Registrations.php:313 +#: src/Registrations.php:314 msgid "New File" msgstr "" -#: src/Registrations.php:314 +#: src/Registrations.php:315 msgid "Files separated by comma" msgstr "" -#: src/Registrations.php:315 +#: src/Registrations.php:316 msgid "Add or remove Files" msgstr "" -#: src/Registrations.php:316 +#: src/Registrations.php:317 msgid "Choose from the most used Files" msgstr "" -#: src/Registrations.php:357 +#: src/Registrations.php:358 msgid "@since" msgstr "" -#: src/Registrations.php:375 +#: src/Registrations.php:376 msgid "Namespaces" msgstr "" -#: src/Registrations.php:389 +#: src/Registrations.php:390 +msgid "Source Version" +msgstr "" + +#: src/Registrations.php:404 msgid "Source Type" msgstr "" -#: src/Registrations.php:405 -#: src/Registrations.php:500 +#: src/Registrations.php:420 +#: src/Registrations.php:515 msgid "Plugin" msgstr "" -#: src/Registrations.php:413 -#: src/Registrations.php:504 +#: src/Registrations.php:428 +#: src/Registrations.php:519 msgid "Theme" msgstr "" -#: src/Registrations.php:421 -#: src/Registrations.php:508 +#: src/Registrations.php:436 +#: src/Registrations.php:523 msgid "Composer Package" msgstr "" -#: src/Registrations.php:433 +#: src/Registrations.php:448 msgid "Role" msgstr "" -#: src/Registrations.php:447 +#: src/Registrations.php:462 msgid "Display" msgstr "" -#: src/Registrations.php:448 +#: src/Registrations.php:463 msgid "Condition" msgstr "" -#: src/Registrations.php:449 +#: src/Registrations.php:464 msgid "Utility" msgstr "" -#: src/Registrations.php:450 +#: src/Registrations.php:465 msgid "Setter" msgstr "" -#: src/Registrations.php:451 +#: src/Registrations.php:466 msgid "Getter" msgstr "" -#: src/Registrations.php:657 +#: src/Registrations.php:672 msgctxt "separator" msgid " or " msgstr "" diff --git a/languages/wp-parser-en.mo b/languages/wp-parser-en.mo index 0a8da7337cdd6da1138cf52fb07cd2c030d30bf5..ee88231081253634f75806bdd77c1975ada74640 100644 GIT binary patch delta 23 ecmZ1}vQlJ&8#|Y2h@pX%p_!Gb(dGd5n@j*vGX|3Y delta 23 ecmZ1}vQlJ&8#|Xth@qL4v5}RL$>sp|n@j*vQwEg) diff --git a/languages/wp-parser-en.po b/languages/wp-parser-en.po index 3601d15..89a72c4 100644 --- a/languages/wp-parser-en.po +++ b/languages/wp-parser-en.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: AVC WP Parser %%VERSION%%\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-phpdoc-parser\n" -"POT-Creation-Date: 2021-09-14T16:32:24+09:00\n" +"POT-Creation-Date: 2021-09-15T10:16:52+09:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -42,23 +42,23 @@ msgstr "" msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" msgstr "https://github.com/aivec/phpdoc-parser/graphs/contributors" -#: src/api-functions.php:21 src/Registrations.php:190 src/Registrations.php:192 -#: src/Registrations.php:194 src/Registrations.php:204 +#: src/api-functions.php:21 src/Registrations.php:191 src/Registrations.php:193 +#: src/Registrations.php:195 src/Registrations.php:205 msgid "Classes" msgstr "Classes" -#: src/api-functions.php:22 src/Registrations.php:130 src/Registrations.php:132 -#: src/Registrations.php:134 src/Registrations.php:144 +#: src/api-functions.php:22 src/Registrations.php:131 src/Registrations.php:133 +#: src/Registrations.php:135 src/Registrations.php:145 msgid "Functions" msgstr "Functions" -#: src/api-functions.php:23 src/Registrations.php:220 src/Registrations.php:222 -#: src/Registrations.php:224 src/Registrations.php:234 +#: src/api-functions.php:23 src/Registrations.php:221 src/Registrations.php:223 +#: src/Registrations.php:225 src/Registrations.php:235 msgid "Hooks" msgstr "Hooks" -#: src/api-functions.php:24 src/Registrations.php:160 src/Registrations.php:162 -#: src/Registrations.php:164 src/Registrations.php:174 +#: src/api-functions.php:24 src/Registrations.php:161 src/Registrations.php:163 +#: src/Registrations.php:165 src/Registrations.php:175 msgid "Methods" msgstr "Methods" @@ -161,37 +161,37 @@ msgstr "" msgid "Post has an explanation." msgstr "" -#: src/Importer/Importer.php:307 +#: src/Importer/Importer.php:339 msgid "Functions Reference" msgstr "Functions Reference" -#: src/Importer/Importer.php:311 +#: src/Importer/Importer.php:343 msgid "Hooks Reference" msgstr "Hooks Reference" -#: src/Importer/Relationships.php:97 src/Importer/Relationships.php:157 +#: src/Importer/Relationships.php:100 src/Importer/Relationships.php:160 #, fuzzy msgid "Uses Functions" msgstr "Functions" -#: src/Importer/Relationships.php:98 src/Importer/Relationships.php:117 -#: src/Importer/Relationships.php:136 +#: src/Importer/Relationships.php:101 src/Importer/Relationships.php:120 +#: src/Importer/Relationships.php:139 #, fuzzy msgid "Used by Functions" msgstr "Functions" -#: src/Importer/Relationships.php:116 src/Importer/Relationships.php:177 +#: src/Importer/Relationships.php:119 src/Importer/Relationships.php:180 #, fuzzy msgid "Uses Methods" msgstr "Methods" -#: src/Importer/Relationships.php:135 src/Importer/Relationships.php:197 +#: src/Importer/Relationships.php:138 src/Importer/Relationships.php:200 #, fuzzy msgid "Uses Hooks" msgstr "Hooks" -#: src/Importer/Relationships.php:158 src/Importer/Relationships.php:178 -#: src/Importer/Relationships.php:196 +#: src/Importer/Relationships.php:161 src/Importer/Relationships.php:181 +#: src/Importer/Relationships.php:199 #, fuzzy msgid "Used by Methods" msgstr "Methods" @@ -204,7 +204,7 @@ msgstr "" msgid "Parsed Summary:" msgstr "" -#: src/ParsedContent.php:121 src/ParsedContent.php:148 +#: src/ParsedContent.php:121 msgid "Translated Summary:" msgstr "" @@ -212,6 +212,10 @@ msgstr "" msgid "Parsed Description:" msgstr "" +#: src/ParsedContent.php:148 +msgid "Translated Description:" +msgstr "" + #: src/ParsedContent.php:166 msgid "Tags (args, return)" msgstr "" @@ -234,313 +238,317 @@ msgstr "" msgid "Translated Return:" msgstr "" -#: src/Registrations.php:133 +#: src/Registrations.php:134 #, fuzzy msgid "Function" msgstr "Functions" -#: src/Registrations.php:135 +#: src/Registrations.php:136 #, fuzzy msgid "New Function" msgstr "Functions" -#: src/Registrations.php:136 src/Registrations.php:166 -#: src/Registrations.php:196 src/Registrations.php:226 -#: src/Registrations.php:259 +#: src/Registrations.php:137 src/Registrations.php:167 +#: src/Registrations.php:197 src/Registrations.php:227 +#: src/Registrations.php:260 msgid "Add New" msgstr "" -#: src/Registrations.php:137 +#: src/Registrations.php:138 #, fuzzy msgid "Add New Function" msgstr "Functions" -#: src/Registrations.php:138 +#: src/Registrations.php:139 #, fuzzy msgid "Edit Function" msgstr "Functions" -#: src/Registrations.php:139 +#: src/Registrations.php:140 #, fuzzy msgid "View Function" msgstr "Functions" -#: src/Registrations.php:140 +#: src/Registrations.php:141 #, fuzzy msgid "Search Functions" msgstr "Functions" -#: src/Registrations.php:141 +#: src/Registrations.php:142 #, fuzzy msgid "No Functions found" msgstr "Functions" -#: src/Registrations.php:142 +#: src/Registrations.php:143 msgid "No Functions found in trash" msgstr "" -#: src/Registrations.php:143 +#: src/Registrations.php:144 #, fuzzy msgid "Parent Function" msgstr "Functions" -#: src/Registrations.php:163 +#: src/Registrations.php:164 #, fuzzy msgid "Method" msgstr "Methods" -#: src/Registrations.php:165 +#: src/Registrations.php:166 #, fuzzy msgid "New Method" msgstr "Methods" -#: src/Registrations.php:167 +#: src/Registrations.php:168 msgid "Add New Method" msgstr "" -#: src/Registrations.php:168 +#: src/Registrations.php:169 #, fuzzy msgid "Edit Method" msgstr "Methods" -#: src/Registrations.php:169 +#: src/Registrations.php:170 #, fuzzy msgid "View Method" msgstr "Methods" -#: src/Registrations.php:170 +#: src/Registrations.php:171 #, fuzzy msgid "Search Methods" msgstr "Methods" -#: src/Registrations.php:171 +#: src/Registrations.php:172 #, fuzzy msgid "No Methods found" msgstr "Methods" -#: src/Registrations.php:172 +#: src/Registrations.php:173 msgid "No Methods found in trash" msgstr "" -#: src/Registrations.php:173 +#: src/Registrations.php:174 #, fuzzy msgid "Parent Method" msgstr "Methods" -#: src/Registrations.php:193 +#: src/Registrations.php:194 #, fuzzy msgid "Class" msgstr "Classes" -#: src/Registrations.php:195 +#: src/Registrations.php:196 #, fuzzy msgid "New Class" msgstr "Classes" -#: src/Registrations.php:197 +#: src/Registrations.php:198 msgid "Add New Class" msgstr "" -#: src/Registrations.php:198 +#: src/Registrations.php:199 msgid "Edit Class" msgstr "" -#: src/Registrations.php:199 +#: src/Registrations.php:200 msgid "View Class" msgstr "" -#: src/Registrations.php:200 +#: src/Registrations.php:201 #, fuzzy msgid "Search Classes" msgstr "Classes" -#: src/Registrations.php:201 +#: src/Registrations.php:202 #, fuzzy msgid "No Classes found" msgstr "Classes" -#: src/Registrations.php:202 +#: src/Registrations.php:203 msgid "No Classes found in trash" msgstr "" -#: src/Registrations.php:203 +#: src/Registrations.php:204 msgid "Parent Class" msgstr "" -#: src/Registrations.php:223 +#: src/Registrations.php:224 #, fuzzy msgid "Hook" msgstr "Hooks" -#: src/Registrations.php:225 +#: src/Registrations.php:226 #, fuzzy msgid "New Hook" msgstr "Hooks" -#: src/Registrations.php:227 +#: src/Registrations.php:228 msgid "Add New Hook" msgstr "" -#: src/Registrations.php:228 +#: src/Registrations.php:229 msgid "Edit Hook" msgstr "" -#: src/Registrations.php:229 +#: src/Registrations.php:230 msgid "View Hook" msgstr "" -#: src/Registrations.php:230 +#: src/Registrations.php:231 msgid "Search Hooks" msgstr "" -#: src/Registrations.php:231 +#: src/Registrations.php:232 msgid "No Hooks found" msgstr "" -#: src/Registrations.php:232 +#: src/Registrations.php:233 msgid "No Hooks found in trash" msgstr "" -#: src/Registrations.php:233 +#: src/Registrations.php:234 msgid "Parent Hook" msgstr "" -#: src/Registrations.php:253 src/Registrations.php:255 -#: src/Registrations.php:257 src/Registrations.php:266 +#: src/Registrations.php:254 src/Registrations.php:256 +#: src/Registrations.php:258 src/Registrations.php:267 msgid "Reference Landing Pages" msgstr "" -#: src/Registrations.php:256 +#: src/Registrations.php:257 msgid "Reference Landing Page" msgstr "" -#: src/Registrations.php:258 +#: src/Registrations.php:259 msgid "New Reference Landing Page" msgstr "" -#: src/Registrations.php:260 +#: src/Registrations.php:261 msgid "Add New Reference Landing Page" msgstr "" -#: src/Registrations.php:261 +#: src/Registrations.php:262 msgid "Edit Reference Landing Page" msgstr "" -#: src/Registrations.php:262 +#: src/Registrations.php:263 msgid "View Reference Landing Page" msgstr "" -#: src/Registrations.php:263 +#: src/Registrations.php:264 msgid "Search Reference Landing Pages" msgstr "" -#: src/Registrations.php:264 +#: src/Registrations.php:265 msgid "No Pages found" msgstr "" -#: src/Registrations.php:265 +#: src/Registrations.php:266 msgid "No Pages found in trash" msgstr "" -#: src/Registrations.php:301 src/Registrations.php:303 -#: src/Registrations.php:317 +#: src/Registrations.php:302 src/Registrations.php:304 +#: src/Registrations.php:318 msgid "Files" msgstr "" -#: src/Registrations.php:304 +#: src/Registrations.php:305 msgctxt "taxonomy general name" msgid "File" msgstr "" -#: src/Registrations.php:305 +#: src/Registrations.php:306 msgid "Search Files" msgstr "" -#: src/Registrations.php:307 +#: src/Registrations.php:308 msgid "All Files" msgstr "" -#: src/Registrations.php:308 +#: src/Registrations.php:309 msgid "Parent File" msgstr "" -#: src/Registrations.php:309 +#: src/Registrations.php:310 msgid "Parent File:" msgstr "" -#: src/Registrations.php:310 +#: src/Registrations.php:311 msgid "Edit File" msgstr "" -#: src/Registrations.php:311 +#: src/Registrations.php:312 msgid "Update File" msgstr "" -#: src/Registrations.php:312 src/Registrations.php:313 +#: src/Registrations.php:313 src/Registrations.php:314 msgid "New File" msgstr "" -#: src/Registrations.php:314 +#: src/Registrations.php:315 msgid "Files separated by comma" msgstr "" -#: src/Registrations.php:315 +#: src/Registrations.php:316 msgid "Add or remove Files" msgstr "" -#: src/Registrations.php:316 +#: src/Registrations.php:317 msgid "Choose from the most used Files" msgstr "" -#: src/Registrations.php:357 +#: src/Registrations.php:358 msgid "@since" msgstr "" -#: src/Registrations.php:375 +#: src/Registrations.php:376 msgid "Namespaces" msgstr "Namespaces" -#: src/Registrations.php:389 +#: src/Registrations.php:390 +msgid "Source Version" +msgstr "" + +#: src/Registrations.php:404 msgid "Source Type" msgstr "" -#: src/Registrations.php:405 src/Registrations.php:500 +#: src/Registrations.php:420 src/Registrations.php:515 msgid "Plugin" msgstr "Plugin" -#: src/Registrations.php:413 src/Registrations.php:504 +#: src/Registrations.php:428 src/Registrations.php:519 msgid "Theme" msgstr "Theme" -#: src/Registrations.php:421 src/Registrations.php:508 +#: src/Registrations.php:436 src/Registrations.php:523 msgid "Composer Package" msgstr "Composer Package" -#: src/Registrations.php:433 +#: src/Registrations.php:448 msgid "Role" msgstr "" -#: src/Registrations.php:447 +#: src/Registrations.php:462 msgid "Display" msgstr "Display" -#: src/Registrations.php:448 +#: src/Registrations.php:463 msgid "Condition" msgstr "Condition" -#: src/Registrations.php:449 +#: src/Registrations.php:464 msgid "Utility" msgstr "Utility" -#: src/Registrations.php:450 +#: src/Registrations.php:465 msgid "Setter" msgstr "Setter" -#: src/Registrations.php:451 +#: src/Registrations.php:466 msgid "Getter" msgstr "Getter" -#: src/Registrations.php:657 +#: src/Registrations.php:672 msgctxt "separator" msgid " or " msgstr "" diff --git a/languages/wp-parser-ja.mo b/languages/wp-parser-ja.mo index fd726e11a2dd3270c6c99044c8c3aa16d61839a3..c9a11ac323f18eae76e21253dbc716120f95f967 100644 GIT binary patch delta 2327 zcmY+_e@s-~;i|Ru{#+k~+~K^=^W%J<=lgvQ zxNUy-gYFO6$$Jd{Lj26+r+{wb8S-eGW5dU&I-#Z~o+=l8$U(^r z%6K#8;&!|P`%tAGL?twgGw=#(1LC%3a}J4VI69`36)6{wUJKbGJ9;h z7nRxjw*NS)61yH9tL*`m0oVL{-KGI34Gr7G8>4cr7YWEh6;#Fl&7}Sc=wZ7$qg>R&vrr`~LycFUHuy9uPy^~? z4WlyYKrP&jRM)(NtYJPtE%cG?A3|;T404$fm%9T0iVFM}>Wn-@n}Y@D!*bMFM{!>g zzfP$64--ulsz7D>7%K2;)JIx}+QnA>WWn99iuNRt7FYLquJdVoX z96pK})Vmtjpf=i%sz3~t;m61+nlq>kkJ$0QQI$-kQwdK)R{@H7&_Efg{Rk>hIV$iI zsIw1PyHWE#M^4F{wvHf4ncqvv&kP0)Ok(eY{whhp3<4T#2<13b@|I$g5f|g zY#zVfTpn;Xh8kPLjV(dncwbc@90^S{S4Ene{h{Z5yR$RCbz35#je-2tfsn%+W>wf9 zjyOJ3?XPE9f2iIm$`2*p_L}O3Ky$!MY$gAHOHJw@Uv5&@_>!h3*c#cesnKaLHLZ0d z6!T=Z+?2kcx}?}wQtDeUZ}*n0HB*)Hg%bl~2V*wfZ?c9`=kJO~2jlG@#@qJB+xErV zWAP|gN8-NCj2-G9eeG2<+Bpz!?>fJAzZvaoAM0z2bx(gL$&Kzzym~YqJ-~FMAbOE# yCwTUm!g!S6@5ZCOwsULSjX+*w=SF+%A`^SNF=^t{)mxB7i)A&q)Js%|lu&(tdLX&p&pqd!d;ZJ4dM@v1Zsfy+__Kze zFuzmz4aI3>%*oOJ)nx;xBs_!3*o-c0we$DT!}uw>@ePi{UYv#ln1T~|Xe`dd@y0|< zfQ#u&6rdB!k;7DS(uR9b57c4_HXw)T=9GYasC7S3>*B_YB$|X8r(z<`##GF~A}k)B zj~H{2iwR7$pfYbmRoH<_=oL=EF61x+oV4*DR7GPLP@I{H@i+_h+&t7iS*T7dMXf7F z6%fJ%;+w5paF{SB1*k$La>$O4p(;Iver!Tjd>eiE1SjDqRI3M31$lW$6=$FlSc#J{ zgnE7#Mzle-U2xtmXhBu-0F}sNR12TmaTltxFLwSH>f3O#NEN0aIT$~BF&!0nF>2rS zsDw5p^8VGrFcS)N7?oMQ9bd2uTTqqVLIvnV4)czaTG@wc`8QPH0pu`$Iq{L1L^fB# zX{f-NNX}-7oBk{CYEHxN#NOD7N+gV`>>z66I@HFeP_4a$bMP((u^aV@{5*8UVa!5Q z!Y_%ceY#NJ(pO}uiHneyCOnvq8Fsu5^-jaM46AWI-naAps7n4|HYSm+5?pFsgKBvx zDo`crujhch{|xnwL|)j7UR1zes8%P_H!a9QVwmNak0n@yCr|-jqYC(J$3v*rI(b-u zJ(!7UsQnAAWk^90bASs4Xhv<=YHdd)(t&DS52}?vt-nzlI{1K;z+}`b$wqau$j(=x z)*VN6@~XZ65i^NzoD)YLSb)lO6J}!_s^UBL{&#!d%WgB7FF?JL9axB`F@*0?i3a%e z)q#9efvb?_nhmIg!@5s=bA$_3-hf(oUN`VMDv_Jk9@NHOUM$6%G;1~z)2u*sY_pv| zh}!Q2s*ol-|I*rz5oI*Qg%WU+mh_@FoPnxv5vsLiI2Wt!_!@GUN7lEf#C}>w^Up;I z`B3wDsDuhJAGi4U|22n;vrOpEryW)KAVy1E_3@3V?oRi\n" "Language-Team: LANGUAGE \n" @@ -42,23 +42,23 @@ msgstr "" msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" msgstr "https://github.com/aivec/phpdoc-parser/graphs/contributors" -#: src/api-functions.php:21 src/Registrations.php:190 src/Registrations.php:192 -#: src/Registrations.php:194 src/Registrations.php:204 +#: src/api-functions.php:21 src/Registrations.php:191 src/Registrations.php:193 +#: src/Registrations.php:195 src/Registrations.php:205 msgid "Classes" msgstr "クラス" -#: src/api-functions.php:22 src/Registrations.php:130 src/Registrations.php:132 -#: src/Registrations.php:134 src/Registrations.php:144 +#: src/api-functions.php:22 src/Registrations.php:131 src/Registrations.php:133 +#: src/Registrations.php:135 src/Registrations.php:145 msgid "Functions" msgstr "ファンクション" -#: src/api-functions.php:23 src/Registrations.php:220 src/Registrations.php:222 -#: src/Registrations.php:224 src/Registrations.php:234 +#: src/api-functions.php:23 src/Registrations.php:221 src/Registrations.php:223 +#: src/Registrations.php:225 src/Registrations.php:235 msgid "Hooks" msgstr "フック" -#: src/api-functions.php:24 src/Registrations.php:160 src/Registrations.php:162 -#: src/Registrations.php:164 src/Registrations.php:174 +#: src/api-functions.php:24 src/Registrations.php:161 src/Registrations.php:163 +#: src/Registrations.php:165 src/Registrations.php:175 msgid "Methods" msgstr "関数" @@ -161,360 +161,368 @@ msgstr "" msgid "Post has an explanation." msgstr "" -#: src/Importer/Importer.php:307 +#: src/Importer/Importer.php:339 msgid "Functions Reference" msgstr "ファンクション・レファレンス" -#: src/Importer/Importer.php:311 +#: src/Importer/Importer.php:343 msgid "Hooks Reference" msgstr "フック・レファレンス" -#: src/Importer/Relationships.php:97 src/Importer/Relationships.php:157 +#: src/Importer/Relationships.php:100 src/Importer/Relationships.php:160 msgid "Uses Functions" msgstr "利用しているファンクション" -#: src/Importer/Relationships.php:98 src/Importer/Relationships.php:117 -#: src/Importer/Relationships.php:136 +#: src/Importer/Relationships.php:101 src/Importer/Relationships.php:120 +#: src/Importer/Relationships.php:139 msgid "Used by Functions" msgstr "利用されているファンクション" -#: src/Importer/Relationships.php:116 src/Importer/Relationships.php:177 +#: src/Importer/Relationships.php:119 src/Importer/Relationships.php:180 msgid "Uses Methods" msgstr "利用している関数" -#: src/Importer/Relationships.php:135 src/Importer/Relationships.php:197 +#: src/Importer/Relationships.php:138 src/Importer/Relationships.php:200 msgid "Uses Hooks" msgstr "利用しているフック" -#: src/Importer/Relationships.php:158 src/Importer/Relationships.php:178 -#: src/Importer/Relationships.php:196 +#: src/Importer/Relationships.php:161 src/Importer/Relationships.php:181 +#: src/Importer/Relationships.php:199 msgid "Used by Methods" msgstr "利用されている関数" #: src/ParsedContent.php:83 msgid "Parsed Content" -msgstr "" +msgstr "パースしたコンテンツ" #: src/ParsedContent.php:112 msgid "Parsed Summary:" -msgstr "" +msgstr "概要" -#: src/ParsedContent.php:121 src/ParsedContent.php:148 +#: src/ParsedContent.php:121 msgid "Translated Summary:" -msgstr "" +msgstr "概要 (翻訳)" #: src/ParsedContent.php:139 msgid "Parsed Description:" -msgstr "" +msgstr "説明" + +#: src/ParsedContent.php:148 +msgid "Translated Description:" +msgstr "説明 (翻訳)" #: src/ParsedContent.php:166 msgid "Tags (args, return)" -msgstr "" +msgstr "(パラメータ、戻り値)" #. translators: the type #: src/ParsedContent.php:178 src/ParsedContent.php:224 msgid "(%s)" -msgstr "" +msgstr "(%s)" #. translators: the arg name #: src/ParsedContent.php:198 msgid "%s (Translated)" -msgstr "" +msgstr "%s (翻訳)" #: src/ParsedContent.php:221 msgid "Parsed Return:" -msgstr "" +msgstr "戻り値" #: src/ParsedContent.php:237 msgid "Translated Return:" -msgstr "" +msgstr "戻り値 (翻訳)" -#: src/Registrations.php:133 +#: src/Registrations.php:134 msgid "Function" msgstr "ファンクション" -#: src/Registrations.php:135 +#: src/Registrations.php:136 msgid "New Function" msgstr "ファンクションを新規追加" -#: src/Registrations.php:136 src/Registrations.php:166 -#: src/Registrations.php:196 src/Registrations.php:226 -#: src/Registrations.php:259 +#: src/Registrations.php:137 src/Registrations.php:167 +#: src/Registrations.php:197 src/Registrations.php:227 +#: src/Registrations.php:260 msgid "Add New" msgstr "新規追加" -#: src/Registrations.php:137 +#: src/Registrations.php:138 msgid "Add New Function" msgstr "ファンクションを新規追加" -#: src/Registrations.php:138 +#: src/Registrations.php:139 msgid "Edit Function" msgstr "ファンクションを編集" -#: src/Registrations.php:139 +#: src/Registrations.php:140 msgid "View Function" msgstr "ファンクションを見る" -#: src/Registrations.php:140 +#: src/Registrations.php:141 msgid "Search Functions" msgstr "ファンクションを検索" -#: src/Registrations.php:141 +#: src/Registrations.php:142 msgid "No Functions found" msgstr "ファンクションの結果がありません" -#: src/Registrations.php:142 +#: src/Registrations.php:143 msgid "No Functions found in trash" msgstr "ゴミ箱の中にファンクションがありません" -#: src/Registrations.php:143 +#: src/Registrations.php:144 msgid "Parent Function" msgstr "親ファンクション" -#: src/Registrations.php:163 +#: src/Registrations.php:164 msgid "Method" msgstr "関数" -#: src/Registrations.php:165 +#: src/Registrations.php:166 msgid "New Method" msgstr "関数を新規追加" -#: src/Registrations.php:167 +#: src/Registrations.php:168 msgid "Add New Method" msgstr "関数を新規追加" -#: src/Registrations.php:168 +#: src/Registrations.php:169 msgid "Edit Method" msgstr "関数を編集" -#: src/Registrations.php:169 +#: src/Registrations.php:170 msgid "View Method" msgstr "関数を見る" -#: src/Registrations.php:170 +#: src/Registrations.php:171 msgid "Search Methods" msgstr "関数を検索" -#: src/Registrations.php:171 +#: src/Registrations.php:172 msgid "No Methods found" msgstr "関数の結果がありません" -#: src/Registrations.php:172 +#: src/Registrations.php:173 msgid "No Methods found in trash" msgstr "ゴミ箱の中に関数がありません" -#: src/Registrations.php:173 +#: src/Registrations.php:174 msgid "Parent Method" msgstr "親関数" -#: src/Registrations.php:193 +#: src/Registrations.php:194 msgid "Class" msgstr "クラス" -#: src/Registrations.php:195 +#: src/Registrations.php:196 msgid "New Class" msgstr "クラスを新規追加" -#: src/Registrations.php:197 +#: src/Registrations.php:198 msgid "Add New Class" msgstr "クラスを新規追加" -#: src/Registrations.php:198 +#: src/Registrations.php:199 msgid "Edit Class" msgstr "クラスを編集" -#: src/Registrations.php:199 +#: src/Registrations.php:200 msgid "View Class" msgstr "クラスを見る" -#: src/Registrations.php:200 +#: src/Registrations.php:201 msgid "Search Classes" msgstr "クラスを検索" -#: src/Registrations.php:201 +#: src/Registrations.php:202 msgid "No Classes found" msgstr "クラスの結果がありません" -#: src/Registrations.php:202 +#: src/Registrations.php:203 msgid "No Classes found in trash" msgstr "ゴミ箱の中にクラスがありません" -#: src/Registrations.php:203 +#: src/Registrations.php:204 msgid "Parent Class" msgstr "親クラス" -#: src/Registrations.php:223 +#: src/Registrations.php:224 msgid "Hook" msgstr "フック" -#: src/Registrations.php:225 +#: src/Registrations.php:226 msgid "New Hook" msgstr "フックを新規追加" -#: src/Registrations.php:227 +#: src/Registrations.php:228 msgid "Add New Hook" msgstr "フックを新規追加" -#: src/Registrations.php:228 +#: src/Registrations.php:229 msgid "Edit Hook" msgstr "フックを編集" -#: src/Registrations.php:229 +#: src/Registrations.php:230 msgid "View Hook" msgstr "フックを見る" -#: src/Registrations.php:230 +#: src/Registrations.php:231 msgid "Search Hooks" msgstr "フックを検索" -#: src/Registrations.php:231 +#: src/Registrations.php:232 msgid "No Hooks found" msgstr "フックの結果がありません" -#: src/Registrations.php:232 +#: src/Registrations.php:233 msgid "No Hooks found in trash" msgstr "ゴミ箱の中にフックがありません" -#: src/Registrations.php:233 +#: src/Registrations.php:234 msgid "Parent Hook" msgstr "親フック" -#: src/Registrations.php:253 src/Registrations.php:255 -#: src/Registrations.php:257 src/Registrations.php:266 +#: src/Registrations.php:254 src/Registrations.php:256 +#: src/Registrations.php:258 src/Registrations.php:267 msgid "Reference Landing Pages" msgstr "レファレンスのランディングページ" -#: src/Registrations.php:256 +#: src/Registrations.php:257 msgid "Reference Landing Page" msgstr "レファレンスのランディングページ" -#: src/Registrations.php:258 +#: src/Registrations.php:259 msgid "New Reference Landing Page" msgstr "レファレンスのランディングページを新規追加" -#: src/Registrations.php:260 +#: src/Registrations.php:261 msgid "Add New Reference Landing Page" msgstr "レファレンスのランディングページを新規追加" -#: src/Registrations.php:261 +#: src/Registrations.php:262 msgid "Edit Reference Landing Page" msgstr "レファレンスのランディングページを編集" -#: src/Registrations.php:262 +#: src/Registrations.php:263 msgid "View Reference Landing Page" msgstr "レファレンスのランディングページを見る" -#: src/Registrations.php:263 +#: src/Registrations.php:264 msgid "Search Reference Landing Pages" msgstr "レファレンスのランディングページを検索" -#: src/Registrations.php:264 +#: src/Registrations.php:265 msgid "No Pages found" msgstr "レファレンスのランディングページの結果がありません" -#: src/Registrations.php:265 +#: src/Registrations.php:266 msgid "No Pages found in trash" msgstr "ゴミ箱の中にレファレンスのランディングページがありません" -#: src/Registrations.php:301 src/Registrations.php:303 -#: src/Registrations.php:317 +#: src/Registrations.php:302 src/Registrations.php:304 +#: src/Registrations.php:318 msgid "Files" msgstr "ファイル" -#: src/Registrations.php:304 +#: src/Registrations.php:305 msgctxt "taxonomy general name" msgid "File" msgstr "ファイル" -#: src/Registrations.php:305 +#: src/Registrations.php:306 msgid "Search Files" msgstr "ファイルを検索" -#: src/Registrations.php:307 +#: src/Registrations.php:308 msgid "All Files" msgstr "全てのファイル" -#: src/Registrations.php:308 +#: src/Registrations.php:309 msgid "Parent File" msgstr "親ファイル" -#: src/Registrations.php:309 +#: src/Registrations.php:310 msgid "Parent File:" msgstr "親ファイル:" -#: src/Registrations.php:310 +#: src/Registrations.php:311 msgid "Edit File" msgstr "ファイルを編集" -#: src/Registrations.php:311 +#: src/Registrations.php:312 msgid "Update File" msgstr "ファイルを更新" -#: src/Registrations.php:312 src/Registrations.php:313 +#: src/Registrations.php:313 src/Registrations.php:314 msgid "New File" msgstr "ファイルを新規追加" -#: src/Registrations.php:314 +#: src/Registrations.php:315 msgid "Files separated by comma" msgstr "コンマで区切られているファイル" -#: src/Registrations.php:315 +#: src/Registrations.php:316 msgid "Add or remove Files" msgstr "ファイルを新規追加・削除する" -#: src/Registrations.php:316 +#: src/Registrations.php:317 msgid "Choose from the most used Files" msgstr "よく使われているファイルから選択" -#: src/Registrations.php:357 +#: src/Registrations.php:358 msgid "@since" msgstr "@since" -#: src/Registrations.php:375 +#: src/Registrations.php:376 msgid "Namespaces" msgstr "ネームスペース" -#: src/Registrations.php:389 +#: src/Registrations.php:390 +msgid "Source Version" +msgstr "バージョン" + +#: src/Registrations.php:404 msgid "Source Type" msgstr "ソースタイプ" -#: src/Registrations.php:405 src/Registrations.php:500 +#: src/Registrations.php:420 src/Registrations.php:515 msgid "Plugin" msgstr "プラグイン" -#: src/Registrations.php:413 src/Registrations.php:504 +#: src/Registrations.php:428 src/Registrations.php:519 msgid "Theme" msgstr "テーマ" -#: src/Registrations.php:421 src/Registrations.php:508 +#: src/Registrations.php:436 src/Registrations.php:523 msgid "Composer Package" msgstr "Composerパッケージ" -#: src/Registrations.php:433 +#: src/Registrations.php:448 msgid "Role" msgstr "区分" -#: src/Registrations.php:447 +#: src/Registrations.php:462 msgid "Display" msgstr "表示系" -#: src/Registrations.php:448 +#: src/Registrations.php:463 msgid "Condition" msgstr "条件判断" -#: src/Registrations.php:449 +#: src/Registrations.php:464 msgid "Utility" msgstr "ユーティリティー" -#: src/Registrations.php:450 +#: src/Registrations.php:465 msgid "Setter" msgstr "データセット" -#: src/Registrations.php:451 +#: src/Registrations.php:466 msgid "Getter" msgstr "デート取得" -#: src/Registrations.php:657 +#: src/Registrations.php:672 msgctxt "separator" msgid " or " msgstr "" diff --git a/src/CLI/Commands.php b/src/CLI/Commands.php index f2ec8b1..775370c 100644 --- a/src/CLI/Commands.php +++ b/src/CLI/Commands.php @@ -170,6 +170,13 @@ public function create($args, $assoc_args) { } } + if (isset($parser_meta['version'])) { + if (!is_string($parser_meta['version'])) { + WP_CLI::error('"version" must be a string.'); + exit; + } + } + // handle file/folder exclusions $exclude = !empty($parser_meta['exclude']) ? $parser_meta['exclude'] : []; add_filter('wp_parser_exclude_directories', function () use ($exclude) { @@ -181,9 +188,17 @@ public function create($args, $assoc_args) { return $exclude_strict; }); + $version = isset($parser_meta['version']) ? $parser_meta['version'] : null; + $data = $this->_get_phpdoc_data($directory, 'array'); $data = [ - 'config' => new ImportConfig($parser_meta['type'], $parser_meta['name'], $exclude), + 'config' => new ImportConfig( + $parser_meta['type'], + $parser_meta['name'], + $version, + $exclude, + $exclude_strict + ), 'trash_old_refs' => isset($assoc_args['trash-old-refs']) && $assoc_args['trash-old-refs'] === true, 'files' => $data, ]; diff --git a/src/Importer/Importer.php b/src/Importer/Importer.php index 4972b6b..bf51db8 100644 --- a/src/Importer/Importer.php +++ b/src/Importer/Importer.php @@ -24,7 +24,6 @@ class Importer implements LoggerAwareInterface 'taxonomy_namespace' => 'wp-parser-namespace', 'taxonomy_package' => 'wp-parser-package', 'taxonomy_since_version' => 'wp-parser-since', - 'taxonomy_version' => 'wp-parser-version', 'taxonomy_source_type' => Registrations::SOURCE_TYPE_TAX_SLUG, ]; @@ -56,13 +55,6 @@ class Importer implements LoggerAwareInterface */ public $taxonomy_since_version; - /** - * Taxonomy name for a sources version - * - * @var string - */ - public $taxonomy_version; - /** * Taxonomy name for an item's `@package/@subpackage` tags * @@ -208,9 +200,6 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio remove_action('transition_post_status', '_update_blog_date_on_post_publish', 10); remove_action('transition_post_status', '__clear_multi_author_cache', 10); - delete_option('wp_parser_imported_wp_version'); - delete_option('wp_parser_root_import_dir'); - // Sanity check -- do the required post types exist? if (!post_type_exists($this->post_type_class) || !post_type_exists($this->post_type_function) || !post_type_exists($this->post_type_hook)) { $this->logger->error(sprintf('Missing post type; check that "%1$s", "%2$s", and "%3$s" are registered.', $this->post_type_class, $this->post_type_function, $this->post_type_hook)); @@ -371,14 +360,6 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio } } - // Specifically import WP version file first to get version number. - $ver_file = array_filter($data, function ($f) { - return 'wp-includes/version.php' === $f['path']; - }); - if ($ver_file) { - $this->version = $this->importVersion(reset($ver_file)); - } - if ($this->trash_old_refs === true) { $previous_posts_q = avcpdp_get_all_parser_posts_for_source( $this->source_type_meta['type'], @@ -387,6 +368,10 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio $this->previous_posts = $previous_posts_q->get_posts(); } + if (!empty($this->source_type_meta['version'])) { + $this->version = $this->source_type_meta['version']; + } + // loop through files and start importing $root = ''; foreach ($data as $file) { @@ -401,13 +386,12 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio } if (!empty($root)) { - update_option('wp_parser_root_import_dir', $root); update_term_meta( $this->source_type_meta['type_term_id'], 'wp_parser_root_import_dir', $root ); - $this->logger->info('Updated option wp_parser_root_import_dir: ' . $root); + $this->logger->info("Updated 'wp_parser_root_import_dir' term meta for {$this->source_type_meta['name']}: {$root}"); } $last_import = time(); @@ -416,9 +400,9 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio update_option('wp_parser_last_import', $last_import); $this->logger->info(sprintf('Updated option wp_parser_last_import: %1$s at %2$s.', $import_date, $import_time)); - $wp_version = get_option('wp_parser_imported_wp_version'); - if ($wp_version) { - $this->logger->info('Updated option wp_parser_imported_wp_version: ' . $wp_version); + // Import source version if specified + if (!empty($this->source_type_meta['version'])) { + $this->importVersion($this->source_type_meta['version']); } if ($this->trash_old_refs === true) { @@ -726,27 +710,16 @@ protected function importMethod(array $data, $parent_post_id = 0, $import_ignore } /** - * Updates the 'wp_parser_imported_wp_version' option with the version from wp-includes/version.php. + * Updates the `wp_parser_imported_version` source type term meta with the version + * from the parsed source * - * @param array $data Data - * @return string|false WordPress version number, or false if not known. + * @param string $version + * @return void */ - protected function importVersion($data) { - $version_path = $data['root'] . '/' . $data['path']; - - if (!is_readable($version_path)) { - return false; - } - - include $version_path; - - if (isset($wp_version) && $wp_version) { - update_option('wp_parser_imported_wp_version', $wp_version); - $this->logger->info("\t" . sprintf('Updated option wp_parser_imported_wp_version to "%1$s"', $wp_version)); - return $wp_version; - } - - return false; + protected function importVersion($version) { + $sname = $this->source_type_meta['name']; + update_term_meta($this->source_type_meta['type_term_id'], 'wp_parser_imported_version', $version); + $this->logger->info("Updated 'wp_parser_imported_version' term meta for {$sname} to: {$version}"); } /** @@ -1016,7 +989,7 @@ public function importItem(array $data, $parent_post_id = 0, $import_ignored = f $anything_updated[] = update_post_meta($post_id, '_wp-parser_line_num', (string)$data['line']); $anything_updated[] = update_post_meta($post_id, '_wp-parser_end_line_num', (string)$data['end_line']); $anything_updated[] = update_post_meta($post_id, '_wp-parser_tags', $data['doc']['tags']); - $anything_updated[] = update_post_meta($post_id, '_wp-parser_last_parsed_wp_version', $this->version); + $anything_updated[] = update_post_meta($post_id, '_wp-parser_last_parsed_version', $this->version); // If the post didn't need to be updated, but meta or tax changed, update it to bump last modified. if (!$is_new_post && !$post_needed_update && array_filter($anything_updated)) { diff --git a/src/Models/ImportConfig.php b/src/Models/ImportConfig.php index da129cb..b174f12 100644 --- a/src/Models/ImportConfig.php +++ b/src/Models/ImportConfig.php @@ -23,6 +23,13 @@ class ImportConfig implements JsonSerializable */ private $name; + /** + * The plugin/theme/composer-package version + * + * @var null|string + */ + private $version; + /** * Array of files/folders to exclude from import * @@ -41,15 +48,17 @@ class ImportConfig implements JsonSerializable * Initializes an import config * * @author Evan D Shaw - * @param string $source_type - * @param string $name - * @param array $exclude - * @param bool $exclude_strict + * @param string $source_type + * @param string $name + * @param null|string $version + * @param array $exclude + * @param bool $exclude_strict * @return void */ - public function __construct($source_type, $name, $exclude = [], $exclude_strict = false) { + public function __construct($source_type, $name, $version = null, $exclude = [], $exclude_strict = false) { $this->source_type = $source_type; $this->name = $name; + $this->version = $version; $this->exclude = $exclude; $this->exclude_strict = $exclude_strict; } @@ -64,6 +73,7 @@ public function jsonSerialize() { return [ 'type' => $this->source_type, 'name' => $this->name, + 'version' => $this->version, 'exclude' => $this->exclude, 'excludeStrict' => $this->exclude_strict, ]; @@ -89,6 +99,16 @@ public function getName() { return $this->name; } + /** + * Getter for `$this->version` + * + * @author Evan D Shaw + * @return null|string + */ + public function getVersion() { + return $this->version; + } + /** * Getter for `$this->exclude` * @@ -103,7 +123,7 @@ public function getExclude() { * Getter for `$this->exclude_strict` * * @author Evan D Shaw - * @return array + * @return bool */ public function getExcludeStrict() { return $this->exclude_strict; diff --git a/src/ParsedContent.php b/src/ParsedContent.php index afb1d54..373309c 100644 --- a/src/ParsedContent.php +++ b/src/ParsedContent.php @@ -83,7 +83,8 @@ public function addMetaBoxes() { __('Parsed Content', 'wp-parser'), [$this, 'addParsedMetaBox'], $screen, - 'normal' + 'normal', + 'high' ); } } @@ -145,7 +146,7 @@ public function addParsedMetaBox($post) { - +
    diff --git a/src/api-functions.php b/src/api-functions.php index 1c37f8d..a0607c3 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -584,30 +584,61 @@ function avcpdp_get_role_term_by_slug($slug) { } /** - * Retrieve the root directory of the parsed WP code. + * Returns version number of the imported source. * - * If the option 'wp_parser_root_import_dir' (as set by the parser) is not + * The the post ID must have a source type term associated with it for this + * function to return a value other than `null` + * + * @author Evan D Shaw + * @param null|int $post_id + * @return null|string + */ +function avcpdp_get_source_imported_version($post_id = null) { + if (empty($post_id)) { + $post_id = get_the_ID(); + } + + if (empty($post_id)) { + return null; + } + + $stterms = avcpdp_get_post_source_type_terms($post_id); + if (empty($stterms)) { + return null; + } + + return (string)get_term_meta($stterms['name']->term_id, 'wp_parser_imported_version', true); +} + +/** + * Retrieve the root directory of the parsed source code. + * + * If the source type term meta 'wp_parser_root_import_dir' (as set by the parser) is not * set, then assume ABSPATH. * * @param int|null $post_id * @return string */ function avcpdp_get_source_code_root_dir($post_id = null) { - $root_dir = get_option('wp_parser_root_import_dir'); + $root_dir = ABSPATH; if (empty($post_id)) { $post_id = get_the_ID(); - if (!empty($post_id)) { - $sourceterms = avcpdp_get_post_source_type_terms($post_id); - if (!empty($sourceterms['name'])) { - $dir = get_term_meta( - $sourceterms['name']->term_id, - 'wp_parser_root_import_dir', - true - ); - $root_dir = !empty($dir) ? $dir : $root_dir; - } - } } + + if (empty($post_id)) { + return $root_dir; + } + + $sourceterms = avcpdp_get_post_source_type_terms($post_id); + if (!empty($sourceterms['name'])) { + $dir = get_term_meta( + $sourceterms['name']->term_id, + 'wp_parser_root_import_dir', + true + ); + $root_dir = !empty($dir) ? $dir : $root_dir; + } + if (isset($_ENV['AVC_NODE_ENV']) && $_ENV['AVC_NODE_ENV'] === 'development') { $root_dir = str_replace('/app/', '/var/www/html/', $root_dir); } From 4d5f227c7dbcbecd19cd0d73b499b754eef28544 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 15 Sep 2021 17:53:39 +0900 Subject: [PATCH 29/66] fix: add slashes to strings in tag data on import so that references aren't broken by wp_unslash in update_post_meta --- src/Formatting.php | 38 +++++++++++++++----------------------- src/Importer/Importer.php | 10 ++++++---- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/src/Formatting.php b/src/Formatting.php index 1772417..7e47e4c 100644 --- a/src/Formatting.php +++ b/src/Formatting.php @@ -333,9 +333,9 @@ public static function stripNamespaceFromReference($ref) { * Automatically detects inline references to parsed resources and links to them. * * Examples: - * - Functions: get_the_ID() - * - Classes: My\PSR\Four\Class - * - Methods: My\PSR\Four\Class::isSingle() + * - Functions: get_item() + * - Classes: My\PSR\Four\Class, \TopLevelClass + * - Methods: My\PSR\Four\Class::isSingle(), \My\PSR\Four\Class::isSingle() * * Note: currently there is not a reliable way to infer references to hooks. Recommend * using the {@}see 'hook_name'} notation as used in the inline docs. @@ -385,14 +385,12 @@ public static function autolinkReferences($text, $strip_namespaces = true) { // Only if the text contains something that might be a function. if (false !== strpos($content, '()')) { - // Detect references to class methods, e.g. WP_Query::query() - // or functions, e.g. register_post_type(). + // Detect references to class methods, e.g. MyNamespace\MyClass::query() + // or functions, e.g. get_item(). $content = preg_replace_callback( '~ (?!<.*?) # Non-capturing check to ensure not matching what looks like the inside of an HTML tag. ( # 1: The full method or function name. - # ((\w+)::)? 2: The class prefix, if a method reference. (WordPress core regex) - # (\w+) 3: The method or function name. (WordPress core regex) (([a-zA-Z0-9_\\\]+)::)? # 2: The PSR-4 class prefix, if a method reference. ([a-zA-Z0-9_\\\]+) # 3: The method or function name. ) @@ -433,29 +431,23 @@ function ($matches) use ($strip_namespaces) { // Detect references to classes, e.g. WP_Query $content = preg_replace_callback( - // Most class names start with an uppercase letter and have an underscore. - // The exceptions are explicitly listed since future classes likely won't violate previous statement. - // Requests and Translations, due to their higher likelihood of use as a word and not as an inline class - // reference, should be explicitly referenced, e.g. `{@see Requests}`. + // Resolves PSR-4 class names + // If referencing a top level class (ie: MyClass), the class name MUST be prefixed with + // a backslash (ie: \MyClass). + // For all other non top level classes (ie: \MyNamespace\MyClass), the leading backslash + // is optional (ie: MyNamespace\MyClass). + // + // Note that WordPress style class names, such as WP_Post, are not resolved. Class names + // MUST be PSR-4 compliant. '~' . '(?))' // Does not appear within a tag . '~', function ($matches) use ($strip_namespaces) { - // If match is all caps, it's not a possible class name. - // We'll chalk the sole exception, WP, as merely being an abbreviation (the regex won't match it anyhow). - if (strtoupper($matches[0]) === $matches[0]) { - return $matches[0]; - } - // Only link actually parsed classes. $post = self::getPostFromReference($matches[0], 'wp-parser-class'); if ($post !== null) { @@ -610,7 +602,7 @@ public static function fixParamHashFormatting($text) { if ($name) { $new_text .= "'{$name}'
    "; } - $new_text .= "({$type}) {$description}"; + $new_text .= "({$type}){$description}"; if (!$skip_closing_li) { $new_text .= ''; } diff --git a/src/Importer/Importer.php b/src/Importer/Importer.php index bf51db8..384ff7a 100644 --- a/src/Importer/Importer.php +++ b/src/Importer/Importer.php @@ -976,19 +976,21 @@ public function importItem(array $data, $parent_post_id = 0, $import_ignored = f // Add extra namespace slashes to types so that wp_unslash in update_post_meta doesnt remove them. // Without the slashes it's impossible to create the reference page link - if (!empty($data['doc']) && !empty($data['doc']['tags'])) { + /* if (!empty($data['doc']) && !empty($data['doc']['tags'])) { foreach ($data['doc']['tags'] as &$tag) { if (!empty($tag['types'])) { foreach ($tag['types'] as &$type) { - $type = addslashes($type); + $type = wp_slash($type); } } } - } + } */ + // We have to add slashes so that namespace slashes aren't stripped by update_post_meta + // Without the slashes it's impossible to create reference links for class/method references with PSR-4 namespaces + $anything_updated[] = update_post_meta($post_id, '_wp-parser_tags', wp_slash($data['doc']['tags'])); $anything_updated[] = update_post_meta($post_id, '_wp-parser_line_num', (string)$data['line']); $anything_updated[] = update_post_meta($post_id, '_wp-parser_end_line_num', (string)$data['end_line']); - $anything_updated[] = update_post_meta($post_id, '_wp-parser_tags', $data['doc']['tags']); $anything_updated[] = update_post_meta($post_id, '_wp-parser_last_parsed_version', $this->version); // If the post didn't need to be updated, but meta or tax changed, update it to bump last modified. From 82a81307775b86f939a1fe89dec4f2be3b54bed6 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Thu, 16 Sep 2021 18:01:26 +0900 Subject: [PATCH 30/66] fix: make hook posts api function respect source type terms --- README.md | 3 +++ languages/wp-parser-ja.mo | Bin 7190 -> 7190 bytes languages/wp-parser-ja.po | 2 +- src/Importer/Importer.php | 25 +------------------------ src/api-functions.php | 17 ++++++++++++++--- 5 files changed, 19 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 6c4390b..61853b2 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,6 @@ Activate the plugin first: In your site's directory: wp parser create /path/to/source/code --user= + +## Known Parser Issues +- The parser will crash if it encounters an invokation of an anonymous function returned by a call to a method/function all on the same line. (ie: $this->getAndExecuteFunc()()) diff --git a/languages/wp-parser-ja.mo b/languages/wp-parser-ja.mo index c9a11ac323f18eae76e21253dbc716120f95f967..a2c96bd20693f3875e63d9d23b0cb844f240849b 100644 GIT binary patch delta 15 WcmbPcG0kFwvItYt{>`c)AK3ve83n5V delta 15 WcmbPcG0kFwvItXi$7WTLkL&;})&+F{ diff --git a/languages/wp-parser-ja.po b/languages/wp-parser-ja.po index 74b92b3..138eff6 100644 --- a/languages/wp-parser-ja.po +++ b/languages/wp-parser-ja.po @@ -520,7 +520,7 @@ msgstr "データセット" #: src/Registrations.php:466 msgid "Getter" -msgstr "デート取得" +msgstr "データ取得" #: src/Registrations.php:672 msgctxt "separator" diff --git a/src/Importer/Importer.php b/src/Importer/Importer.php index 384ff7a..7dc85ab 100644 --- a/src/Importer/Importer.php +++ b/src/Importer/Importer.php @@ -652,18 +652,7 @@ protected function importClass(array $data, $import_ignored = false) { // Add slashes to types so that wp_unslash in update_post_meta doesnt remove them. // Without the slashes it's impossible to create the reference page link - foreach ($data['properties'] as &$prop) { - if (!empty($prop['doc']) && !empty($prop['doc']['tags'])) { - foreach ($prop['doc']['tags'] as &$tag) { - if (!empty($tag['types'])) { - foreach ($tag['types'] as &$type) { - $type = addslashes($type); - } - } - } - } - } - update_post_meta($class_id, '_wp-parser_properties', $data['properties']); + update_post_meta($class_id, '_wp-parser_properties', wp_slash($data['properties'])); // Now add the methods foreach ($data['methods'] as $method) { @@ -974,18 +963,6 @@ public function importItem(array $data, $parent_post_id = 0, $import_ignored = f $anything_updated[] = update_post_meta($post_id, '_wp_parser_namespace', (string)addslashes($data['namespace'])); } - // Add extra namespace slashes to types so that wp_unslash in update_post_meta doesnt remove them. - // Without the slashes it's impossible to create the reference page link - /* if (!empty($data['doc']) && !empty($data['doc']['tags'])) { - foreach ($data['doc']['tags'] as &$tag) { - if (!empty($tag['types'])) { - foreach ($tag['types'] as &$type) { - $type = wp_slash($type); - } - } - } - } */ - // We have to add slashes so that namespace slashes aren't stripped by update_post_meta // Without the slashes it's impossible to create reference links for class/method references with PSR-4 namespaces $anything_updated[] = update_post_meta($post_id, '_wp-parser_tags', wp_slash($data['doc']['tags'])); diff --git a/src/api-functions.php b/src/api-functions.php index a0607c3..93d8e27 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -531,15 +531,26 @@ function avcpdp_get_reference_post_list_having_roles($posts_per_page = 50) { * Returns list of hook reference post IDs * * @author Evan D Shaw - * @param string $hook_type - * @param int $posts_per_page + * @param WP_Term[] $stterms + * @param string $hook_type + * @param int $posts_per_page * @return WP_Query */ -function avcpdp_get_hook_reference_posts($hook_type = 'all', $posts_per_page = 20) { +function avcpdp_get_hook_reference_posts($stterms, $hook_type = 'all', $posts_per_page = 20) { $params = [ 'fields' => 'ids', 'post_type' => 'wp-parser-hook', 'posts_per_page' => $posts_per_page, + 'tax_query' => [ + 'relation' => 'AND', + [ + 'taxonomy' => Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG, + 'field' => 'slug', + 'terms' => [$stterms['type']->slug, $stterms['name']->slug], + 'include_children' => false, + 'operator' => 'AND', + ], + ], ]; if ($hook_type === 'filter' || $hook_type === 'action') { $params['meta_key'] = '_wp-parser_hook_type'; From 7e10d6b7748440f1c35a0f81783345d3299e0b6c Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Fri, 17 Sep 2021 19:07:15 +0900 Subject: [PATCH 31/66] fix: only show roles that have posts for the given source type terms --- src/Formatting.php | 2 +- src/Queries.php | 40 ++++++++++++++++++++++++++++++- src/api-functions.php | 56 ++++++++++++++++++++++++------------------- 3 files changed, 71 insertions(+), 27 deletions(-) diff --git a/src/Formatting.php b/src/Formatting.php index 7e47e4c..54e991e 100644 --- a/src/Formatting.php +++ b/src/Formatting.php @@ -429,7 +429,7 @@ function ($matches) use ($strip_namespaces) { ); } - // Detect references to classes, e.g. WP_Query + // Detect references to classes $content = preg_replace_callback( // Resolves PSR-4 class names // If referencing a top level class (ie: MyClass), the class name MUST be prefixed with diff --git a/src/Queries.php b/src/Queries.php index eac08d4..1cbf714 100644 --- a/src/Queries.php +++ b/src/Queries.php @@ -18,6 +18,45 @@ public static function init() { add_filter('query_vars', [get_class(), 'addHookTypeQueryVar'], 10, 1); add_action('parse_tax_query', [get_class(), 'taxQueryNoChildren'], 10, 1); add_filter('pre_handle_404', [get_class(), 'force404onWrongSourceType'], 10, 2); + add_filter('posts_results', [get_class(), 'orderByNotDeprecated'], 10, 1); + } + + /** + * Uses PHP to put deprecated wp-parser-* posts at the end of the list for + * archive pages + * + * @author Evan D Shaw + * @param \WP_Posts[] $posts + * @return \WP_Posts[] + */ + public static function orderByNotDeprecated($posts) { + global $wp_query; + + if (!$wp_query->is_main_query() || !$wp_query->is_post_type_archive()) { + return $posts; + } + + $ptype = !empty($wp_query->query['post_type']) ? $wp_query->query['post_type'] : ''; + if (!avcpdp_is_parsed_post_type($ptype)) { + return $posts; + } + + $isdeprecated = []; + $notdeprecated = []; + foreach ($posts as $post) { + $tags = get_post_meta($post->ID, '_wp-parser_tags', true); + $deprecated = wp_filter_object_list($tags, ['name' => 'deprecated']); + $deprecated = array_shift($deprecated); + if ($deprecated) { + $isdeprecated[] = $post; + } else { + $notdeprecated[] = $post; + } + } + + $posts = array_merge($notdeprecated, $isdeprecated); + + return $posts; } /** @@ -30,7 +69,6 @@ public static function preGetPosts($query) { if ($query->is_main_query() && $query->is_post_type_archive()) { $query->set('orderby', 'title'); $query->set('order', 'ASC'); - // $query->set('posts_per_page', 20); $ptype = !empty($query->query['post_type']) ? $query->query['post_type'] : ''; $hook_type = !empty($query->query['hook_type']) ? $query->query['hook_type'] : ''; if ($ptype === 'wp-parser-hook' && ($hook_type === 'filter' || $hook_type === 'action')) { diff --git a/src/api-functions.php b/src/api-functions.php index 93d8e27..c7a5797 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -458,7 +458,7 @@ function avcpdp_get_source_type_plugin_terms() { * @param int $posts_per_page * @return WP_Query */ -function avcpdp_get_reference_post_list_by_role($stterms, $role, $posts_per_page = 10) { +function avcpdp_get_reference_post_list_by_role($stterms, $role, $posts_per_page = 5) { $q = new WP_Query([ 'fields' => 'ids', 'post_type' => avcpdp_get_parsed_post_types(), @@ -485,14 +485,15 @@ function avcpdp_get_reference_post_list_by_role($stterms, $role, $posts_per_page } /** - * Returns list of role terms + * Returns list of role terms for a source * * @author Evan D Shaw + * @param array $stterms Source type terms * @param string $fields * @param bool $hide_empty * @return WP_Term[] */ -function avcpdp_get_role_terms($fields = 'all', $hide_empty = true) { +function avcpdp_get_role_terms($stterms, $fields = 'all', $hide_empty = true) { $terms = get_terms([ 'taxonomy' => Aivec\Plugins\DocParser\Registrations::ROLE_TAX_SLUG, 'hide_empty' => $hide_empty, @@ -502,29 +503,34 @@ function avcpdp_get_role_terms($fields = 'all', $hide_empty = true) { return []; } - return $terms; -} - -/** - * Returns list of reference post type posts that have at least one role assigned to them - * - * @author Evan D Shaw - * @param int $posts_per_page - * @return int[] - */ -function avcpdp_get_reference_post_list_having_roles($posts_per_page = 50) { - return get_posts([ - 'fields' => 'ids', - 'post_type' => avcpdp_get_parsed_post_types(), - 'posts_per_page' => $posts_per_page, - 'tax_query' => [ - [ - 'taxonomy' => Aivec\Plugins\DocParser\Registrations::ROLE_TAX_SLUG, - 'field' => 'slug', - 'terms' => avcpdp_get_role_terms('slugs'), + $roleswithposts = []; + foreach ($terms as $role) { + $q = new WP_Query([ + 'fields' => 'ids', + 'post_type' => avcpdp_get_parsed_post_types(), + 'tax_query' => [ + 'relation' => 'AND', + [ + 'taxonomy' => Aivec\Plugins\DocParser\Registrations::ROLE_TAX_SLUG, + 'field' => 'slug', + 'terms' => $role->slug, + 'include_children' => true, + ], + [ + 'taxonomy' => Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG, + 'field' => 'slug', + 'terms' => [$stterms['type']->slug, $stterms['name']->slug], + 'include_children' => false, + 'operator' => 'AND', + ], ], - ], - ]); + ]); + if ($q->post_count > 0) { + $roleswithposts[] = $role; + } + } + + return $roleswithposts; } /** From 5886df619d0dff6c5f6b48744e92989bdca48243 Mon Sep 17 00:00:00 2001 From: Seiyu Inoue Date: Tue, 21 Sep 2021 14:34:48 +0900 Subject: [PATCH 32/66] sourcetype svg upload added --- src/SourceTypeTerm.php | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/SourceTypeTerm.php b/src/SourceTypeTerm.php index ff613a7..5fd68fe 100644 --- a/src/SourceTypeTerm.php +++ b/src/SourceTypeTerm.php @@ -45,22 +45,14 @@ public static function addFormAttributeEncTypeMultiPart() { */ public static function addFieldsItemImage($term) { $max_upload_size = wp_max_upload_size() ?: 0; - - // wp_nonce_field('item_image', 'item_image_file_nonce'); - // $id = get_the_ID(); - // $post_meta = get_post_meta($id, 'item_image', true); - // if ($post_meta) { - // echo '

    ' . $post_meta['url'] . '

    '; - // } - $welitempid = (int)get_term_meta($term->term_id, 'item_image', true); - $test = get_term_meta($term->term_id, 'item_image', true); + $term_meta = get_term_meta($term->term_id, 'item_image', true); ?> - + - -

    + +

    + ' . $term_meta['url'] . '

    '; + } + ?> Date: Tue, 21 Sep 2021 17:39:15 +0900 Subject: [PATCH 33/66] review content reflected --- src/SourceTypeTerm.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/SourceTypeTerm.php b/src/SourceTypeTerm.php index 5fd68fe..f42e0ba 100644 --- a/src/SourceTypeTerm.php +++ b/src/SourceTypeTerm.php @@ -41,6 +41,7 @@ public static function addFormAttributeEncTypeMultiPart() { * Adds item image pick field to term edit page * * @author Seiyu Inoue + * @param mixed $term * @return void */ public static function addFieldsItemImage($term) { @@ -82,11 +83,6 @@ public static function updateItemImageTermMeta($term_id) { return; } - $term_meta = get_term_meta($term_id, 'item_image', true); - if ($term_meta) { - @unlink($term_meta['file']); - } - $file = $_FILES['item_image']; $file_type = wp_check_filetype($file['name']); if ($file_type['ext'] != 'svg') { @@ -104,6 +100,11 @@ public static function updateItemImageTermMeta($term_id) { wp_die('Upload error : ' . $upload['error']); } + $term_meta = get_term_meta($term_id, 'item_image', true); + if ($term_meta) { + @unlink($term_meta['file']); + } + $term_meta = [ 'file' => $upload['file'], 'url' => $upload['url'], @@ -175,7 +176,7 @@ public static function generateSvgAttachmentMetaData($metadata, $attachment_id) // get the path relative to /uploads/ - found no better way: $relative_path = str_replace($upload_dir['basedir'], '', $svg_path); $filename = basename($svg_path); - $dimensions = $this->getSvgDimensions($svg_path); + $dimensions = self::getSvgDimensions($svg_path); $metadata = [ 'width' => intval($dimensions->width), 'height' => intval($dimensions->height), @@ -218,7 +219,7 @@ public static function response4Svg($response, $attachment) { $svg_path = get_attached_file($attachment->ID); // If SVG is external, use the URL instead of the path $svg_path = file_exists($svg_path) ?: $response['url']; - $dimensions = $this->getSvgDimensions($svg_path); + $dimensions = self::getSvgDimensions($svg_path); $response['sizes'] = [ 'full' => [ 'url' => $response['url'], From bf387d00e034f962377d66bb116c19ac4c457c95 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 22 Sep 2021 10:00:45 +0900 Subject: [PATCH 34/66] feat: add settings page for importing --- .gitignore | 4 +- composer.json | 30 +- composer.lock | 2240 +- package-lock.json | 33031 +++++++++++++++++++++ package.json | 106 + plugin.php | 4 +- src/API/Commands.php | 184 + src/CLI/CliErrorException.php | 42 + src/CLI/Commands.php | 131 +- src/CLI/Logger.php | 3 +- src/ErrorStore.php | 61 + src/Importer/Importer.php | 38 +- src/Master.php | 40 +- src/REST/Import.php | 93 + src/REST/Settings.php | 60 + src/Routes.php | 50 + src/SourceTypeTerm.php | 5 +- src/Types/Injected.ts | 5 + src/Types/globals.d.ts | 5 + src/Views/ImporterPage/App.tsx | 10 + src/Views/ImporterPage/Import.tsx | 94 + src/Views/ImporterPage/ImporterPage.php | 147 + src/Views/ImporterPage/ImporterPage.tsx | 42 + src/Views/ImporterPage/Settings.tsx | 72 + src/Views/ImporterPage/Types.ts | 6 + src/Views/ImporterPage/importer-page.css | 5 + tsconfig.json | 35 + 27 files changed, 35868 insertions(+), 675 deletions(-) create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/API/Commands.php create mode 100644 src/CLI/CliErrorException.php create mode 100644 src/ErrorStore.php create mode 100644 src/REST/Import.php create mode 100644 src/REST/Settings.php create mode 100644 src/Routes.php create mode 100644 src/Types/Injected.ts create mode 100644 src/Types/globals.d.ts create mode 100644 src/Views/ImporterPage/App.tsx create mode 100644 src/Views/ImporterPage/Import.tsx create mode 100644 src/Views/ImporterPage/ImporterPage.php create mode 100644 src/Views/ImporterPage/ImporterPage.tsx create mode 100644 src/Views/ImporterPage/Settings.tsx create mode 100644 src/Views/ImporterPage/Types.ts create mode 100644 src/Views/ImporterPage/importer-page.css create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index 5657f6e..f0fc90f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -vendor \ No newline at end of file +vendor +node_modules +dist diff --git a/composer.json b/composer.json index c126b92..03153a8 100644 --- a/composer.json +++ b/composer.json @@ -21,6 +21,19 @@ "support": { "issues": "https://github.com/WordPress/phpdoc-parser/issues" }, + "extra": { + "mozart": { + "dep_namespace": "AVCPDP\\", + "dep_directory": "/dist/AVCPDP/", + "classmap_directory": "/dist/classes/", + "classmap_prefix": "AVCPDP_", + "packages": [ + "aivec/wordpress-router", + "aivec/response-handler", + "aivec/core-css" + ] + } + }, "require": { "php": ">=5.4", "composer/installers": "~1.0", @@ -28,11 +41,16 @@ "erusev/parsedown": "~1.7", "scribu/lib-posts-to-posts": "dev-master@dev", "scribu/scb-framework": "dev-master@dev", - "psr/log": "~1.0" + "psr/log": "~1.0", + "aivec/wordpress-router": "^7.0", + "aivec/response-handler": "^5.0", + "aivec/core-css": "^2.0", + "wp-cli/wp-cli": "^2.5" }, "require-dev": { "wp-cli/i18n-command": "^2.2", - "aivec/phpcs-wp": "^2.0" + "aivec/phpcs-wp": "^2.0", + "coenjacobs/mozart": "^0.7.1" }, "autoload": { "files": [ @@ -40,6 +58,7 @@ "src/template-functions.php" ], "psr-4": { + "AVCPDP\\": "dist/AVCPDP", "Aivec\\Plugins\\DocParser\\": "src" } }, @@ -48,6 +67,11 @@ "lint:fix": "phpcbf -ps --standard=AivecWP-5 --ignore=*/tests/* .", "i18n:create-pot": "./vendor/bin/wp i18n make-pot . languages/messages.pot", "i18n:update-pos": "@composer i18n:create-pot && find ./languages -name \"*.po\" | xargs -I % msgmerge -o % % languages/messages.pot", - "i18n:make-mo": "./vendor/bin/wp i18n make-mo languages" + "i18n:make-mo": "./vendor/bin/wp i18n make-mo languages", + "build": [ + "composer install", + "mozart compose", + "composer install --no-dev" + ] } } diff --git a/composer.lock b/composer.lock index 14d8347..cfd398d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,139 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "37b4bb896739e4a866615359ddaa899f", + "content-hash": "f522ec19be9b5b2d536898d75568ed62", "packages": [ + { + "name": "aivec/core-css", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/aivec/core-css.git", + "reference": "3f5991de5c4ee28e97dd206eb43851387117516c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aivec/core-css/zipball/3f5991de5c4ee28e97dd206eb43851387117516c", + "reference": "3f5991de5c4ee28e97dd206eb43851387117516c", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Aivec\\Core\\CSS\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "authors": [ + { + "name": "Evan Shaw", + "email": "evandanielshaw@gmail.com" + } + ], + "description": "Aivec core CSS styles", + "support": { + "issues": "https://github.com/aivec/core-css/issues", + "source": "https://github.com/aivec/core-css/tree/v2.0.1" + }, + "time": "2021-09-15T03:55:48+00:00" + }, + { + "name": "aivec/response-handler", + "version": "v5.0.0", + "source": { + "type": "git", + "url": "https://github.com/aivec/response-handler.git", + "reference": "e2119b3025376fa533bc26fe39d89b5ef0d9c059" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aivec/response-handler/zipball/e2119b3025376fa533bc26fe39d89b5ef0d9c059", + "reference": "e2119b3025376fa533bc26fe39d89b5ef0d9c059", + "shasum": "" + }, + "require": { + "psr/log": "^1.1" + }, + "require-dev": { + "aivec/phpcs-wp": "^2.0", + "phpunit/phpunit": "^9.0", + "wp-cli/i18n-command": "^2.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Aivec\\ResponseHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0" + ], + "authors": [ + { + "name": "Evan Shaw", + "email": "evandanielshaw@gmail.com" + } + ], + "description": "Utilities for creating error object stores, generating error API responses, etc.", + "support": { + "issues": "https://github.com/aivec/response-handler/issues", + "source": "https://github.com/aivec/response-handler/tree/v5.0.0" + }, + "time": "2021-03-16T08:55:59+00:00" + }, + { + "name": "aivec/wordpress-router", + "version": "v7.0.0", + "source": { + "type": "git", + "url": "https://github.com/aivec/wordpress-router.git", + "reference": "0253db277dc396ac0d8a8814e5842e4c55e35091" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aivec/wordpress-router/zipball/0253db277dc396ac0d8a8814e5842e4c55e35091", + "reference": "0253db277dc396ac0d8a8814e5842e4c55e35091", + "shasum": "" + }, + "require": { + "aivec/response-handler": "^5.0", + "nikic/fast-route": "^1.3" + }, + "require-dev": { + "aivec/codecept-docker": "^0.4.0", + "aivec/phpcs-wp": "^2.0", + "codeception/module-asserts": "^1.3", + "codeception/module-cli": "^1.1", + "codeception/module-db": "^1.1", + "codeception/module-phpbrowser": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Aivec\\WordPress\\Routing\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "authors": [ + { + "name": "Evan Shaw", + "email": "evandanielshaw@gmail.com" + } + ], + "description": "WordPress request router. Middleware handling and nonce checks included.", + "support": { + "issues": "https://github.com/aivec/wordpress-router/issues", + "source": "https://github.com/aivec/wordpress-router/tree/v7.0.0" + }, + "time": "2021-04-29T04:16:30+00:00" + }, { "name": "composer/installers", "version": "v1.9.0", @@ -197,6 +328,106 @@ }, "time": "2019-12-30T22:54:17+00:00" }, + { + "name": "mustache/mustache", + "version": "v2.13.0", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/mustache.php.git", + "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e95c5a008c23d3151d59ea72484d4f72049ab7f4", + "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.11", + "phpunit/phpunit": "~3.7|~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Mustache": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "A Mustache implementation in PHP.", + "homepage": "https://github.com/bobthecow/mustache.php", + "keywords": [ + "mustache", + "templating" + ], + "support": { + "issues": "https://github.com/bobthecow/mustache.php/issues", + "source": "https://github.com/bobthecow/mustache.php/tree/master" + }, + "time": "2019-11-23T21:40:31+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "FastRoute\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/master" + }, + "time": "2018-02-13T20:26:39+00:00" + }, { "name": "nikic/php-parser", "version": "v1.4.1", @@ -407,6 +638,66 @@ }, "time": "2020-03-23T09:12:05+00:00" }, + { + "name": "rmccue/requests", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/WordPress/Requests.git", + "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/Requests/zipball/82e6936366eac3af4d836c18b9d8c31028fe4cd5", + "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "php-parallel-lint/php-console-highlighter": "^0.5.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcompatibility/php-compatibility": "^9.0", + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5", + "requests/test-server": "dev-master", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Requests": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Ryan McCue", + "homepage": "http://ryanmccue.info" + } + ], + "description": "A HTTP library written in PHP, for human beings.", + "homepage": "http://github.com/WordPress/Requests", + "keywords": [ + "curl", + "fsockopen", + "http", + "idna", + "ipv6", + "iri", + "sockets" + ], + "support": { + "issues": "https://github.com/WordPress/Requests/issues", + "source": "https://github.com/WordPress/Requests/tree/v1.8.1" + }, + "time": "2021-06-04T09:56:25+00:00" + }, { "name": "scribu/lib-posts-to-posts", "version": "dev-master", @@ -488,74 +779,768 @@ "wiki": "https://github.com/scribu/wp-scb-framework/wiki" }, "time": "2020-03-15T20:51:58+00:00" - } - ], - "packages-dev": [ + }, { - "name": "aivec/phpcs-wp", - "version": "v2.0.10", + "name": "symfony/finder", + "version": "v5.3.7", "source": { "type": "git", - "url": "https://github.com/aivec/phpcs-wp.git", - "reference": "6cbcf3c5437b69ee174b0fba655529ce047cb112" + "url": "https://github.com/symfony/finder.git", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aivec/phpcs-wp/zipball/6cbcf3c5437b69ee174b0fba655529ce047cb112", - "reference": "6cbcf3c5437b69ee174b0fba655529ce047cb112", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", "shasum": "" }, "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "php": ">=5.6.0,<8.0.0-dev", - "phpcompatibility/php-compatibility": "^9.3", - "phpcompatibility/phpcompatibility-wp": "^2.1", - "squizlabs/php_codesniffer": "^3.5", - "wp-coding-standards/wpcs": "^2.3" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, - "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "wp-cli/mustangostang-spyc", + "version": "0.6.3", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/spyc.git", + "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "shasum": "" + }, + "require": { + "php": ">=5.3.1" + }, + "require-dev": { + "phpunit/phpunit": "4.3.*@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Mustangostang\\": "src/" + }, + "files": [ + "includes/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "mustangostang", + "email": "vlad.andersen@gmail.com" + } + ], + "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)", + "homepage": "https://github.com/mustangostang/spyc/", + "support": { + "source": "https://github.com/wp-cli/spyc/tree/autoload" + }, + "time": "2017-04-25T11:26:20+00:00" + }, + { + "name": "wp-cli/php-cli-tools", + "version": "v0.11.13", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/php-cli-tools.git", + "reference": "a2866855ac1abc53005c102e901553ad5772dc04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/a2866855ac1abc53005c102e901553ad5772dc04", + "reference": "a2866855ac1abc53005c102e901553ad5772dc04", + "shasum": "" + }, + "require": { + "php": ">= 5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "cli": "lib/" + }, + "files": [ + "lib/cli/cli.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@handbuilt.co", + "role": "Maintainer" + }, + { + "name": "James Logsdon", + "email": "jlogsdon@php.net", + "role": "Developer" + } + ], + "description": "Console utilities for PHP", + "homepage": "http://github.com/wp-cli/php-cli-tools", + "keywords": [ + "cli", + "console" + ], + "support": { + "issues": "https://github.com/wp-cli/php-cli-tools/issues", + "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.13" + }, + "time": "2021-07-01T15:08:16+00:00" + }, + { + "name": "wp-cli/wp-cli", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/wp-cli.git", + "reference": "0bcf0c54f4d35685211d435e25219cc7acbe6d48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/0bcf0c54f4d35685211d435e25219cc7acbe6d48", + "reference": "0bcf0c54f4d35685211d435e25219cc7acbe6d48", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "mustache/mustache": "~2.13", + "php": "^5.6 || ^7.0 || ^8.0", + "rmccue/requests": "^1.8", + "symfony/finder": ">2.7", + "wp-cli/mustangostang-spyc": "^0.6.3", + "wp-cli/php-cli-tools": "~0.11.2" + }, + "require-dev": { + "roave/security-advisories": "dev-master", + "wp-cli/db-command": "^1.3 || ^2", + "wp-cli/entity-command": "^1.2 || ^2", + "wp-cli/extension-command": "^1.1 || ^2", + "wp-cli/package-command": "^1 || ^2", + "wp-cli/wp-cli-tests": "^3.0.7" + }, + "suggest": { + "ext-readline": "Include for a better --prompt implementation", + "ext-zip": "Needed to support extraction of ZIP archives when doing downloads or updates" + }, + "bin": [ + "bin/wp", + "bin/wp.bat" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5.x-dev" + } + }, + "autoload": { + "psr-0": { + "WP_CLI\\": "php/" + }, + "classmap": [ + "php/class-wp-cli.php", + "php/class-wp-cli-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "WP-CLI framework", + "homepage": "https://wp-cli.org", + "keywords": [ + "cli", + "wordpress" + ], + "support": { + "docs": "https://make.wordpress.org/cli/handbook/", + "issues": "https://github.com/wp-cli/wp-cli/issues", + "source": "https://github.com/wp-cli/wp-cli" + }, + "time": "2021-05-14T13:44:51+00:00" + } + ], + "packages-dev": [ + { + "name": "aivec/phpcs-wp", + "version": "v2.0.10", + "source": { + "type": "git", + "url": "https://github.com/aivec/phpcs-wp.git", + "reference": "6cbcf3c5437b69ee174b0fba655529ce047cb112" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aivec/phpcs-wp/zipball/6cbcf3c5437b69ee174b0fba655529ce047cb112", + "reference": "6cbcf3c5437b69ee174b0fba655529ce047cb112", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "php": ">=5.6.0,<8.0.0-dev", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3" + }, + "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", "license": [ "GPL-2.0-only" ], - "description": "Aivec coding standards for vanilla PHP and WordPress PHP libraries/projects/plugins/themes", + "description": "Aivec coding standards for vanilla PHP and WordPress PHP libraries/projects/plugins/themes", + "support": { + "issues": "https://github.com/aivec/phpcs-wp/issues", + "source": "https://github.com/aivec/phpcs-wp/tree/v2.0.10" + }, + "time": "2021-09-13T13:58:46+00:00" + }, + { + "name": "coenjacobs/mozart", + "version": "0.7.1", + "source": { + "type": "git", + "url": "https://github.com/coenjacobs/mozart.git", + "reference": "dbcdeb992d20d9c8914eef090f9a0d684bb1102c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/coenjacobs/mozart/zipball/dbcdeb992d20d9c8914eef090f9a0d684bb1102c", + "reference": "dbcdeb992d20d9c8914eef090f9a0d684bb1102c", + "shasum": "" + }, + "require": { + "league/flysystem": "^1.0", + "php": "^7.3|^8.0", + "symfony/console": "^4|^5", + "symfony/finder": "^4|^5" + }, + "require-dev": { + "mheap/phpunit-github-actions-printer": "^1.4", + "phpunit/phpunit": "^8.5", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.4" + }, + "bin": [ + "bin/mozart" + ], + "type": "library", + "autoload": { + "psr-4": { + "CoenJacobs\\Mozart\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Coen Jacobs", + "email": "coenjacobs@gmail.com" + } + ], + "description": "Composes all dependencies as a package inside a WordPress plugin", + "support": { + "issues": "https://github.com/coenjacobs/mozart/issues", + "source": "https://github.com/coenjacobs/mozart/tree/0.7.1" + }, + "funding": [ + { + "url": "https://github.com/coenjacobs", + "type": "github" + } + ], + "time": "2021-02-02T21:37:03+00:00" + }, + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v0.7.1", + "source": { + "type": "git", + "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", + "reference": "fe390591e0241955f22eb9ba327d137e501c771c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c", + "reference": "fe390591e0241955f22eb9ba327d137e501c771c", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "phpcompatibility/php-compatibility": "^9.0", + "sensiolabs/security-checker": "^4.1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", + "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + }, + "time": "2020-12-07T18:04:37+00:00" + }, + { + "name": "gettext/gettext", + "version": "v4.8.5", + "source": { + "type": "git", + "url": "https://github.com/php-gettext/Gettext.git", + "reference": "ef2e312dff383fc0e4cd62dd39042e1157f137d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/ef2e312dff383fc0e4cd62dd39042e1157f137d4", + "reference": "ef2e312dff383fc0e4cd62dd39042e1157f137d4", + "shasum": "" + }, + "require": { + "gettext/languages": "^2.3", + "php": ">=5.4.0" + }, + "require-dev": { + "illuminate/view": "^5.0.x-dev", + "phpunit/phpunit": "^4.8|^5.7|^6.5", + "squizlabs/php_codesniffer": "^3.0", + "symfony/yaml": "~2", + "twig/extensions": "*", + "twig/twig": "^1.31|^2.0" + }, + "suggest": { + "illuminate/view": "Is necessary if you want to use the Blade extractor", + "symfony/yaml": "Is necessary if you want to use the Yaml extractor/generator", + "twig/extensions": "Is necessary if you want to use the Twig extractor", + "twig/twig": "Is necessary if you want to use the Twig extractor" + }, + "type": "library", + "autoload": { + "psr-4": { + "Gettext\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", + "role": "Developer" + } + ], + "description": "PHP gettext manager", + "homepage": "https://github.com/oscarotero/Gettext", + "keywords": [ + "JS", + "gettext", + "i18n", + "mo", + "po", + "translation" + ], + "support": { + "email": "oom@oscarotero.com", + "issues": "https://github.com/oscarotero/Gettext/issues", + "source": "https://github.com/php-gettext/Gettext/tree/v4.8.5" + }, + "funding": [ + { + "url": "https://paypal.me/oscarotero", + "type": "custom" + }, + { + "url": "https://github.com/oscarotero", + "type": "github" + }, + { + "url": "https://www.patreon.com/misteroom", + "type": "patreon" + } + ], + "time": "2021-07-13T16:45:53+00:00" + }, + { + "name": "gettext/languages", + "version": "2.8.1", + "source": { + "type": "git", + "url": "https://github.com/php-gettext/Languages.git", + "reference": "4ad818b6341e177b7c508ec4c37e18932a7b788a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/4ad818b6341e177b7c508ec4c37e18932a7b788a", + "reference": "4ad818b6341e177b7c508ec4c37e18932a7b788a", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" + }, + "bin": [ + "bin/export-plural-rules" + ], + "type": "library", + "autoload": { + "psr-4": { + "Gettext\\Languages\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michele Locati", + "email": "mlocati@gmail.com", + "role": "Developer" + } + ], + "description": "gettext languages with plural rules", + "homepage": "https://github.com/php-gettext/Languages", + "keywords": [ + "cldr", + "i18n", + "internationalization", + "l10n", + "language", + "languages", + "localization", + "php", + "plural", + "plural rules", + "plurals", + "translate", + "translations", + "unicode" + ], + "support": { + "issues": "https://github.com/php-gettext/Languages/issues", + "source": "https://github.com/php-gettext/Languages/tree/2.8.1" + }, + "funding": [ + { + "url": "https://paypal.me/mlocati", + "type": "custom" + }, + { + "url": "https://github.com/mlocati", + "type": "github" + } + ], + "time": "2021-07-14T15:03:58+00:00" + }, + { + "name": "league/flysystem", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/18634df356bfd4119fe3d6156bdb990c414c14ea", + "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/mime-type-detection": "^1.3", + "php": "^7.2.5 || ^8.0" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/prophecy": "^1.11.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], "support": { - "issues": "https://github.com/aivec/phpcs-wp/issues", - "source": "https://github.com/aivec/phpcs-wp/tree/v2.0.10" + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.1.5" }, - "time": "2021-09-13T13:58:46+00:00" + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2021-08-17T13:49:42+00:00" }, { - "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v0.7.1", + "name": "league/mime-type-detection", + "version": "1.7.0", "source": { "type": "git", - "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", - "reference": "fe390591e0241955f22eb9ba327d137e501c771c" + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c", - "reference": "fe390591e0241955f22eb9ba327d137e501c771c", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", + "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=5.3", - "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0" + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" }, "require-dev": { - "composer/composer": "*", - "phpcompatibility/php-compatibility": "^9.0", - "sensiolabs/security-checker": "^4.1.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + "friendsofphp/php-cs-fixer": "^2.18", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" }, + "type": "library", "autoload": { "psr-4": { - "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + "League\\MimeTypeDetection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -564,604 +1549,798 @@ ], "authors": [ { - "name": "Franck Nijhof", - "email": "franck.nijhof@dealerdirect.com", - "homepage": "http://www.frenck.nl", - "role": "Developer / IT Manager" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "homepage": "http://www.dealerdirect.com", - "keywords": [ - "PHPCodeSniffer", - "PHP_CodeSniffer", - "code quality", - "codesniffer", - "composer", - "installer", - "phpcs", - "plugin", - "qa", - "quality", - "standard", - "standards", - "style guide", - "stylecheck", - "tests" - ], + "description": "Mime-type detection for Flysystem", "support": { - "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", - "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.7.0" }, - "time": "2020-12-07T18:04:37+00:00" + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2021-01-18T20:58:21+00:00" }, { - "name": "gettext/gettext", - "version": "v4.8.5", + "name": "mck89/peast", + "version": "v1.13.6", "source": { "type": "git", - "url": "https://github.com/php-gettext/Gettext.git", - "reference": "ef2e312dff383fc0e4cd62dd39042e1157f137d4" + "url": "https://github.com/mck89/peast.git", + "reference": "67566e6d594ffb70057fee7adceac9300998cc95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/ef2e312dff383fc0e4cd62dd39042e1157f137d4", - "reference": "ef2e312dff383fc0e4cd62dd39042e1157f137d4", + "url": "https://api.github.com/repos/mck89/peast/zipball/67566e6d594ffb70057fee7adceac9300998cc95", + "reference": "67566e6d594ffb70057fee7adceac9300998cc95", "shasum": "" }, "require": { - "gettext/languages": "^2.3", "php": ">=5.4.0" }, "require-dev": { - "illuminate/view": "^5.0.x-dev", - "phpunit/phpunit": "^4.8|^5.7|^6.5", - "squizlabs/php_codesniffer": "^3.0", - "symfony/yaml": "~2", - "twig/extensions": "*", - "twig/twig": "^1.31|^2.0" - }, - "suggest": { - "illuminate/view": "Is necessary if you want to use the Blade extractor", - "symfony/yaml": "Is necessary if you want to use the Yaml extractor/generator", - "twig/extensions": "Is necessary if you want to use the Twig extractor", - "twig/twig": "Is necessary if you want to use the Twig extractor" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13.6-dev" + } + }, "autoload": { "psr-4": { - "Gettext\\": "src" + "Peast\\": "lib/Peast/", + "Peast\\test\\": "test/Peast/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Oscar Otero", - "email": "oom@oscarotero.com", - "homepage": "http://oscarotero.com", - "role": "Developer" + "name": "Marco Marchiò", + "email": "marco.mm89@gmail.com" } ], - "description": "PHP gettext manager", - "homepage": "https://github.com/oscarotero/Gettext", - "keywords": [ - "JS", - "gettext", - "i18n", - "mo", - "po", - "translation" - ], + "description": "Peast is PHP library that generates AST for JavaScript code", "support": { - "email": "oom@oscarotero.com", - "issues": "https://github.com/oscarotero/Gettext/issues", - "source": "https://github.com/php-gettext/Gettext/tree/v4.8.5" + "issues": "https://github.com/mck89/peast/issues", + "source": "https://github.com/mck89/peast/tree/v1.13.6" }, - "funding": [ + "time": "2021-08-23T10:30:32+00:00" + }, + { + "name": "phpcompatibility/php-compatibility", + "version": "9.3.5", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" + }, + "conflict": { + "squizlabs/php_codesniffer": "2.6.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ { - "url": "https://paypal.me/oscarotero", - "type": "custom" + "name": "Wim Godden", + "homepage": "https://github.com/wimg", + "role": "lead" }, { - "url": "https://github.com/oscarotero", - "type": "github" + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" }, { - "url": "https://www.patreon.com/misteroom", - "type": "patreon" + "name": "Contributors", + "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" } ], - "time": "2021-07-13T16:45:53+00:00" + "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", + "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", + "keywords": [ + "compatibility", + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibility" + }, + "time": "2019-12-27T09:44:58+00:00" }, { - "name": "gettext/languages", - "version": "2.8.1", + "name": "phpcompatibility/phpcompatibility-paragonie", + "version": "1.3.1", "source": { "type": "git", - "url": "https://github.com/php-gettext/Languages.git", - "reference": "4ad818b6341e177b7c508ec4c37e18932a7b788a" + "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", + "reference": "ddabec839cc003651f2ce695c938686d1086cf43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Languages/zipball/4ad818b6341e177b7c508ec4c37e18932a7b788a", - "reference": "4ad818b6341e177b7c508ec4c37e18932a7b788a", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/ddabec839cc003651f2ce695c938686d1086cf43", + "reference": "ddabec839cc003651f2ce695c938686d1086cf43", "shasum": "" }, "require": { - "php": ">=5.3" + "phpcompatibility/php-compatibility": "^9.0" }, "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "paragonie/random_compat": "dev-master", + "paragonie/sodium_compat": "dev-master" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" + } + ], + "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", + "homepage": "http://phpcompatibility.com/", + "keywords": [ + "compatibility", + "paragonie", + "phpcs", + "polyfill", + "standards" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" + }, + "time": "2021-02-15T10:24:51+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-wp", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", + "reference": "a792ab623069f0ce971b2417edef8d9632e32f75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/a792ab623069f0ce971b2417edef8d9632e32f75", + "reference": "a792ab623069f0ce971b2417edef8d9632e32f75", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0", + "phpcompatibility/phpcompatibility-paragonie": "^1.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7" }, - "bin": [ - "bin/export-plural-rules" - ], - "type": "library", - "autoload": { - "psr-4": { - "Gettext\\Languages\\": "src/" - } + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." }, + "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "LGPL-3.0-or-later" ], "authors": [ { - "name": "Michele Locati", - "email": "mlocati@gmail.com", - "role": "Developer" + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" } ], - "description": "gettext languages with plural rules", - "homepage": "https://github.com/php-gettext/Languages", + "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", + "homepage": "http://phpcompatibility.com/", "keywords": [ - "cldr", - "i18n", - "internationalization", - "l10n", - "language", - "languages", - "localization", - "php", - "plural", - "plural rules", - "plurals", - "translate", - "translations", - "unicode" + "compatibility", + "phpcs", + "standards", + "wordpress" ], "support": { - "issues": "https://github.com/php-gettext/Languages/issues", - "source": "https://github.com/php-gettext/Languages/tree/2.8.1" + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" }, - "funding": [ - { - "url": "https://paypal.me/mlocati", - "type": "custom" - }, - { - "url": "https://github.com/mlocati", - "type": "github" - } - ], - "time": "2021-07-14T15:03:58+00:00" + "time": "2021-07-21T11:09:57+00:00" }, { - "name": "mck89/peast", - "version": "v1.13.6", + "name": "psr/container", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/mck89/peast.git", - "reference": "67566e6d594ffb70057fee7adceac9300998cc95" + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mck89/peast/zipball/67566e6d594ffb70057fee7adceac9300998cc95", - "reference": "67566e6d594ffb70057fee7adceac9300998cc95", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + "php": ">=7.2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.13.6-dev" - } - }, "autoload": { "psr-4": { - "Peast\\": "lib/Peast/", - "Peast\\test\\": "test/Peast/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Marco Marchiò", - "email": "marco.mm89@gmail.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Peast is PHP library that generates AST for JavaScript code", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], "support": { - "issues": "https://github.com/mck89/peast/issues", - "source": "https://github.com/mck89/peast/tree/v1.13.6" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2021-08-23T10:30:32+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { - "name": "mustache/mustache", - "version": "v2.13.0", + "name": "squizlabs/php_codesniffer", + "version": "3.6.0", "source": { "type": "git", - "url": "https://github.com/bobthecow/mustache.php.git", - "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4" + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e95c5a008c23d3151d59ea72484d4f72049ab7f4", - "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", "shasum": "" }, "require": { - "php": ">=5.2.4" + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~1.11", - "phpunit/phpunit": "~3.7|~4.0|~5.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], "type": "library", - "autoload": { - "psr-0": { - "Mustache": "src/" + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" + "name": "Greg Sherwood", + "role": "lead" } ], - "description": "A Mustache implementation in PHP.", - "homepage": "https://github.com/bobthecow/mustache.php", + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", "keywords": [ - "mustache", - "templating" + "phpcs", + "standards" ], "support": { - "issues": "https://github.com/bobthecow/mustache.php/issues", - "source": "https://github.com/bobthecow/mustache.php/tree/master" + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2019-11-23T21:40:31+00:00" + "time": "2021-04-09T00:54:41+00:00" }, { - "name": "phpcompatibility/php-compatibility", - "version": "9.3.5", + "name": "symfony/console", + "version": "v5.3.7", "source": { "type": "git", - "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", - "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" + "url": "https://github.com/symfony/console.git", + "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", - "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", + "url": "https://api.github.com/repos/symfony/console/zipball/8b1008344647462ae6ec57559da166c2bfa5e16a", + "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a", "shasum": "" }, "require": { - "php": ">=5.3", - "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" }, "conflict": { - "squizlabs/php_codesniffer": "2.6.2" + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" }, "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, - "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-3.0-or-later" + "MIT" ], "authors": [ { - "name": "Wim Godden", - "homepage": "https://github.com/wimg", - "role": "lead" - }, - { - "name": "Juliette Reinders Folmer", - "homepage": "https://github.com/jrfnl", - "role": "lead" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Contributors", - "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", - "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "phpcs", - "standards" + "cli", + "command line", + "console", + "terminal" ], "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", - "source": "https://github.com/PHPCompatibility/PHPCompatibility" + "source": "https://github.com/symfony/console/tree/v5.3.7" }, - "time": "2019-12-27T09:44:58+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-25T20:02:16+00:00" }, { - "name": "phpcompatibility/phpcompatibility-paragonie", - "version": "1.3.1", + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", - "reference": "ddabec839cc003651f2ce695c938686d1086cf43" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/ddabec839cc003651f2ce695c938686d1086cf43", - "reference": "ddabec839cc003651f2ce695c938686d1086cf43", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { - "phpcompatibility/php-compatibility": "^9.0" + "php": ">=7.1" }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7", - "paragonie/random_compat": "dev-master", - "paragonie/sodium_compat": "dev-master" + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } }, - "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + "autoload": { + "files": [ + "function.php" + ] }, - "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-3.0-or-later" + "MIT" ], "authors": [ { - "name": "Wim Godden", - "role": "lead" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Juliette Reinders Folmer", - "role": "lead" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", - "homepage": "http://phpcompatibility.com/", - "keywords": [ - "compatibility", - "paragonie", - "phpcs", - "polyfill", - "standards" - ], - "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", - "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" - }, - "time": "2021-02-15T10:24:51+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { - "name": "phpcompatibility/phpcompatibility-wp", - "version": "2.1.2", + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", - "reference": "a792ab623069f0ce971b2417edef8d9632e32f75" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/a792ab623069f0ce971b2417edef8d9632e32f75", - "reference": "a792ab623069f0ce971b2417edef8d9632e32f75", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { - "phpcompatibility/php-compatibility": "^9.0", - "phpcompatibility/phpcompatibility-paragonie": "^1.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7" + "php": ">=7.1" }, "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] }, - "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-3.0-or-later" + "MIT" ], "authors": [ { - "name": "Wim Godden", - "role": "lead" + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" }, { - "name": "Juliette Reinders Folmer", - "role": "lead" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", - "homepage": "http://phpcompatibility.com/", + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", "keywords": [ "compatibility", - "phpcs", - "standards", - "wordpress" + "ctype", + "polyfill", + "portable" ], "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", - "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" }, - "time": "2021-07-21T11:09:57+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" }, { - "name": "rmccue/requests", - "version": "v1.8.1", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", "source": { "type": "git", - "url": "https://github.com/WordPress/Requests.git", - "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WordPress/Requests/zipball/82e6936366eac3af4d836c18b9d8c31028fe4cd5", - "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", "shasum": "" }, "require": { - "php": ">=5.2" + "php": ">=7.1" }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7", - "php-parallel-lint/php-console-highlighter": "^0.5.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcompatibility/php-compatibility": "^9.0", - "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5", - "requests/test-server": "dev-master", - "squizlabs/php_codesniffer": "^3.5", - "wp-coding-standards/wpcs": "^2.0" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", - "autoload": { - "psr-0": { - "Requests": "library/" + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "ISC" + "MIT" ], "authors": [ { - "name": "Ryan McCue", - "homepage": "http://ryanmccue.info" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A HTTP library written in PHP, for human beings.", - "homepage": "http://github.com/WordPress/Requests", + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", "keywords": [ - "curl", - "fsockopen", - "http", - "idna", - "ipv6", - "iri", - "sockets" + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/WordPress/Requests/issues", - "source": "https://github.com/WordPress/Requests/tree/v1.8.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" }, - "time": "2021-06-04T09:56:25+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" }, { - "name": "squizlabs/php_codesniffer", - "version": "3.6.0", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" + "php": ">=7.1" }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "suggest": { + "ext-intl": "For best performance" }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev" + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Greg Sherwood", - "role": "lead" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", "keywords": [ - "phpcs", - "standards" + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, - "time": "2021-04-09T00:54:41+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" }, { - "name": "symfony/finder", - "version": "v5.3.7", + "name": "symfony/polyfill-mbstring", + "version": "v1.23.1", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Finder\\": "" + "Symfony\\Polyfill\\Mbstring\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "files": [ + "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1170,18 +2349,25 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Finds files and directories via an intuitive fluent interface", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" }, "funding": [ { @@ -1197,20 +2383,20 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "name": "symfony/polyfill-php73", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -1228,7 +2414,7 @@ }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Polyfill\\Php73\\": "" }, "files": [ "bootstrap.php" @@ -1242,10 +2428,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -1255,7 +2437,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -1264,7 +2446,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -1280,53 +2462,43 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { - "name": "wp-cli/i18n-command", - "version": "v2.2.9", + "name": "symfony/service-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/wp-cli/i18n-command.git", - "reference": "26e171c5708060b6d7cede9af934b946f5ec3a59" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/i18n-command/zipball/26e171c5708060b6d7cede9af934b946f5ec3a59", - "reference": "26e171c5708060b6d7cede9af934b946f5ec3a59", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { - "gettext/gettext": "^4.8", - "mck89/peast": "^1.13", - "wp-cli/wp-cli": "^2.5" - }, - "require-dev": { - "wp-cli/scaffold-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^3.0.11" + "php": ">=7.2.5", + "psr/container": "^1.1" }, "suggest": { - "ext-mbstring": "Used for calculating include/exclude matches in code extraction" + "symfony/service-implementation": "" }, - "type": "wp-cli-package", + "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-main": "2.4-dev" }, - "bundled": true, - "commands": [ - "i18n", - "i18n make-pot", - "i18n make-json" - ] + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } }, "autoload": { "psr-4": { - "WP_CLI\\I18n\\": "src/" - }, - "files": [ - "i18n-command.php" - ] + "Symfony\\Contracts\\Service\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1334,50 +2506,81 @@ ], "authors": [ { - "name": "Pascal Birchler", - "homepage": "https://pascalbirchler.com/" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Provides internationalization tools for WordPress projects.", - "homepage": "https://github.com/wp-cli/i18n-command", + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], "support": { - "issues": "https://github.com/wp-cli/i18n-command/issues", - "source": "https://github.com/wp-cli/i18n-command/tree/v2.2.9" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" }, - "time": "2021-07-20T21:25:54+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-01T10:43:52+00:00" }, { - "name": "wp-cli/mustangostang-spyc", - "version": "0.6.3", + "name": "symfony/string", + "version": "v5.3.7", "source": { "type": "git", - "url": "https://github.com/wp-cli/spyc.git", - "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7" + "url": "https://github.com/symfony/string.git", + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", - "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", "shasum": "" }, "require": { - "php": ">=5.3.1" + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" }, "require-dev": { - "phpunit/phpunit": "4.3.*@dev" + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.5.x-dev" - } - }, "autoload": { "psr-4": { - "Mustangostang\\": "src/" + "Symfony\\Component\\String\\": "" }, "files": [ - "includes/functions.php" + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1386,141 +2589,106 @@ ], "authors": [ { - "name": "mustangostang", - "email": "vlad.andersen@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)", - "homepage": "https://github.com/mustangostang/spyc/", + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], "support": { - "source": "https://github.com/wp-cli/spyc/tree/autoload" - }, - "time": "2017-04-25T11:26:20+00:00" - }, - { - "name": "wp-cli/php-cli-tools", - "version": "v0.11.13", - "source": { - "type": "git", - "url": "https://github.com/wp-cli/php-cli-tools.git", - "reference": "a2866855ac1abc53005c102e901553ad5772dc04" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/a2866855ac1abc53005c102e901553ad5772dc04", - "reference": "a2866855ac1abc53005c102e901553ad5772dc04", - "shasum": "" - }, - "require": { - "php": ">= 5.3.0" + "source": "https://github.com/symfony/string/tree/v5.3.7" }, - "type": "library", - "autoload": { - "psr-0": { - "cli": "lib/" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, - "files": [ - "lib/cli/cli.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ { - "name": "Daniel Bachhuber", - "email": "daniel@handbuilt.co", - "role": "Maintainer" + "url": "https://github.com/fabpot", + "type": "github" }, { - "name": "James Logsdon", - "email": "jlogsdon@php.net", - "role": "Developer" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Console utilities for PHP", - "homepage": "http://github.com/wp-cli/php-cli-tools", - "keywords": [ - "cli", - "console" - ], - "support": { - "issues": "https://github.com/wp-cli/php-cli-tools/issues", - "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.13" - }, - "time": "2021-07-01T15:08:16+00:00" + "time": "2021-08-26T08:00:08+00:00" }, { - "name": "wp-cli/wp-cli", - "version": "v2.5.0", + "name": "wp-cli/i18n-command", + "version": "v2.2.9", "source": { "type": "git", - "url": "https://github.com/wp-cli/wp-cli.git", - "reference": "0bcf0c54f4d35685211d435e25219cc7acbe6d48" + "url": "https://github.com/wp-cli/i18n-command.git", + "reference": "26e171c5708060b6d7cede9af934b946f5ec3a59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/0bcf0c54f4d35685211d435e25219cc7acbe6d48", - "reference": "0bcf0c54f4d35685211d435e25219cc7acbe6d48", + "url": "https://api.github.com/repos/wp-cli/i18n-command/zipball/26e171c5708060b6d7cede9af934b946f5ec3a59", + "reference": "26e171c5708060b6d7cede9af934b946f5ec3a59", "shasum": "" }, "require": { - "ext-curl": "*", - "mustache/mustache": "~2.13", - "php": "^5.6 || ^7.0 || ^8.0", - "rmccue/requests": "^1.8", - "symfony/finder": ">2.7", - "wp-cli/mustangostang-spyc": "^0.6.3", - "wp-cli/php-cli-tools": "~0.11.2" + "gettext/gettext": "^4.8", + "mck89/peast": "^1.13", + "wp-cli/wp-cli": "^2.5" }, "require-dev": { - "roave/security-advisories": "dev-master", - "wp-cli/db-command": "^1.3 || ^2", - "wp-cli/entity-command": "^1.2 || ^2", - "wp-cli/extension-command": "^1.1 || ^2", - "wp-cli/package-command": "^1 || ^2", - "wp-cli/wp-cli-tests": "^3.0.7" + "wp-cli/scaffold-command": "^1.2 || ^2", + "wp-cli/wp-cli-tests": "^3.0.11" }, "suggest": { - "ext-readline": "Include for a better --prompt implementation", - "ext-zip": "Needed to support extraction of ZIP archives when doing downloads or updates" + "ext-mbstring": "Used for calculating include/exclude matches in code extraction" }, - "bin": [ - "bin/wp", - "bin/wp.bat" - ], - "type": "library", + "type": "wp-cli-package", "extra": { "branch-alias": { - "dev-master": "2.5.x-dev" - } + "dev-master": "2.x-dev" + }, + "bundled": true, + "commands": [ + "i18n", + "i18n make-pot", + "i18n make-json" + ] }, "autoload": { - "psr-0": { - "WP_CLI\\": "php/" + "psr-4": { + "WP_CLI\\I18n\\": "src/" }, - "classmap": [ - "php/class-wp-cli.php", - "php/class-wp-cli-command.php" + "files": [ + "i18n-command.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "WP-CLI framework", - "homepage": "https://wp-cli.org", - "keywords": [ - "cli", - "wordpress" + "authors": [ + { + "name": "Pascal Birchler", + "homepage": "https://pascalbirchler.com/" + } ], + "description": "Provides internationalization tools for WordPress projects.", + "homepage": "https://github.com/wp-cli/i18n-command", "support": { - "docs": "https://make.wordpress.org/cli/handbook/", - "issues": "https://github.com/wp-cli/wp-cli/issues", - "source": "https://github.com/wp-cli/wp-cli" + "issues": "https://github.com/wp-cli/i18n-command/issues", + "source": "https://github.com/wp-cli/i18n-command/tree/v2.2.9" }, - "time": "2021-05-14T13:44:51+00:00" + "time": "2021-07-20T21:25:54+00:00" }, { "name": "wp-coding-standards/wpcs", diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4201edd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,33031 @@ +{ + "name": "@aivec/wp-phpdoc-parser", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@aivec/wp-phpdoc-parser", + "license": "GPL-2.0", + "dependencies": { + "@aivec/react-material-components": "^3.0.3", + "@aivec/reqres-utils": "^6.0.1", + "@material-ui/core": "^4.12.3", + "@material-ui/icons": "^4.11.2", + "@wordpress/i18n": "^4.2.2", + "axios": "^0.21.4" + }, + "devDependencies": { + "@aivec/wp-typescript-react": "^2.0.1", + "@types/react": "^17.0.22", + "@types/react-dom": "^17.0.9", + "@typescript-eslint/eslint-plugin": "^4.31.2", + "@typescript-eslint/parser": "^4.31.2", + "@wordpress/scripts": "^18.0.1", + "eslint": "^7.32.0", + "eslint-config-airbnb-typescript": "^14.0.0", + "eslint-config-prettier": "^8.3.0", + "eslint-import-resolver-typescript": "^2.5.0", + "eslint-plugin-import": "^2.24.2", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.25.3", + "eslint-plugin-react-hooks": "^4.2.0", + "typescript": "^4.4.3" + } + }, + "node_modules/@aivec/react-material-components": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@aivec/react-material-components/-/react-material-components-3.0.3.tgz", + "integrity": "sha512-JVfp9Ko+FKNB0QZHnNsGMnwZyw8DHjO6CXwU0bseywHdag/wjhyjoGC9/59DbtUzEF+1KQDObXXPJjtNkdAeEA==", + "peerDependencies": { + "@material-ui/core": ">= 4.4.2", + "@material-ui/icons": ">= 4.4.1", + "clsx": ">= 1.1.1", + "react": ">= 16.9.0", + "react-dom": ">= 16.8.0", + "styled-components": ">= 5" + } + }, + "node_modules/@aivec/reqres-utils": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@aivec/reqres-utils/-/reqres-utils-6.0.1.tgz", + "integrity": "sha512-czKoZxpB6x4ARX2+Q/CGdStXBk6mckgd+S9sIg+/xjW6rQ0h/C40QYBxxTJTTA5jOEyUxePtHknl+2QhLgmI9A==", + "dependencies": { + "lodash": "^4.17.20", + "qs": "^6.9.4" + } + }, + "node_modules/@aivec/reqres-utils/node_modules/qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@aivec/wp-typescript-react": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@aivec/wp-typescript-react/-/wp-typescript-react-2.0.1.tgz", + "integrity": "sha512-mdoUXjIm7ByzDKpe2cOKsnb66QJH8jTkYZd8c58SRTwI71K56aY0G1NL7So9an8rfXHxKF1Oa7Dd8BnUY5w3Wg==", + "dev": true, + "dependencies": { + "cross-env": "^7.0.3", + "cross-spawn": "^7.0.3", + "glob": "^7.1.7", + "yargs": "^17.0.1" + }, + "bin": { + "aivec-wpreact": "dist/index.js" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "dependencies": { + "@babel/types": "^7.15.4", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dependencies": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", + "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", + "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz", + "integrity": "sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", + "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz", + "integrity": "sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz", + "integrity": "sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.6.tgz", + "integrity": "sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.4", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", + "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "dev": true, + "dependencies": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", + "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "peer": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "peer": true + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", + "peer": true + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "peer": true + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.6.0.tgz", + "integrity": "sha512-zT1EtysKMITJ7vE4RvOJqitxk/Str6It8hq+fykxkwLuTyzgak+TnVuVSIyovT/qrEz3i46ypCSXgNtIDYwNOg==", + "dev": true, + "dependencies": { + "comment-parser": "^1.1.5", + "esquery": "^1.4.0", + "jsdoctypeparser": "^9.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'", + "dev": true + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", + "dev": true, + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@material-ui/core": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.3.tgz", + "integrity": "sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/icons": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", + "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "dependencies": { + "@babel/runtime": "^7.4.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@material-ui/core": "^4.0.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/styles": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/styles/node_modules/csstype": { + "version": "2.6.18", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", + "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" + }, + "node_modules/@material-ui/system": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/system/node_modules/csstype": { + "version": "2.6.18", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", + "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" + }, + "node_modules/@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.20", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.20.tgz", + "integrity": "sha512-88p7+M0QGxKpmnkfXjS4V26AnoC/eiqZutE8GLdaI5X12NY75bXSdTY9NkmYb2Xyk1O+MmkuO6Frmsj84V6I8Q==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@stylelint/postcss-css-in-js": { + "version": "0.37.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz", + "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==", + "dev": true, + "dependencies": { + "@babel/core": ">=7.9.0" + }, + "peerDependencies": { + "postcss": ">=7.0.0", + "postcss-syntax": ">=0.36.2" + } + }, + "node_modules/@stylelint/postcss-markdown": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", + "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", + "dev": true, + "dependencies": { + "remark": "^13.0.0", + "unist-util-find-all-after": "^3.0.2" + }, + "peerDependencies": { + "postcss": ">=7.0.0", + "postcss-syntax": ">=0.36.2" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dev": true, + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@tannin/compile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", + "integrity": "sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==", + "dependencies": { + "@tannin/evaluate": "^1.2.0", + "@tannin/postfix": "^1.1.0" + } + }, + "node_modules/@tannin/evaluate": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz", + "integrity": "sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg==" + }, + "node_modules/@tannin/plural-forms": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.1.0.tgz", + "integrity": "sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==", + "dependencies": { + "@tannin/compile": "^1.1.0" + } + }, + "node_modules/@tannin/postfix": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz", + "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw==" + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/cheerio": { + "version": "0.22.30", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.30.tgz", + "integrity": "sha512-t7ZVArWZlq3dFa9Yt33qFBQIK4CQd1Q3UJp0V+UhP6vgLWLM6Qug7vZuRSGXg45zXeB1Fm5X2vmBkEX58LV2Tw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.4.tgz", + "integrity": "sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" + }, + "node_modules/@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "dev": true + }, + "node_modules/@types/react": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.22.tgz", + "integrity": "sha512-kq/BMeaAVLJM6Pynh8C2rnr/drCK+/5ksH0ch9asz+8FW3DscYCIEFtCeYTFeIx/ubvOsMXmRfy7qEJ76gM96A==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz", + "integrity": "sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.3.tgz", + "integrity": "sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", + "dev": true + }, + "node_modules/@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "dev": true + }, + "node_modules/@types/webpack": { + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", + "integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.31.2", + "@typescript-eslint/scope-manager": "4.31.2", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", + "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.31.2", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/typescript-estree": "4.31.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", + "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.31.2", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/typescript-estree": "4.31.2", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", + "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", + "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", + "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", + "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.31.2", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz", + "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz", + "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.2.tgz", + "integrity": "sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@wojtekmaj/enzyme-adapter-react-17": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.3.tgz", + "integrity": "sha512-Kp1ZJxtHkKEnUksaWrcMABNTOgL4wOt8VI6k2xOek2aH9PtZcWRXJNUEgnKrdJrqg5UqIjRslbVF9uUqwQJtFg==", + "dev": true, + "dependencies": { + "@wojtekmaj/enzyme-adapter-utils": "^0.1.1", + "enzyme-shallow-equal": "^1.0.0", + "has": "^1.0.0", + "object.assign": "^4.1.0", + "object.values": "^1.1.0", + "prop-types": "^15.7.0", + "react-is": "^17.0.2", + "react-test-renderer": "^17.0.0" + }, + "peerDependencies": { + "enzyme": "^3.0.0", + "react": "^17.0.0-0", + "react-dom": "^17.0.0-0" + } + }, + "node_modules/@wojtekmaj/enzyme-adapter-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-utils/-/enzyme-adapter-utils-0.1.1.tgz", + "integrity": "sha512-bNPWtN/d8huKOkC6j1E3EkSamnRrHHT7YuR6f9JppAQqtoAm3v4/vERe4J14jQKmHLCyEBHXrlgb7H6l817hVg==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.0", + "has": "^1.0.0", + "object.assign": "^4.1.0", + "object.fromentries": "^2.0.0", + "prop-types": "^15.7.0" + }, + "peerDependencies": { + "react": "^17.0.0-0" + } + }, + "node_modules/@wordpress/babel-plugin-import-jsx-pragma": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-3.1.0.tgz", + "integrity": "sha512-518mL3goaSeXtJCQcPK9OYHUUiA0sjXuoGWHBwRalkyTIQZZy5ZZzlwrlSc9ESZcOw9BZ+Uo8CJRjV2OWnx+Zw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@babel/core": "^7.12.9" + } + }, + "node_modules/@wordpress/babel-preset-default": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-6.3.2.tgz", + "integrity": "sha512-RKKO5rhUlEtYYd2kHRkuSY97irq+MTxPYy/IJzM5D8Z17irasNRWs1GwOlbelewHUXA9BIHkX465R5ec7D7OHw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.13.10", + "@babel/plugin-transform-react-jsx": "^7.12.7", + "@babel/plugin-transform-runtime": "^7.13.10", + "@babel/preset-env": "^7.13.10", + "@babel/preset-typescript": "^7.13.0", + "@babel/runtime": "^7.13.10", + "@wordpress/babel-plugin-import-jsx-pragma": "^3.1.0", + "@wordpress/browserslist-config": "^4.1.0", + "@wordpress/element": "^4.0.1", + "@wordpress/warning": "^2.2.1", + "browserslist": "^4.16.6", + "core-js": "^3.12.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wordpress/base-styles": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-4.0.0.tgz", + "integrity": "sha512-kvgBUFKzQwgv7j0QX5G4/Rmb11oAAmi5+yG+4fYEOprQMXMf/o5SeYvIN+h7zaHN4naYxjdGQTNrkyYoOd0LSg==", + "dev": true + }, + "node_modules/@wordpress/browserslist-config": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-4.1.0.tgz", + "integrity": "sha512-RSJhgY2xmz6yAdDNhz/NvAO6JS+91vv9cVL7VDG2CftbyjTXBef05vWt3FzZhfeF0xUrYdpZL1PVpxmJiKvbEg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wordpress/dependency-extraction-webpack-plugin": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-3.2.1.tgz", + "integrity": "sha512-Ltd+1CJb7PMh6iN2Mse+3yN/oMORug5qXSj/3xmuZERzZO2SO6xNEJGml8yK9ev747cbHktEpitK4H+8VO3Ekg==", + "dev": true, + "dependencies": { + "json2php": "^0.0.4", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "^4.8.3 || ^5.0.0" + } + }, + "node_modules/@wordpress/element": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-4.0.1.tgz", + "integrity": "sha512-Woi8Vh6anJgCt0AHvhUexiL+3TrhUk1EiLCN9vRahd9k5gvNQ6FzrQr60TagONmQXbe0CHACmWksZaVvQmsA/g==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@types/react": "^16.9.0", + "@types/react-dom": "^16.9.0", + "@wordpress/escape-html": "^2.2.1", + "lodash": "^4.17.21", + "react": "^17.0.1", + "react-dom": "^17.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wordpress/element/node_modules/@types/react": { + "version": "16.14.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.15.tgz", + "integrity": "sha512-jOxlBV9RGZhphdeqJTCv35VZOkjY+XIEY2owwSk84BNDdDv2xS6Csj6fhi+B/q30SR9Tz8lDNt/F2Z5RF3TrRg==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@wordpress/element/node_modules/@types/react-dom": { + "version": "16.9.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.14.tgz", + "integrity": "sha512-FIX2AVmPTGP30OUJ+0vadeIFJJ07Mh1m+U0rxfgyW34p3rTlXI+nlenvAxNn4BP36YyI9IJ/+UJ7Wu22N1pI7A==", + "dev": true, + "dependencies": { + "@types/react": "^16" + } + }, + "node_modules/@wordpress/escape-html": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.2.1.tgz", + "integrity": "sha512-+5hMa+1BLYgHdOxPK7TF+hfAaKJY1UE6osZL8s4boYeaq/O23PFv4aCPQF+z9/4cIKyvOJPGk26Z1Op6DwJLGA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wordpress/eslint-plugin": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-9.1.2.tgz", + "integrity": "sha512-BRlsdhtR0JHpSvFWGwgzoMcTDtUvJ5r0f/VPhDhTz/EzTXuwbixF2P6d3L7qKvA/R6PqC1uMJRsGB1Xk9qyhNw==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^4.15.0", + "@typescript-eslint/parser": "^4.15.0", + "@wordpress/prettier-config": "^1.1.1", + "babel-eslint": "^10.1.0", + "cosmiconfig": "^7.0.0", + "eslint-config-prettier": "^7.1.0", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-jest": "^24.1.3", + "eslint-plugin-jsdoc": "^34.1.0", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-prettier": "^3.3.0", + "eslint-plugin-react": "^7.22.0", + "eslint-plugin-react-hooks": "^4.2.0", + "globals": "^12.0.0", + "prettier": "npm:wp-prettier@2.2.1-beta-1", + "requireindex": "^1.2.0" + }, + "engines": { + "node": ">=12", + "npm": ">=6.9" + }, + "peerDependencies": { + "eslint": "^6 || ^7", + "typescript": "^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/eslint-config-prettier": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", + "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/prettier": { + "name": "wp-prettier", + "version": "2.2.1-beta-1", + "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.2.1-beta-1.tgz", + "integrity": "sha512-+JHkqs9LC/JPp51yy1hzs3lQ7qeuWCwOcSzpQNeeY/G7oSpnF61vxt7hRh87zNRTr6ob2ndy0W8rVzhgrcA+Gw==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wordpress/hooks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.2.0.tgz", + "integrity": "sha512-nVR6V9kPxl8+aYQzQJdoDt+aKBKHHD0zplcYZbu2MHxjmHMvppAeL9mjzVhQZj/3n10NR2Ftk94mHQzHWfhCCg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wordpress/i18n": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.2.2.tgz", + "integrity": "sha512-6PrfTDpeW5dfWyuqUx4Z5ApKFbh45CAbCs/G3PuZLlKJlXs/8p2Oq6Zxs0gLZk1QfHkw0t5qMx61lDlxWQhuPw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@wordpress/hooks": "^3.2.0", + "gettext-parser": "^1.3.1", + "lodash": "^4.17.21", + "memize": "^1.1.0", + "sprintf-js": "^1.1.1", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wordpress/i18n/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/@wordpress/jest-console": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-4.1.0.tgz", + "integrity": "sha512-MAbEfYUH+odlYYtPNKoKnWzSZKZjSc2r2kvFJ7FR920ZdteEgSAPIOvjyv4r4UbJy3ZuKemnXHuVtcTAKca5Tw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "jest-matcher-utils": "^26.6.2", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "jest": ">=26" + } + }, + "node_modules/@wordpress/jest-preset-default": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-7.1.1.tgz", + "integrity": "sha512-925Ern0GAABF2/2B25svi8GFHJqPWLJlwndJcCfwbx8CRNXeXu3YfYAtZrDE6vDRBxKJQEk8j9upptiZrV8rJw==", + "dev": true, + "dependencies": { + "@wojtekmaj/enzyme-adapter-react-17": "^0.6.1", + "@wordpress/jest-console": "^4.1.0", + "babel-jest": "^26.6.3", + "enzyme": "^3.11.0", + "enzyme-to-json": "^3.4.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "jest": ">=26" + } + }, + "node_modules/@wordpress/npm-package-json-lint-config": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-4.1.0.tgz", + "integrity": "sha512-FjXL5GbpmI/wXXcpCf2sKosVIVuWjUuHmDbwcMzd0SClcudo9QjDRdVe35We+js8eQLPgB9hsG4Cty6cAFFxsQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "npm-package-json-lint": ">=3.6.0" + } + }, + "node_modules/@wordpress/postcss-plugins-preset": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-3.2.1.tgz", + "integrity": "sha512-pgwLb3agk/Xked5ljfpYiWlPOIV2ABa8x1yFRxasxvYAareaZemRl8gzDMeTFgYQoiEPF+9MYWXaZ1qQEDlAQA==", + "dev": true, + "dependencies": { + "@wordpress/base-styles": "^4.0.0", + "autoprefixer": "^10.2.5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wordpress/prettier-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-1.1.1.tgz", + "integrity": "sha512-qjpBK5KB2ieCLv+1fGNKRW4urf5tFN1eUn3Qy+JINxNwAx6Jj9uhfXA4AldCSnD+WkzsN2UgBvgAj5/SWwzRZQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wordpress/scripts": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-18.0.1.tgz", + "integrity": "sha512-IMxYFbQNIoVxdkIBHDfm/T3T2VKyJTHZ9TSZEr8oN8aepPpxwDbf76JlMtQYWcnyrbuTkaERhdlcmu/6m1lWxg==", + "dev": true, + "dependencies": { + "@svgr/webpack": "^5.5.0", + "@wordpress/babel-preset-default": "^6.3.2", + "@wordpress/browserslist-config": "^4.1.0", + "@wordpress/dependency-extraction-webpack-plugin": "^3.2.1", + "@wordpress/eslint-plugin": "^9.1.2", + "@wordpress/jest-preset-default": "^7.1.1", + "@wordpress/npm-package-json-lint-config": "^4.1.0", + "@wordpress/postcss-plugins-preset": "^3.2.1", + "@wordpress/prettier-config": "^1.1.1", + "@wordpress/stylelint-config": "^19.1.0", + "babel-jest": "^26.6.3", + "babel-loader": "^8.2.2", + "browserslist": "^4.16.6", + "chalk": "^4.0.0", + "check-node-version": "^4.1.0", + "clean-webpack-plugin": "^3.0.0", + "cross-spawn": "^5.1.0", + "css-loader": "^6.2.0", + "cssnano": "^5.0.7", + "cwd": "^0.10.0", + "dir-glob": "^3.0.1", + "eslint": "^7.17.0", + "eslint-plugin-markdown": "^2.2.0", + "expect-puppeteer": "^4.4.0", + "filenamify": "^4.2.0", + "jest": "^26.6.3", + "jest-circus": "^26.6.3", + "jest-dev-server": "^4.4.0", + "jest-environment-node": "^26.6.2", + "markdownlint": "^0.23.1", + "markdownlint-cli": "^0.27.1", + "merge-deep": "^3.0.3", + "mini-css-extract-plugin": "^2.1.0", + "minimist": "^1.2.0", + "npm-package-json-lint": "^5.0.0", + "postcss": "^8.2.15", + "postcss-loader": "^6.1.1", + "prettier": "npm:wp-prettier@2.2.1-beta-1", + "puppeteer-core": "^10.1.0", + "read-pkg-up": "^1.0.1", + "resolve-bin": "^0.4.0", + "sass": "^1.35.2", + "sass-loader": "^12.1.0", + "source-map-loader": "^3.0.0", + "stylelint": "^13.8.0", + "terser-webpack-plugin": "^5.1.4", + "url-loader": "^4.1.1", + "webpack": "^5.47.1", + "webpack-bundle-analyzer": "^4.4.2", + "webpack-cli": "^4.7.2", + "webpack-livereload-plugin": "^3.0.1" + }, + "bin": { + "wp-scripts": "bin/wp-scripts.js" + }, + "engines": { + "node": ">=12.13", + "npm": ">=6.9" + } + }, + "node_modules/@wordpress/scripts/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/@wordpress/scripts/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@wordpress/scripts/node_modules/prettier": { + "name": "wp-prettier", + "version": "2.2.1-beta-1", + "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.2.1-beta-1.tgz", + "integrity": "sha512-+JHkqs9LC/JPp51yy1hzs3lQ7qeuWCwOcSzpQNeeY/G7oSpnF61vxt7hRh87zNRTr6ob2ndy0W8rVzhgrcA+Gw==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@wordpress/scripts/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@wordpress/scripts/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@wordpress/scripts/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/@wordpress/scripts/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/@wordpress/stylelint-config": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-19.1.0.tgz", + "integrity": "sha512-K/wB9rhB+pH5WvDh3fV3DN5C3Bud+jPGXmnPY8fOXKMYI3twCFozK/j6sVuaJHqGp/0kKEF0hkkGh+HhD30KGQ==", + "dev": true, + "dependencies": { + "stylelint-config-recommended": "^3.0.0", + "stylelint-config-recommended-scss": "^4.2.0", + "stylelint-scss": "^3.17.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "stylelint": "^13.7.0" + } + }, + "node_modules/@wordpress/warning": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.2.1.tgz", + "integrity": "sha512-IlwDEcCYCMQjrHjVxPTjqx/y+aeyg0DYpNGArt30WFY/aVfZHNu25UASYjwngEahIAUfA7b3oTQbJv2o3IghGQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.0.tgz", + "integrity": "sha512-TfO1gz+tLm+Bswq0FBOXPqAchtCr2Rn48T8dLJoRFl8NoEosjZmzptmuo1X8aZBzZcqsR1W8U761tjACJtngTQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/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, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.4.tgz", + "integrity": "sha512-EKjKDXOq7ug+jagLzmnoTRpTT0q1KVzEJqrJd0hCBa7FiG0WbFOBCcJCy2QkW1OckpO3qgttA1aWjVbeIPAecw==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.8", + "caniuse-lite": "^1.0.30001252", + "colorette": "^1.3.0", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/axe-core": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.3.tgz", + "integrity": "sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "dependencies": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz", + "integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-styled-components": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.2.tgz", + "integrity": "sha512-Vb1R3d4g+MUfPQPVDMCGjm3cDocJEUTR7Xq7QS95JWWeksN1wdFRYpD2kulDgI3Huuaf1CZd+NK4KQmqUFh5dA==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-module-imports": "^7.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "peer": true + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", + "dev": true, + "dependencies": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", + "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001254", + "colorette": "^1.3.0", + "electron-to-chromium": "^1.3.830", + "escalade": "^3.1.1", + "node-releases": "^1.1.75" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=", + "peer": true + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001258", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz", + "integrity": "sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/check-node-version": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/check-node-version/-/check-node-version-4.1.0.tgz", + "integrity": "sha512-TSXGsyfW5/xY2QseuJn8/hleO2AU7HxVCdkc900jp1vcfzF840GkjvRT7CHl8sRtWn23n3X3k0cwH9RXeRwhfw==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "map-values": "^1.0.1", + "minimist": "^1.2.0", + "object-filter": "^1.0.2", + "run-parallel": "^1.1.4", + "semver": "^6.3.0" + }, + "bin": { + "check-node-version": "bin.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/check-node-version/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-node-version/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dev": true, + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "dev": true, + "dependencies": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + }, + "engines": { + "node": ">=8.9.0" + }, + "peerDependencies": { + "webpack": "*" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "dev": true, + "dependencies": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-regexp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", + "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", + "dev": true, + "dependencies": { + "is-regexp": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colord": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.7.0.tgz", + "integrity": "sha512-pZJBqsHz+pYyw3zpX6ZRXWoCHM1/cvFikY9TV8G3zcejCaKE0lhankoj8iScyrrePA8C7yJ5FStfA9zbcOnw7Q==", + "dev": true + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/comment-parser": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.5.tgz", + "integrity": "sha512-RePCE4leIhBlmrqiYTvaqEeGYg7qpSl4etaIabKtdOQVi+mSTIBBklGUwIr79GXYnl3LpMwmDw4KeR2stNc6FA==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.0.tgz", + "integrity": "sha512-WJeQqq6jOYgVgg4NrXKL0KLQhi0CT4ZOCvFL+3CQ5o7I6J8HkT5wd53EadMfqTDp1so/MT1J+w2ujhWcCJtN7w==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.0.tgz", + "integrity": "sha512-tRVjOJu4PxdXjRMEgbP7lqWy1TWJu9a01oBkn8d+dNrhgmBwdTkzhHZpVJnEmhISLdoJI1lX08rcBcHi3TZIWg==", + "dev": true, + "dependencies": { + "browserslist": "^4.17.0", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.0.tgz", + "integrity": "sha512-ZnK+9vyuMhKulIGqT/7RHGRok8RtkHMEX/BGPHkHx+ouDkq+MUvf9mfIgdqhpmPDu8+V5UtRn/CbCRc9I4lX4w==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-color-names": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz", + "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz", + "integrity": "sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==", + "dev": true, + "dependencies": { + "timsort": "^0.3.0" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.3.0.tgz", + "integrity": "sha512-9NGvHOR+L6ps13Ilw/b216++Q8q+5RpJcVufCdW9S/9iCzs4KBDNa8qnA/n3FK/sSfWmH35PAIK/cfPi7LOSUg==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "node_modules/css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "peer": true, + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "dependencies": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, + "node_modules/css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.8.tgz", + "integrity": "sha512-Lda7geZU0Yu+RZi2SGpjYuQz4HI4/1Y+BhdD0jL7NXAQ5larCzVn+PUGuZbDMYz904AXXCOgO5L1teSvgu7aFg==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^5.1.4", + "is-resolvable": "^1.1.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.4.tgz", + "integrity": "sha512-sPpQNDQBI3R/QsYxQvfB4mXeEcWuw0wGtKtmS5eg8wudyStYMgKOQT39G07EbW1LB56AOYrinRS9f0ig4Y3MhQ==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^6.0.3", + "cssnano-utils": "^2.0.1", + "postcss-calc": "^8.0.0", + "postcss-colormin": "^5.2.0", + "postcss-convert-values": "^5.0.1", + "postcss-discard-comments": "^5.0.1", + "postcss-discard-duplicates": "^5.0.1", + "postcss-discard-empty": "^5.0.1", + "postcss-discard-overridden": "^5.0.1", + "postcss-merge-longhand": "^5.0.2", + "postcss-merge-rules": "^5.0.2", + "postcss-minify-font-values": "^5.0.1", + "postcss-minify-gradients": "^5.0.2", + "postcss-minify-params": "^5.0.1", + "postcss-minify-selectors": "^5.1.0", + "postcss-normalize-charset": "^5.0.1", + "postcss-normalize-display-values": "^5.0.1", + "postcss-normalize-positions": "^5.0.1", + "postcss-normalize-repeat-style": "^5.0.1", + "postcss-normalize-string": "^5.0.1", + "postcss-normalize-timing-functions": "^5.0.1", + "postcss-normalize-unicode": "^5.0.1", + "postcss-normalize-url": "^5.0.2", + "postcss-normalize-whitespace": "^5.0.1", + "postcss-ordered-values": "^5.0.2", + "postcss-reduce-initial": "^5.0.1", + "postcss-reduce-transforms": "^5.0.1", + "postcss-svgo": "^5.0.2", + "postcss-unique-selectors": "^5.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", + "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", + "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + }, + "node_modules/cwd": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", + "integrity": "sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc=", + "dev": true, + "dependencies": { + "find-pkg": "^0.1.2", + "fs-exists-sync": "^0.1.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.901419", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", + "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", + "dev": true + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.844", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.844.tgz", + "integrity": "sha512-7ES6GQVsbgsUA49/apqub51I9ij8E3QwGqq/IRvO6OPCly3how/YUSg1GPslRWq+BteT2h94iAIQdJbuVVH4Pg==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/enzyme": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", + "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", + "dev": true, + "dependencies": { + "array.prototype.flat": "^1.2.3", + "cheerio": "^1.0.0-rc.3", + "enzyme-shallow-equal": "^1.0.1", + "function.prototype.name": "^1.1.2", + "has": "^1.0.3", + "html-element-map": "^1.2.0", + "is-boolean-object": "^1.0.1", + "is-callable": "^1.1.5", + "is-number-object": "^1.0.4", + "is-regex": "^1.0.5", + "is-string": "^1.0.5", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.7.0", + "object-is": "^1.0.2", + "object.assign": "^4.1.0", + "object.entries": "^1.1.1", + "object.values": "^1.1.1", + "raf": "^3.4.1", + "rst-selector-parser": "^2.2.3", + "string.prototype.trim": "^1.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/enzyme-shallow-equal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz", + "integrity": "sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==", + "dev": true, + "dependencies": { + "has": "^1.0.3", + "object-is": "^1.1.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/enzyme-to-json": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.6.2.tgz", + "integrity": "sha512-Ynm6Z6R6iwQ0g2g1YToz6DWhxVnt8Dy1ijR2zynRKxTyBGA8rCDXU3rs2Qc4OKvUvc2Qoe1bcFK6bnPs20TrTg==", + "dev": true, + "dependencies": { + "@types/cheerio": "^0.22.22", + "lodash": "^4.17.21", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "enzyme": "^3.4.0" + } + }, + "node_modules/enzyme-to-json/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "dependencies": { + "string-template": "~0.2.1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.6.tgz", + "integrity": "sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-string": "^1.0.7", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-module-lexer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", + "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", + "dev": true + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-14.0.0.tgz", + "integrity": "sha512-d2Nit2ByZARGRYK6tgSNl3nnmGZPyvsgbsKFcmm+nAhvT8VjVpifG5jI4tzObUUPb0sWw0E1oO/0pSpBD/pIuQ==", + "dev": true, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.29.3", + "@typescript-eslint/parser": "^4.29.3" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.5.0.tgz", + "integrity": "sha512-qZ6e5CFr+I7K4VVhQu3M/9xGv9/YmwsEXrsm3nimw8vWaVHRDrQRp26BgCypTxBp3vUp4o5aVEJRiy0F2DFddQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.1", + "glob": "^7.1.7", + "is-glob": "^4.0.1", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-import/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "24.4.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.2.tgz", + "integrity": "sha512-jNMnqwX75z0RXRMXkxwb/+9ylKJYJLJ8nT8nBT0XFM5qx4IQGxP4edMawa0qGkSbHae0BDPBmi8I2QF0/F04XQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "^4.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": ">= 4", + "eslint": ">=5" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "34.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-34.8.2.tgz", + "integrity": "sha512-UOU9A40Cl806JMtla2vF+RM6sNqfLPbhLv9FZqhcC7+LmChD3DVaWqM7ADxpF0kMyZNWe1QKUnqGnXaA3NTn+w==", + "dev": true, + "dependencies": { + "@es-joy/jsdoccomment": "^0.6.0", + "comment-parser": "1.1.5", + "debug": "^4.3.1", + "esquery": "^1.4.0", + "jsdoctypeparser": "^9.0.0", + "lodash": "^4.17.21", + "regextras": "^0.7.1", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/eslint-plugin-markdown": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.1.tgz", + "integrity": "sha512-FgWp4iyYvTFxPwfbxofTvXxgzPsDuSKHQy2S+a8Ve6savbujey+lgrFFbXQA0HPygISpRYWYBjooPzhYSF81iA==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^0.8.5" + }, + "engines": { + "node": "^8.10.0 || ^10.12.0 || >= 12.0.0" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.3.tgz", + "integrity": "sha512-ZMbFvZ1WAYSZKY662MBVEWR45VaBT6KSJCiupjrNlcdakB90juaZeDCbJq19e73JZQubqFtgETohwgAt8u5P6w==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "estraverse": "^5.2.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.hasown": "^1.0.0", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", + "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", + "dev": true, + "dependencies": { + "clone-regexp": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect-puppeteer": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-4.4.0.tgz", + "integrity": "sha512-6Ey4Xy2xvmuQu7z7YQtMsaMV0EHJRpVxIDOd5GRrm04/I3nkTKIutELfECsLp6le+b3SSa3cXhPiw6PgqzxYWA==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-file-up": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", + "integrity": "sha1-z2gJG8+fMApA2kEbN9pczlovvqA=", + "dev": true, + "dependencies": { + "fs-exists-sync": "^0.1.0", + "resolve-dir": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-parent-dir": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.1.tgz", + "integrity": "sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A==", + "dev": true + }, + "node_modules/find-pkg": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", + "integrity": "sha1-G9wiwG42NlUy4qJIBGhUuXiNpVc=", + "dev": true, + "dependencies": { + "find-file-up": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-process": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.4.tgz", + "integrity": "sha512-rRSuT1LE4b+BFK588D2V8/VG9liW0Ark1XJgroxZXI0LtwmQJOb490DvDYvbm+Hek9ETFzTutGfJ90gumITPhQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "commander": "^5.1.0", + "debug": "^4.1.1" + }, + "bin": { + "find-process": "bin/find-process.js" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/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, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.4.tgz", + "integrity": "sha512-iqy1pIotY/RmhdFZygSSlW0wko2yxkSCKqsuv4pr8QESohpYyG/Z7B/XXvPRKTJS//960rgguE5mSRUsDdaJrQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz", + "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gettext-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz", + "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==", + "dependencies": { + "encoding": "^0.1.12", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "dependencies": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "dev": true + }, + "node_modules/gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "gonzales": "bin/gonzales.js" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-element-map": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", + "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", + "dev": true, + "dependencies": { + "array.prototype.filter": "^1.0.0", + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/irregular-plurals": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", + "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-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 + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "optional": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", + "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.3.tgz", + "integrity": "sha512-ACrpWZGcQMpbv13XbzRzpytEJlilP/Su0JtNCi5r/xLpOUhnaIJr8leYYpLEMgPFURZISEHrnnpmB54Q/UziPw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-dev-server": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-4.4.0.tgz", + "integrity": "sha512-STEHJ3iPSC8HbrQ3TME0ozGX2KT28lbT4XopPxUm2WimsX3fcB3YOptRh12YphQisMhfqNSNTZUmWyT3HEXS2A==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "cwd": "^0.10.0", + "find-process": "^1.4.3", + "prompts": "^2.3.0", + "spawnd": "^4.4.0", + "tree-kill": "^1.2.2", + "wait-on": "^3.3.0" + } + }, + "node_modules/jest-dev-server/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-runtime/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest-runtime/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsdoctypeparser": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", + "dev": true, + "bin": { + "jsdoctypeparser": "bin/jsdoctypeparser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json2php": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.4.tgz", + "integrity": "sha1-a9haHdpqXdfpECK7JEA8wbfC7jQ=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/jss": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.8.0.tgz", + "integrity": "sha512-6fAMLJrVQ8epM5ghghxWqCwRR0ZamP2cKbOAtzPudcCMSNdAqtvmzQvljUZYR8OXJIeb/IpZeOXA1sDXms4R1w==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/jss" + } + }, + "node_modules/jss-plugin-camel-case": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.0.tgz", + "integrity": "sha512-yxlXrXwcCdGw+H4BC187dEu/RFyW8joMcWfj8Rk9UPgWTKu2Xh7Sib4iW3xXjHe/t5phOHF1rBsHleHykWix7g==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.8.0" + } + }, + "node_modules/jss-plugin-default-unit": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.0.tgz", + "integrity": "sha512-9XJV546cY9zV9OvIE/v/dOaxSi4062VfYQQfwbplRExcsU2a79Yn+qDz/4ciw6P4LV1Naq90U+OffAGRHfNq/Q==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.0" + } + }, + "node_modules/jss-plugin-global": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.8.0.tgz", + "integrity": "sha512-H/8h/bHd4e7P0MpZ9zaUG8NQSB2ie9rWo/vcCP6bHVerbKLGzj+dsY22IY3+/FNRS8zDmUyqdZx3rD8k4nmH4w==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.0" + } + }, + "node_modules/jss-plugin-nested": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.8.0.tgz", + "integrity": "sha512-MhmINZkSxyFILcFBuDoZmP1+wj9fik/b9SsjoaggkGjdvMQCES21mj4K5ZnRGVm448gIXyi9j/eZjtDzhaHUYQ==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-props-sort": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.0.tgz", + "integrity": "sha512-VY+Wt5WX5GMsXDmd+Ts8+O16fpiCM81svbox++U3LDbJSM/g9FoMx3HPhwUiDfmgHL9jWdqEuvSl/JAk+mh6mQ==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.0" + } + }, + "node_modules/jss-plugin-rule-value-function": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.0.tgz", + "integrity": "sha512-R8N8Ma6Oye1F9HroiUuHhVjpPsVq97uAh+rMI6XwKLqirIu2KFb5x33hPj+vNBMxSHc9jakhf5wG0BbQ7fSDOg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-vendor-prefixer": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.0.tgz", + "integrity": "sha512-G1zD0J8dFwKZQ+GaZaay7A/Tg7lhDw0iEkJ/iFFA5UPuvZFpMprCMQttXcTBhLlhhWnyZ8YPn4yqp+amrhQekw==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.8.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/known-css-properties": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", + "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", + "dev": true + }, + "node_modules/language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", + "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/lodash.differencewith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.differencewith/-/lodash.differencewith-4.5.0.tgz", + "integrity": "sha1-uvr7yRi1UVTheRdqALsK76rIVLc=", + "dev": true + }, + "node_modules/lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", + "dev": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-values/-/map-values-1.0.1.tgz", + "integrity": "sha1-douOecAJvytk/ugG4ip7HEGQyZA=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-it": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.0.4.tgz", + "integrity": "sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdownlint": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.23.1.tgz", + "integrity": "sha512-iOEwhDfNmq2IJlaA8mzEkHYUi/Hwoa6Ss+HO5jkwUR6wQ4quFr0WzSx+Z9rsWZKUaPbyirIdL1zGmJRkWawr4Q==", + "dev": true, + "dependencies": { + "markdown-it": "12.0.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/markdownlint-cli": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.27.1.tgz", + "integrity": "sha512-p1VV6aSbGrDlpUWzHizAnSNEQAweVR3qUI/AIUubxW7BGPXziSXkIED+uRtSohUlRS/jmqp3Wi4es5j6fIrdeQ==", + "dev": true, + "dependencies": { + "commander": "~7.1.0", + "deep-extend": "~0.6.0", + "get-stdin": "~8.0.0", + "glob": "~7.1.6", + "ignore": "~5.1.8", + "js-yaml": "^4.0.0", + "jsonc-parser": "~3.0.0", + "lodash.differencewith": "~4.5.0", + "lodash.flatten": "~4.4.0", + "markdownlint": "~0.23.1", + "markdownlint-rule-helpers": "~0.14.0", + "minimatch": "~3.0.4", + "minimist": "~1.2.5", + "rc": "~1.2.8" + }, + "bin": { + "markdownlint": "markdownlint.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/markdownlint-cli/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/markdownlint-cli/node_modules/commander": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", + "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/markdownlint-cli/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/markdownlint-cli/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/markdownlint-rule-helpers": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.14.0.tgz", + "integrity": "sha512-vRTPqSU4JK8vVXmjICHSBhwXUvbfh/VJo+j7hvxqe15tLJyomv3FLgFdFgb8kpj0Fe8SsJa/TZUAXv7/sN+N7A==", + "dev": true + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "node_modules/memize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/memize/-/memize-1.1.0.tgz", + "integrity": "sha512-K4FcPETOMTwe7KL2LK0orMhpOmWD2wRGwWWpbZy0fyArwsyIKR8YJVz8+efBAh3BO4zPqlSICu4vsLTRRqtFAg==" + }, + "node_modules/meow": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", + "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/merge-deep": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz", + "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dev": true, + "dependencies": { + "mime-db": "1.49.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.3.0.tgz", + "integrity": "sha512-uzWaOwC+gJrnKbr23J1ZRWx/Wd9W9Ce1mKPlsBGBV/r8zG7/G7oKMxGmxbI65pVGbae2cR7CUx9Ulk0HQt8BfQ==", + "dev": true, + "dependencies": { + "schema-utils": "^3.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minimist-options/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "dependencies": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-object/node_modules/for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moo": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", + "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "dev": true, + "dependencies": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "bin": { + "nearley-railroad": "bin/nearley-railroad.js", + "nearley-test": "bin/nearley-test.js", + "nearley-unparse": "bin/nearley-unparse.js", + "nearleyc": "bin/nearleyc.js" + }, + "funding": { + "type": "individual", + "url": "https://nearley.js.org/#give-to-nearley" + } + }, + "node_modules/nearley/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "dev": true, + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-releases": { + "version": "1.1.76", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", + "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "dev": true + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-package-json-lint": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-5.2.4.tgz", + "integrity": "sha512-ziN7r4qJg8+hwpUd8gMA0Xj5IHhawBQmNXizB5bYISc/YaidYqmghGI9ZApzr4Csrbi1o4aHNrSwTL5YJT8c8g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.6", + "ajv-errors": "^1.0.1", + "chalk": "^4.1.2", + "cosmiconfig": "^6.0.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "ignore": "^5.1.8", + "is-plain-obj": "^3.0.0", + "jsonc-parser": "^2.3.1", + "log-symbols": "^4.1.0", + "meow": "^6.1.1", + "plur": "^4.0.0", + "semver": "^7.3.5", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "npmPkgJsonLint": "src/cli.js" + }, + "engines": { + "node": ">=10.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/npm-package-json-lint/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-package-json-lint/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-package-json-lint/node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-filter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-filter/-/object-filter-1.0.2.tgz", + "integrity": "sha1-rwt5f/6+r4pSxmN87b6IFs/sG8g=", + "dev": true + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.0.0.tgz", + "integrity": "sha512-qYMF2CLIjxxLGleeM0jrcB4kiv3loGVAjKQKvH8pSU/i2VcRRvUNmxbD+nEMmrXRfORhuVJuH8OtSYCZoue3zA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/plur": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "dev": true, + "dependencies": { + "irregular-plurals": "^3.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", + "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", + "dev": true, + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz", + "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.0.tgz", + "integrity": "sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz", + "integrity": "sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", + "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", + "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", + "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", + "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", + "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.10.0" + }, + "peerDependencies": { + "postcss": ">=5.0.0", + "postcss-syntax": ">=0.36.0" + } + }, + "node_modules/postcss-html/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/postcss-html/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/postcss-html/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/postcss-html/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/postcss-html/node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/postcss-html/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/postcss-html/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/postcss-html/node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", + "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">=6.14.4" + } + }, + "node_modules/postcss-less/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-less/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-less/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-less/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-less/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/postcss-less/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-less/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-less/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-less/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.1.tgz", + "integrity": "sha512-lBmJMvRh1D40dqpWKr9Rpygwxn8M74U9uaCSeYGNKLGInbk9mXBt1ultHf2dH9Ghk6Ue4UXlXWwGMH9QdUJ5ug==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, + "node_modules/postcss-merge-longhand": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz", + "integrity": "sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==", + "dev": true, + "dependencies": { + "css-color-names": "^1.0.1", + "postcss-value-parser": "^4.1.0", + "stylehacks": "^5.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz", + "integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^2.0.1", + "postcss-selector-parser": "^6.0.5", + "vendors": "^1.0.3" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz", + "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.2.tgz", + "integrity": "sha512-7Do9JP+wqSD6Prittitt2zDLrfzP9pqKs2EcLX7HJYxsxCOwrrcLt4x/ctQTsiOw+/8HYotAoqNkrzItL19SdQ==", + "dev": true, + "dependencies": { + "colord": "^2.6", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz", + "integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "browserslist": "^4.16.0", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz", + "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", + "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz", + "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz", + "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz", + "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz", + "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz", + "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz", + "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz", + "integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==", + "dev": true, + "dependencies": { + "is-absolute-url": "^3.0.3", + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz", + "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", + "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", + "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", + "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.26" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-safe-parser/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-safe-parser/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-safe-parser/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-safe-parser/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-safe-parser/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/postcss-safe-parser/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-safe-parser/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-safe-parser/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-safe-parser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-safe-parser/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", + "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", + "dev": true, + "dependencies": { + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" + } + }, + "node_modules/postcss-sass/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sass/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sass/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sass/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-sass/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/postcss-sass/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-sass/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sass/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-sass/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-sass/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", + "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-scss/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-scss/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-scss/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-scss/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-scss/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/postcss-scss/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-scss/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-scss/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-scss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-scss/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.2.tgz", + "integrity": "sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0", + "svgo": "^2.3.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.6.1.tgz", + "integrity": "sha512-SDo274ymyG1jJ3HtCr3hkfwS8NqWdF0fMr6xPlrJ5y2QMofsQxIEFWgR1epwb197teKGgnZbzozxvJyIeJpE2Q==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "colorette": "^1.4.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", + "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", + "dev": true, + "peerDependencies": { + "postcss": ">=5.0.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", + "integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5", + "uniqs": "^2.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-10.2.0.tgz", + "integrity": "sha512-c1COxSnfynsE6Mtt+dW0t3TITjF9Ku4dnJbFMDDVhLQuMTYSpz4rkSP37qvzcSo3k02/Ac3GYWk0/ncp6DKZNA==", + "dev": true, + "dependencies": { + "debug": "4.3.1", + "devtools-protocol": "0.0.901419", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "node-fetch": "2.6.1", + "pkg-dir": "4.2.0", + "progress": "2.0.1", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.0.0", + "unbzip2-stream": "1.3.3", + "ws": "7.4.6" + }, + "engines": { + "node": ">=10.18.1" + } + }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer-core/node_modules/progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", + "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/puppeteer-core/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "node_modules/randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "dependencies": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", + "dev": true, + "dependencies": { + "bytes": "1", + "string_decoder": "0.10" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/raw-body/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-shallow-renderer": { + "version": "16.14.1", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz", + "integrity": "sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0" + } + }, + "node_modules/react-test-renderer": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz", + "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^17.0.2", + "react-shallow-renderer": "^16.13.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regextras": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", + "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", + "dev": true, + "engines": { + "node": ">=0.1.14" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "dev": true, + "dependencies": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "dev": true, + "dependencies": { + "mdast-util-to-markdown": "^0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true, + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-bin": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/resolve-bin/-/resolve-bin-0.4.1.tgz", + "integrity": "sha512-cPOo/AQjgGONYhFbAcJd1+nuVHKs5NZ8K96Zb6mW+nDl55a7+ya9MWkeYuSMDv/S+YpksZ3EbeAnGWs5x04x8w==", + "dev": true, + "dependencies": { + "find-parent-dir": "~0.3.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "dependencies": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "dependencies": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "dev": true, + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/sane/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sane/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/sass": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.0.tgz", + "integrity": "sha512-kcjxsemgaOnfl43oZgO/IePLvXQI0ZKzo0/xbCt6uyrg3FY/FF8hVK9YoO8GiZBcEG2Ebl79EKnUc+aiE4f2Vw==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz", + "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", + "sass": "^1.3.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone/node_modules/kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "dev": true, + "dependencies": { + "is-buffer": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone/node_modules/lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "peer": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.4.tgz", + "integrity": "sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==", + "dev": true + }, + "node_modules/sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", + "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/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, + "dependencies": { + "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" + } + }, + "node_modules/source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/spawnd": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-4.4.0.tgz", + "integrity": "sha512-jLPOfB6QOEgMOQY15Z6+lwZEhH3F5ncXxIaZ7WHPIapwNNLyjrs61okj3VJ3K6tmP5TZ6cO0VAu9rEY4MD4YQg==", + "dev": true, + "dependencies": { + "exit": "^0.1.2", + "signal-exit": "^3.0.2", + "tree-kill": "^1.2.2", + "wait-port": "^0.2.7" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", + "dev": true + }, + "node_modules/specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "dev": true, + "bin": { + "specificity": "bin/specificity" + } + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz", + "integrity": "sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, + "node_modules/styled-components": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.1.tgz", + "integrity": "sha512-JThv2JRzyH0NOIURrk9iskdxMSAAtCfj/b2Sf1WJaCUsloQkblepy1jaCLX/bYE+mhYo3unmwVSI9I5d9ncSiQ==", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^0.8.8", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-components/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylehacks": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", + "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.0", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylelint": { + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz", + "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==", + "dev": true, + "dependencies": { + "@stylelint/postcss-css-in-js": "^0.37.2", + "@stylelint/postcss-markdown": "^0.36.2", + "autoprefixer": "^9.8.6", + "balanced-match": "^2.0.0", + "chalk": "^4.1.1", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "execall": "^2.0.0", + "fast-glob": "^3.2.5", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.0.3", + "globjoin": "^0.1.4", + "html-tags": "^3.1.0", + "ignore": "^5.1.8", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.21.0", + "lodash": "^4.17.21", + "log-symbols": "^4.1.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.4", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.35", + "postcss-html": "^0.36.0", + "postcss-less": "^3.1.4", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.2", + "postcss-sass": "^0.4.4", + "postcss-scss": "^2.1.1", + "postcss-selector-parser": "^6.0.5", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.1.0", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.2", + "strip-ansi": "^6.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^6.6.0", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^3.0.3" + }, + "bin": { + "stylelint": "bin/stylelint.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", + "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", + "dev": true, + "peerDependencies": { + "stylelint": ">=10.1.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-4.3.0.tgz", + "integrity": "sha512-/noGjXlO8pJTr/Z3qGMoaRFK8n1BFfOqmAbX1RjTIcl4Yalr+LUb1zb9iQ7pRx1GsEBXOAm4g2z5/jou/pfMPg==", + "dev": true, + "dependencies": { + "stylelint-config-recommended": "^5.0.0" + }, + "peerDependencies": { + "stylelint": "^10.1.0 || ^11.0.0 || ^12.0.0 || ^13.0.0", + "stylelint-scss": "^3.0.0" + } + }, + "node_modules/stylelint-config-recommended-scss/node_modules/stylelint-config-recommended": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-5.0.0.tgz", + "integrity": "sha512-c8aubuARSu5A3vEHLBeOSJt1udOdS+1iue7BmJDTSXoCBmfEQmmWX+59vYIj3NQdJBY6a/QRv1ozVFpaB9jaqA==", + "dev": true, + "peerDependencies": { + "stylelint": "^13.13.0" + } + }, + "node_modules/stylelint-scss": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.21.0.tgz", + "integrity": "sha512-CMI2wSHL+XVlNExpauy/+DbUcB/oUZLARDtMIXkpV/5yd8nthzylYd1cdHeDMJVBXeYHldsnebUX6MoV5zPW4A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "stylelint": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0" + } + }, + "node_modules/stylelint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/stylelint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/stylelint/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/stylelint/node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylelint/node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylelint/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylelint/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint/node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylelint/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylelint/node_modules/postcss/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/postcss/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/stylelint/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/stylelint/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/stylelint/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylelint/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/sugarss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/sugarss/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sugarss/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sugarss/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sugarss/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/sugarss/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/sugarss/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sugarss/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sugarss/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/sugarss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sugarss/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/svgo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/tannin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz", + "integrity": "sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==", + "dependencies": { + "@tannin/plural-forms": "^1.1.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", + "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.8.0.tgz", + "integrity": "sha512-f0JH+6yMpneYcRJN314lZrSwu9eKkUFEHLN/kNy8ceh8gaRiLgFPJqrB9HsXjhEGdv4e/ekjTOFxIlL6xlma8A==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", + "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", + "dev": true, + "dependencies": { + "jest-worker": "^27.0.6", + "p-limit": "^3.1.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", + "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "node_modules/tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dev": true, + "dependencies": { + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.3.0", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + } + }, + "node_modules/tiny-lr/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dev": true, + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "node_modules/unist-util-find-all-after": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", + "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", + "dev": true, + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/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, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wait-on": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz", + "integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==", + "dev": true, + "dependencies": { + "@hapi/joi": "^15.0.3", + "core-js": "^2.6.5", + "minimist": "^1.2.0", + "request": "^2.88.0", + "rx": "^4.1.0" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/wait-on/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true, + "hasInstallScript": true + }, + "node_modules/wait-port": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.9.tgz", + "integrity": "sha512-hQ/cVKsNqGZ/UbZB/oakOGFqic00YAMM5/PEj3Bt4vKarv2jWIWzDbqlwT94qMs/exAQAsvMOq99sZblV92zxQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "commander": "^3.0.2", + "debug": "^4.1.1" + }, + "bin": { + "wait-port": "bin/wait-port.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wait-port/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wait-port/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wait-port/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/wait-port/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/wait-port/node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "node_modules/wait-port/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/wait-port/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wait-port/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/watchpack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.53.0.tgz", + "integrity": "sha512-RZ1Z3z3ni44snoWjfWeHFyzvd9HMVYDYC5VXmlYUT6NWgEOWdCNpad5Fve2CzzHoRED7WtsKe+FCyP5Vk4pWiQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.7.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", + "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^6.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-cli": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.8.0.tgz", + "integrity": "sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.4", + "@webpack-cli/info": "^1.3.0", + "@webpack-cli/serve": "^1.5.2", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-cli/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/webpack-cli/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-cli/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/webpack-livereload-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/webpack-livereload-plugin/-/webpack-livereload-plugin-3.0.2.tgz", + "integrity": "sha512-5JeZ2dgsvSNG+clrkD/u2sEiPcNk4qwCVZZmW8KpqKcNlkGv7IJjdVrq13+etAmMZYaCF1EGXdHkVFuLgP4zfw==", + "dev": true, + "dependencies": { + "anymatch": "^3.1.1", + "portfinder": "^1.0.17", + "schema-utils": ">1.0.0", + "tiny-lr": "^1.1.1" + }, + "engines": { + "node": ">= 10.18.0" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-merge/node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-merge/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-merge/node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", + "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz", + "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/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, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, + "dependencies": { + "@aivec/react-material-components": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@aivec/react-material-components/-/react-material-components-3.0.3.tgz", + "integrity": "sha512-JVfp9Ko+FKNB0QZHnNsGMnwZyw8DHjO6CXwU0bseywHdag/wjhyjoGC9/59DbtUzEF+1KQDObXXPJjtNkdAeEA==", + "requires": {} + }, + "@aivec/reqres-utils": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@aivec/reqres-utils/-/reqres-utils-6.0.1.tgz", + "integrity": "sha512-czKoZxpB6x4ARX2+Q/CGdStXBk6mckgd+S9sIg+/xjW6rQ0h/C40QYBxxTJTTA5jOEyUxePtHknl+2QhLgmI9A==", + "requires": { + "lodash": "^4.17.20", + "qs": "^6.9.4" + }, + "dependencies": { + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@aivec/wp-typescript-react": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@aivec/wp-typescript-react/-/wp-typescript-react-2.0.1.tgz", + "integrity": "sha512-mdoUXjIm7ByzDKpe2cOKsnb66QJH8jTkYZd8c58SRTwI71K56aY0G1NL7So9an8rfXHxKF1Oa7Dd8BnUY5w3Wg==", + "dev": true, + "requires": { + "cross-env": "^7.0.3", + "cross-spawn": "^7.0.3", + "glob": "^7.1.7", + "yargs": "^17.0.1" + } + }, + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true + }, + "@babel/core": { + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "requires": { + "@babel/types": "^7.15.4", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", + "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "dev": true, + "requires": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", + "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz", + "integrity": "sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", + "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz", + "integrity": "sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz", + "integrity": "sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.6.tgz", + "integrity": "sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.4", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + } + }, + "@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + } + }, + "@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", + "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "dev": true, + "requires": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", + "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "dev": true + }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "peer": true, + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "peer": true + }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", + "peer": true + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "peer": true + }, + "@es-joy/jsdoccomment": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.6.0.tgz", + "integrity": "sha512-zT1EtysKMITJ7vE4RvOJqitxk/Str6It8hq+fykxkwLuTyzgak+TnVuVSIyovT/qrEz3i46ypCSXgNtIDYwNOg==", + "dev": true, + "requires": { + "comment-parser": "^1.1.5", + "esquery": "^1.4.0", + "jsdoctypeparser": "^9.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@material-ui/core": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.3.tgz", + "integrity": "sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + } + }, + "@material-ui/icons": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", + "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "requires": { + "@babel/runtime": "^7.4.4" + } + }, + "@material-ui/styles": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "dependencies": { + "csstype": { + "version": "2.6.18", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", + "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" + } + } + }, + "@material-ui/system": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "dependencies": { + "csstype": { + "version": "2.6.18", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", + "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" + } + } + }, + "@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "requires": {} + }, + "@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@polka/url": { + "version": "1.0.0-next.20", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.20.tgz", + "integrity": "sha512-88p7+M0QGxKpmnkfXjS4V26AnoC/eiqZutE8GLdaI5X12NY75bXSdTY9NkmYb2Xyk1O+MmkuO6Frmsj84V6I8Q==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@stylelint/postcss-css-in-js": { + "version": "0.37.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz", + "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==", + "dev": true, + "requires": { + "@babel/core": ">=7.9.0" + } + }, + "@stylelint/postcss-markdown": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", + "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", + "dev": true, + "requires": { + "remark": "^13.0.0", + "unist-util-find-all-after": "^3.0.2" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "dev": true + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "dev": true + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "dev": true + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "dev": true + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "dev": true + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "dev": true + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "dev": true + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "dev": true + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dev": true, + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dev": true, + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, + "@tannin/compile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", + "integrity": "sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==", + "requires": { + "@tannin/evaluate": "^1.2.0", + "@tannin/postfix": "^1.1.0" + } + }, + "@tannin/evaluate": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz", + "integrity": "sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg==" + }, + "@tannin/plural-forms": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.1.0.tgz", + "integrity": "sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==", + "requires": { + "@tannin/compile": "^1.1.0" + } + }, + "@tannin/postfix": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz", + "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw==" + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/cheerio": { + "version": "0.22.30", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.30.tgz", + "integrity": "sha512-t7ZVArWZlq3dFa9Yt33qFBQIK4CQd1Q3UJp0V+UhP6vgLWLM6Qug7vZuRSGXg45zXeB1Fm5X2vmBkEX58LV2Tw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "dev": true, + "requires": { + "@types/unist": "*" + } + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "16.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.4.tgz", + "integrity": "sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "dev": true + }, + "@types/react": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.22.tgz", + "integrity": "sha512-kq/BMeaAVLJM6Pynh8C2rnr/drCK+/5ksH0ch9asz+8FW3DscYCIEFtCeYTFeIx/ubvOsMXmRfy7qEJ76gM96A==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz", + "integrity": "sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.3.tgz", + "integrity": "sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg==", + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "dev": true + }, + "@types/webpack": { + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", + "integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.31.2", + "@typescript-eslint/scope-manager": "4.31.2", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", + "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.31.2", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/typescript-estree": "4.31.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", + "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.31.2", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/typescript-estree": "4.31.2", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", + "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2" + } + }, + "@typescript-eslint/types": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", + "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", + "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", + "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.31.2", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz", + "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz", + "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.2.tgz", + "integrity": "sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==", + "dev": true, + "requires": {} + }, + "@wojtekmaj/enzyme-adapter-react-17": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.3.tgz", + "integrity": "sha512-Kp1ZJxtHkKEnUksaWrcMABNTOgL4wOt8VI6k2xOek2aH9PtZcWRXJNUEgnKrdJrqg5UqIjRslbVF9uUqwQJtFg==", + "dev": true, + "requires": { + "@wojtekmaj/enzyme-adapter-utils": "^0.1.1", + "enzyme-shallow-equal": "^1.0.0", + "has": "^1.0.0", + "object.assign": "^4.1.0", + "object.values": "^1.1.0", + "prop-types": "^15.7.0", + "react-is": "^17.0.2", + "react-test-renderer": "^17.0.0" + } + }, + "@wojtekmaj/enzyme-adapter-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-utils/-/enzyme-adapter-utils-0.1.1.tgz", + "integrity": "sha512-bNPWtN/d8huKOkC6j1E3EkSamnRrHHT7YuR6f9JppAQqtoAm3v4/vERe4J14jQKmHLCyEBHXrlgb7H6l817hVg==", + "dev": true, + "requires": { + "function.prototype.name": "^1.1.0", + "has": "^1.0.0", + "object.assign": "^4.1.0", + "object.fromentries": "^2.0.0", + "prop-types": "^15.7.0" + } + }, + "@wordpress/babel-plugin-import-jsx-pragma": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-3.1.0.tgz", + "integrity": "sha512-518mL3goaSeXtJCQcPK9OYHUUiA0sjXuoGWHBwRalkyTIQZZy5ZZzlwrlSc9ESZcOw9BZ+Uo8CJRjV2OWnx+Zw==", + "dev": true, + "requires": {} + }, + "@wordpress/babel-preset-default": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-6.3.2.tgz", + "integrity": "sha512-RKKO5rhUlEtYYd2kHRkuSY97irq+MTxPYy/IJzM5D8Z17irasNRWs1GwOlbelewHUXA9BIHkX465R5ec7D7OHw==", + "dev": true, + "requires": { + "@babel/core": "^7.13.10", + "@babel/plugin-transform-react-jsx": "^7.12.7", + "@babel/plugin-transform-runtime": "^7.13.10", + "@babel/preset-env": "^7.13.10", + "@babel/preset-typescript": "^7.13.0", + "@babel/runtime": "^7.13.10", + "@wordpress/babel-plugin-import-jsx-pragma": "^3.1.0", + "@wordpress/browserslist-config": "^4.1.0", + "@wordpress/element": "^4.0.1", + "@wordpress/warning": "^2.2.1", + "browserslist": "^4.16.6", + "core-js": "^3.12.1" + } + }, + "@wordpress/base-styles": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-4.0.0.tgz", + "integrity": "sha512-kvgBUFKzQwgv7j0QX5G4/Rmb11oAAmi5+yG+4fYEOprQMXMf/o5SeYvIN+h7zaHN4naYxjdGQTNrkyYoOd0LSg==", + "dev": true + }, + "@wordpress/browserslist-config": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-4.1.0.tgz", + "integrity": "sha512-RSJhgY2xmz6yAdDNhz/NvAO6JS+91vv9cVL7VDG2CftbyjTXBef05vWt3FzZhfeF0xUrYdpZL1PVpxmJiKvbEg==", + "dev": true + }, + "@wordpress/dependency-extraction-webpack-plugin": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-3.2.1.tgz", + "integrity": "sha512-Ltd+1CJb7PMh6iN2Mse+3yN/oMORug5qXSj/3xmuZERzZO2SO6xNEJGml8yK9ev747cbHktEpitK4H+8VO3Ekg==", + "dev": true, + "requires": { + "json2php": "^0.0.4", + "webpack-sources": "^2.2.0" + } + }, + "@wordpress/element": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-4.0.1.tgz", + "integrity": "sha512-Woi8Vh6anJgCt0AHvhUexiL+3TrhUk1EiLCN9vRahd9k5gvNQ6FzrQr60TagONmQXbe0CHACmWksZaVvQmsA/g==", + "dev": true, + "requires": { + "@babel/runtime": "^7.13.10", + "@types/react": "^16.9.0", + "@types/react-dom": "^16.9.0", + "@wordpress/escape-html": "^2.2.1", + "lodash": "^4.17.21", + "react": "^17.0.1", + "react-dom": "^17.0.1" + }, + "dependencies": { + "@types/react": { + "version": "16.14.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.15.tgz", + "integrity": "sha512-jOxlBV9RGZhphdeqJTCv35VZOkjY+XIEY2owwSk84BNDdDv2xS6Csj6fhi+B/q30SR9Tz8lDNt/F2Z5RF3TrRg==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "16.9.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.14.tgz", + "integrity": "sha512-FIX2AVmPTGP30OUJ+0vadeIFJJ07Mh1m+U0rxfgyW34p3rTlXI+nlenvAxNn4BP36YyI9IJ/+UJ7Wu22N1pI7A==", + "dev": true, + "requires": { + "@types/react": "^16" + } + } + } + }, + "@wordpress/escape-html": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.2.1.tgz", + "integrity": "sha512-+5hMa+1BLYgHdOxPK7TF+hfAaKJY1UE6osZL8s4boYeaq/O23PFv4aCPQF+z9/4cIKyvOJPGk26Z1Op6DwJLGA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@wordpress/eslint-plugin": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-9.1.2.tgz", + "integrity": "sha512-BRlsdhtR0JHpSvFWGwgzoMcTDtUvJ5r0f/VPhDhTz/EzTXuwbixF2P6d3L7qKvA/R6PqC1uMJRsGB1Xk9qyhNw==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^4.15.0", + "@typescript-eslint/parser": "^4.15.0", + "@wordpress/prettier-config": "^1.1.1", + "babel-eslint": "^10.1.0", + "cosmiconfig": "^7.0.0", + "eslint-config-prettier": "^7.1.0", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-jest": "^24.1.3", + "eslint-plugin-jsdoc": "^34.1.0", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-prettier": "^3.3.0", + "eslint-plugin-react": "^7.22.0", + "eslint-plugin-react-hooks": "^4.2.0", + "globals": "^12.0.0", + "prettier": "npm:wp-prettier@2.2.1-beta-1", + "requireindex": "^1.2.0" + }, + "dependencies": { + "eslint-config-prettier": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", + "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "prettier": { + "version": "npm:wp-prettier@2.2.1-beta-1", + "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.2.1-beta-1.tgz", + "integrity": "sha512-+JHkqs9LC/JPp51yy1hzs3lQ7qeuWCwOcSzpQNeeY/G7oSpnF61vxt7hRh87zNRTr6ob2ndy0W8rVzhgrcA+Gw==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "@wordpress/hooks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.2.0.tgz", + "integrity": "sha512-nVR6V9kPxl8+aYQzQJdoDt+aKBKHHD0zplcYZbu2MHxjmHMvppAeL9mjzVhQZj/3n10NR2Ftk94mHQzHWfhCCg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@wordpress/i18n": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.2.2.tgz", + "integrity": "sha512-6PrfTDpeW5dfWyuqUx4Z5ApKFbh45CAbCs/G3PuZLlKJlXs/8p2Oq6Zxs0gLZk1QfHkw0t5qMx61lDlxWQhuPw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@wordpress/hooks": "^3.2.0", + "gettext-parser": "^1.3.1", + "lodash": "^4.17.21", + "memize": "^1.1.0", + "sprintf-js": "^1.1.1", + "tannin": "^1.2.0" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + } + } + }, + "@wordpress/jest-console": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-4.1.0.tgz", + "integrity": "sha512-MAbEfYUH+odlYYtPNKoKnWzSZKZjSc2r2kvFJ7FR920ZdteEgSAPIOvjyv4r4UbJy3ZuKemnXHuVtcTAKca5Tw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.13.10", + "jest-matcher-utils": "^26.6.2", + "lodash": "^4.17.21" + } + }, + "@wordpress/jest-preset-default": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-7.1.1.tgz", + "integrity": "sha512-925Ern0GAABF2/2B25svi8GFHJqPWLJlwndJcCfwbx8CRNXeXu3YfYAtZrDE6vDRBxKJQEk8j9upptiZrV8rJw==", + "dev": true, + "requires": { + "@wojtekmaj/enzyme-adapter-react-17": "^0.6.1", + "@wordpress/jest-console": "^4.1.0", + "babel-jest": "^26.6.3", + "enzyme": "^3.11.0", + "enzyme-to-json": "^3.4.4" + } + }, + "@wordpress/npm-package-json-lint-config": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-4.1.0.tgz", + "integrity": "sha512-FjXL5GbpmI/wXXcpCf2sKosVIVuWjUuHmDbwcMzd0SClcudo9QjDRdVe35We+js8eQLPgB9hsG4Cty6cAFFxsQ==", + "dev": true, + "requires": {} + }, + "@wordpress/postcss-plugins-preset": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-3.2.1.tgz", + "integrity": "sha512-pgwLb3agk/Xked5ljfpYiWlPOIV2ABa8x1yFRxasxvYAareaZemRl8gzDMeTFgYQoiEPF+9MYWXaZ1qQEDlAQA==", + "dev": true, + "requires": { + "@wordpress/base-styles": "^4.0.0", + "autoprefixer": "^10.2.5" + } + }, + "@wordpress/prettier-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-1.1.1.tgz", + "integrity": "sha512-qjpBK5KB2ieCLv+1fGNKRW4urf5tFN1eUn3Qy+JINxNwAx6Jj9uhfXA4AldCSnD+WkzsN2UgBvgAj5/SWwzRZQ==", + "dev": true + }, + "@wordpress/scripts": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-18.0.1.tgz", + "integrity": "sha512-IMxYFbQNIoVxdkIBHDfm/T3T2VKyJTHZ9TSZEr8oN8aepPpxwDbf76JlMtQYWcnyrbuTkaERhdlcmu/6m1lWxg==", + "dev": true, + "requires": { + "@svgr/webpack": "^5.5.0", + "@wordpress/babel-preset-default": "^6.3.2", + "@wordpress/browserslist-config": "^4.1.0", + "@wordpress/dependency-extraction-webpack-plugin": "^3.2.1", + "@wordpress/eslint-plugin": "^9.1.2", + "@wordpress/jest-preset-default": "^7.1.1", + "@wordpress/npm-package-json-lint-config": "^4.1.0", + "@wordpress/postcss-plugins-preset": "^3.2.1", + "@wordpress/prettier-config": "^1.1.1", + "@wordpress/stylelint-config": "^19.1.0", + "babel-jest": "^26.6.3", + "babel-loader": "^8.2.2", + "browserslist": "^4.16.6", + "chalk": "^4.0.0", + "check-node-version": "^4.1.0", + "clean-webpack-plugin": "^3.0.0", + "cross-spawn": "^5.1.0", + "css-loader": "^6.2.0", + "cssnano": "^5.0.7", + "cwd": "^0.10.0", + "dir-glob": "^3.0.1", + "eslint": "^7.17.0", + "eslint-plugin-markdown": "^2.2.0", + "expect-puppeteer": "^4.4.0", + "filenamify": "^4.2.0", + "jest": "^26.6.3", + "jest-circus": "^26.6.3", + "jest-dev-server": "^4.4.0", + "jest-environment-node": "^26.6.2", + "markdownlint": "^0.23.1", + "markdownlint-cli": "^0.27.1", + "merge-deep": "^3.0.3", + "mini-css-extract-plugin": "^2.1.0", + "minimist": "^1.2.0", + "npm-package-json-lint": "^5.0.0", + "postcss": "^8.2.15", + "postcss-loader": "^6.1.1", + "prettier": "npm:wp-prettier@2.2.1-beta-1", + "puppeteer-core": "^10.1.0", + "read-pkg-up": "^1.0.1", + "resolve-bin": "^0.4.0", + "sass": "^1.35.2", + "sass-loader": "^12.1.0", + "source-map-loader": "^3.0.0", + "stylelint": "^13.8.0", + "terser-webpack-plugin": "^5.1.4", + "url-loader": "^4.1.1", + "webpack": "^5.47.1", + "webpack-bundle-analyzer": "^4.4.2", + "webpack-cli": "^4.7.2", + "webpack-livereload-plugin": "^3.0.1" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "prettier": { + "version": "npm:wp-prettier@2.2.1-beta-1", + "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.2.1-beta-1.tgz", + "integrity": "sha512-+JHkqs9LC/JPp51yy1hzs3lQ7qeuWCwOcSzpQNeeY/G7oSpnF61vxt7hRh87zNRTr6ob2ndy0W8rVzhgrcA+Gw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "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" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@wordpress/stylelint-config": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-19.1.0.tgz", + "integrity": "sha512-K/wB9rhB+pH5WvDh3fV3DN5C3Bud+jPGXmnPY8fOXKMYI3twCFozK/j6sVuaJHqGp/0kKEF0hkkGh+HhD30KGQ==", + "dev": true, + "requires": { + "stylelint-config-recommended": "^3.0.0", + "stylelint-config-recommended-scss": "^4.2.0", + "stylelint-scss": "^3.17.2" + } + }, + "@wordpress/warning": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.2.1.tgz", + "integrity": "sha512-IlwDEcCYCMQjrHjVxPTjqx/y+aeyg0DYpNGArt30WFY/aVfZHNu25UASYjwngEahIAUfA7b3oTQbJv2o3IghGQ==", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "requires": {} + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "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" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "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" + } + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "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-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "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 + }, + "array.prototype.filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.0.tgz", + "integrity": "sha512-TfO1gz+tLm+Bswq0FBOXPqAchtCr2Rn48T8dLJoRFl8NoEosjZmzptmuo1X8aZBzZcqsR1W8U761tjACJtngTQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.5" + } + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "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 + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "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 + }, + "autoprefixer": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.4.tgz", + "integrity": "sha512-EKjKDXOq7ug+jagLzmnoTRpTT0q1KVzEJqrJd0hCBa7FiG0WbFOBCcJCy2QkW1OckpO3qgttA1aWjVbeIPAecw==", + "dev": true, + "requires": { + "browserslist": "^4.16.8", + "caniuse-lite": "^1.0.30001252", + "colorette": "^1.3.0", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "axe-core": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.3.tgz", + "integrity": "sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA==", + "dev": true + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz", + "integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, + "babel-plugin-styled-components": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.2.tgz", + "integrity": "sha512-Vb1R3d4g+MUfPQPVDMCGjm3cDocJEUTR7Xq7QS95JWWeksN1wdFRYpD2kulDgI3Huuaf1CZd+NK4KQmqUFh5dA==", + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-module-imports": "^7.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "peer": true + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "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" + } + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", + "dev": true, + "requires": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "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": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserslist": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", + "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001254", + "colorette": "^1.3.0", + "electron-to-chromium": "^1.3.830", + "escalade": "^3.1.1", + "node-releases": "^1.1.75" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + }, + "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" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=", + "peer": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001258", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz", + "integrity": "sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true + }, + "check-node-version": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/check-node-version/-/check-node-version-4.1.0.tgz", + "integrity": "sha512-TSXGsyfW5/xY2QseuJn8/hleO2AU7HxVCdkc900jp1vcfzF840GkjvRT7CHl8sRtWn23n3X3k0cwH9RXeRwhfw==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "map-values": "^1.0.1", + "minimist": "^1.2.0", + "object-filter": "^1.0.2", + "run-parallel": "^1.1.4", + "semver": "^6.3.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dev": true, + "requires": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + } + }, + "cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + } + } + }, + "clean-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "dev": true, + "requires": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "dev": true, + "requires": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + } + }, + "clone-regexp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", + "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", + "dev": true, + "requires": { + "is-regexp": "^2.0.0" + } + }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "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 + }, + "colord": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.7.0.tgz", + "integrity": "sha512-pZJBqsHz+pYyw3zpX6ZRXWoCHM1/cvFikY9TV8G3zcejCaKE0lhankoj8iScyrrePA8C7yJ5FStfA9zbcOnw7Q==", + "dev": true + }, + "colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "comment-parser": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.5.tgz", + "integrity": "sha512-RePCE4leIhBlmrqiYTvaqEeGYg7qpSl4etaIabKtdOQVi+mSTIBBklGUwIr79GXYnl3LpMwmDw4KeR2stNc6FA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "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 + }, + "continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.0.tgz", + "integrity": "sha512-WJeQqq6jOYgVgg4NrXKL0KLQhi0CT4ZOCvFL+3CQ5o7I6J8HkT5wd53EadMfqTDp1so/MT1J+w2ujhWcCJtN7w==", + "dev": true + }, + "core-js-compat": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.0.tgz", + "integrity": "sha512-tRVjOJu4PxdXjRMEgbP7lqWy1TWJu9a01oBkn8d+dNrhgmBwdTkzhHZpVJnEmhISLdoJI1lX08rcBcHi3TZIWg==", + "dev": true, + "requires": { + "browserslist": "^4.17.0", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.0.tgz", + "integrity": "sha512-ZnK+9vyuMhKulIGqT/7RHGRok8RtkHMEX/BGPHkHx+ouDkq+MUvf9mfIgdqhpmPDu8+V5UtRn/CbCRc9I4lX4w==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=", + "peer": true + }, + "css-color-names": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz", + "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==", + "dev": true + }, + "css-declaration-sorter": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz", + "integrity": "sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==", + "dev": true, + "requires": { + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.3.0.tgz", + "integrity": "sha512-9NGvHOR+L6ps13Ilw/b216++Q8q+5RpJcVufCdW9S/9iCzs4KBDNa8qnA/n3FK/sSfWmH35PAIK/cfPi7LOSUg==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "semver": "^7.3.5" + } + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "peer": true, + "requires": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "requires": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, + "css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.8.tgz", + "integrity": "sha512-Lda7geZU0Yu+RZi2SGpjYuQz4HI4/1Y+BhdD0jL7NXAQ5larCzVn+PUGuZbDMYz904AXXCOgO5L1teSvgu7aFg==", + "dev": true, + "requires": { + "cssnano-preset-default": "^5.1.4", + "is-resolvable": "^1.1.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.4.tgz", + "integrity": "sha512-sPpQNDQBI3R/QsYxQvfB4mXeEcWuw0wGtKtmS5eg8wudyStYMgKOQT39G07EbW1LB56AOYrinRS9f0ig4Y3MhQ==", + "dev": true, + "requires": { + "css-declaration-sorter": "^6.0.3", + "cssnano-utils": "^2.0.1", + "postcss-calc": "^8.0.0", + "postcss-colormin": "^5.2.0", + "postcss-convert-values": "^5.0.1", + "postcss-discard-comments": "^5.0.1", + "postcss-discard-duplicates": "^5.0.1", + "postcss-discard-empty": "^5.0.1", + "postcss-discard-overridden": "^5.0.1", + "postcss-merge-longhand": "^5.0.2", + "postcss-merge-rules": "^5.0.2", + "postcss-minify-font-values": "^5.0.1", + "postcss-minify-gradients": "^5.0.2", + "postcss-minify-params": "^5.0.1", + "postcss-minify-selectors": "^5.1.0", + "postcss-normalize-charset": "^5.0.1", + "postcss-normalize-display-values": "^5.0.1", + "postcss-normalize-positions": "^5.0.1", + "postcss-normalize-repeat-style": "^5.0.1", + "postcss-normalize-string": "^5.0.1", + "postcss-normalize-timing-functions": "^5.0.1", + "postcss-normalize-unicode": "^5.0.1", + "postcss-normalize-url": "^5.0.2", + "postcss-normalize-whitespace": "^5.0.1", + "postcss-ordered-values": "^5.0.2", + "postcss-reduce-initial": "^5.0.1", + "postcss-reduce-transforms": "^5.0.1", + "postcss-svgo": "^5.0.2", + "postcss-unique-selectors": "^5.0.1" + } + }, + "cssnano-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", + "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", + "dev": true, + "requires": {} + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "csstype": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", + "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + }, + "cwd": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", + "integrity": "sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc=", + "dev": true, + "requires": { + "find-pkg": "^0.1.2", + "fs-exists-sync": "^0.1.0" + } + }, + "damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "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 + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "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" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "devtools-protocol": { + "version": "0.0.901419", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", + "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.844", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.844.tgz", + "integrity": "sha512-7ES6GQVsbgsUA49/apqub51I9ij8E3QwGqq/IRvO6OPCly3how/YUSg1GPslRWq+BteT2h94iAIQdJbuVVH4Pg==", + "dev": true + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "enzyme": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", + "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", + "dev": true, + "requires": { + "array.prototype.flat": "^1.2.3", + "cheerio": "^1.0.0-rc.3", + "enzyme-shallow-equal": "^1.0.1", + "function.prototype.name": "^1.1.2", + "has": "^1.0.3", + "html-element-map": "^1.2.0", + "is-boolean-object": "^1.0.1", + "is-callable": "^1.1.5", + "is-number-object": "^1.0.4", + "is-regex": "^1.0.5", + "is-string": "^1.0.5", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.7.0", + "object-is": "^1.0.2", + "object.assign": "^4.1.0", + "object.entries": "^1.1.1", + "object.values": "^1.1.1", + "raf": "^3.4.1", + "rst-selector-parser": "^2.2.3", + "string.prototype.trim": "^1.2.1" + } + }, + "enzyme-shallow-equal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz", + "integrity": "sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==", + "dev": true, + "requires": { + "has": "^1.0.3", + "object-is": "^1.1.2" + } + }, + "enzyme-to-json": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.6.2.tgz", + "integrity": "sha512-Ynm6Z6R6iwQ0g2g1YToz6DWhxVnt8Dy1ijR2zynRKxTyBGA8rCDXU3rs2Qc4OKvUvc2Qoe1bcFK6bnPs20TrTg==", + "dev": true, + "requires": { + "@types/cheerio": "^0.22.22", + "lodash": "^4.17.21", + "react-is": "^16.12.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + } + } + }, + "error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "requires": { + "string-template": "~0.2.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.6.tgz", + "integrity": "sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-string": "^1.0.7", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-module-lexer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", + "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", + "dev": true + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "eslint-config-airbnb-typescript": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-14.0.0.tgz", + "integrity": "sha512-d2Nit2ByZARGRYK6tgSNl3nnmGZPyvsgbsKFcmm+nAhvT8VjVpifG5jI4tzObUUPb0sWw0E1oO/0pSpBD/pIuQ==", + "dev": true, + "requires": {} + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-import-resolver-typescript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.5.0.tgz", + "integrity": "sha512-qZ6e5CFr+I7K4VVhQu3M/9xGv9/YmwsEXrsm3nimw8vWaVHRDrQRp26BgCypTxBp3vUp4o5aVEJRiy0F2DFddQ==", + "dev": true, + "requires": { + "debug": "^4.3.1", + "glob": "^7.1.7", + "is-glob": "^4.0.1", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + } + }, + "eslint-module-utils": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "dependencies": { + "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" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-plugin-jest": { + "version": "24.4.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.2.tgz", + "integrity": "sha512-jNMnqwX75z0RXRMXkxwb/+9ylKJYJLJ8nT8nBT0XFM5qx4IQGxP4edMawa0qGkSbHae0BDPBmi8I2QF0/F04XQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^4.0.1" + } + }, + "eslint-plugin-jsdoc": { + "version": "34.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-34.8.2.tgz", + "integrity": "sha512-UOU9A40Cl806JMtla2vF+RM6sNqfLPbhLv9FZqhcC7+LmChD3DVaWqM7ADxpF0kMyZNWe1QKUnqGnXaA3NTn+w==", + "dev": true, + "requires": { + "@es-joy/jsdoccomment": "^0.6.0", + "comment-parser": "1.1.5", + "debug": "^4.3.1", + "esquery": "^1.4.0", + "jsdoctypeparser": "^9.0.0", + "lodash": "^4.17.21", + "regextras": "^0.7.1", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "dependencies": { + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + } + } + }, + "eslint-plugin-markdown": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.1.tgz", + "integrity": "sha512-FgWp4iyYvTFxPwfbxofTvXxgzPsDuSKHQy2S+a8Ve6savbujey+lgrFFbXQA0HPygISpRYWYBjooPzhYSF81iA==", + "dev": true, + "requires": { + "mdast-util-from-markdown": "^0.8.5" + } + }, + "eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.3.tgz", + "integrity": "sha512-ZMbFvZ1WAYSZKY662MBVEWR45VaBT6KSJCiupjrNlcdakB90juaZeDCbJq19e73JZQubqFtgETohwgAt8u5P6w==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "estraverse": "^5.2.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.hasown": "^1.0.0", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "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 + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "execall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", + "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", + "dev": true, + "requires": { + "clone-regexp": "^2.1.0" + } + }, + "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": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + } + }, + "expect-puppeteer": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-4.4.0.tgz", + "integrity": "sha512-6Ey4Xy2xvmuQu7z7YQtMsaMV0EHJRpVxIDOd5GRrm04/I3nkTKIutELfECsLp6le+b3SSa3cXhPiw6PgqzxYWA==", + "dev": true + }, + "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" + } + } + } + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true + }, + "filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "find-file-up": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", + "integrity": "sha1-z2gJG8+fMApA2kEbN9pczlovvqA=", + "dev": true, + "requires": { + "fs-exists-sync": "^0.1.0", + "resolve-dir": "^0.1.0" + } + }, + "find-parent-dir": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.1.tgz", + "integrity": "sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A==", + "dev": true + }, + "find-pkg": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", + "integrity": "sha1-G9wiwG42NlUy4qJIBGhUuXiNpVc=", + "dev": true, + "requires": { + "find-file-up": "^0.1.2" + } + }, + "find-process": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.4.tgz", + "integrity": "sha512-rRSuT1LE4b+BFK588D2V8/VG9liW0Ark1XJgroxZXI0LtwmQJOb490DvDYvbm+Hek9ETFzTutGfJ90gumITPhQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "commander": "^5.1.0", + "debug": "^4.1.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "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" + } + } + } + }, + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + }, + "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": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fraction.js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==", + "dev": true + }, + "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-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.4.tgz", + "integrity": "sha512-iqy1pIotY/RmhdFZygSSlW0wko2yxkSCKqsuv4pr8QESohpYyG/Z7B/XXvPRKTJS//960rgguE5mSRUsDdaJrQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "functions-have-names": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz", + "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gettext-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz", + "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==", + "requires": { + "encoding": "^0.1.12", + "safe-buffer": "^5.1.1" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + }, + "dependencies": { + "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" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "dev": true + }, + "gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "requires": { + "duplexer": "^0.1.2" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "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-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "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": { + "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" + } + } + } + }, + "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" + } + } + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "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" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "html-element-map": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", + "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", + "dev": true, + "requires": { + "array.prototype.filter": "^1.0.0", + "call-bind": "^1.0.2" + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "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 + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "irregular-plurals": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", + "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "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-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "optional": 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-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true + }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "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-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", + "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "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 + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + } + }, + "jest-circus": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.3.tgz", + "integrity": "sha512-ACrpWZGcQMpbv13XbzRzpytEJlilP/Su0JtNCi5r/xLpOUhnaIJr8leYYpLEMgPFURZISEHrnnpmB54Q/UziPw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" + } + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + } + }, + "jest-dev-server": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-4.4.0.tgz", + "integrity": "sha512-STEHJ3iPSC8HbrQ3TME0ozGX2KT28lbT4XopPxUm2WimsX3fcB3YOptRh12YphQisMhfqNSNTZUmWyT3HEXS2A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "cwd": "^0.10.0", + "find-process": "^1.4.3", + "prompts": "^2.3.0", + "spawnd": "^4.4.0", + "tree-kill": "^1.2.2", + "wait-on": "^3.3.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + } + }, + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } + }, + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + } + }, + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "dependencies": { + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } + }, + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + } + }, + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdoctypeparser": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", + "dev": true + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json2php": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.4.tgz", + "integrity": "sha1-a9haHdpqXdfpECK7JEA8wbfC7jQ=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jss": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.8.0.tgz", + "integrity": "sha512-6fAMLJrVQ8epM5ghghxWqCwRR0ZamP2cKbOAtzPudcCMSNdAqtvmzQvljUZYR8OXJIeb/IpZeOXA1sDXms4R1w==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-camel-case": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.0.tgz", + "integrity": "sha512-yxlXrXwcCdGw+H4BC187dEu/RFyW8joMcWfj8Rk9UPgWTKu2Xh7Sib4iW3xXjHe/t5phOHF1rBsHleHykWix7g==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.8.0" + } + }, + "jss-plugin-default-unit": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.0.tgz", + "integrity": "sha512-9XJV546cY9zV9OvIE/v/dOaxSi4062VfYQQfwbplRExcsU2a79Yn+qDz/4ciw6P4LV1Naq90U+OffAGRHfNq/Q==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.0" + } + }, + "jss-plugin-global": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.8.0.tgz", + "integrity": "sha512-H/8h/bHd4e7P0MpZ9zaUG8NQSB2ie9rWo/vcCP6bHVerbKLGzj+dsY22IY3+/FNRS8zDmUyqdZx3rD8k4nmH4w==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.0" + } + }, + "jss-plugin-nested": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.8.0.tgz", + "integrity": "sha512-MhmINZkSxyFILcFBuDoZmP1+wj9fik/b9SsjoaggkGjdvMQCES21mj4K5ZnRGVm448gIXyi9j/eZjtDzhaHUYQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.0.tgz", + "integrity": "sha512-VY+Wt5WX5GMsXDmd+Ts8+O16fpiCM81svbox++U3LDbJSM/g9FoMx3HPhwUiDfmgHL9jWdqEuvSl/JAk+mh6mQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.0" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.0.tgz", + "integrity": "sha512-R8N8Ma6Oye1F9HroiUuHhVjpPsVq97uAh+rMI6XwKLqirIu2KFb5x33hPj+vNBMxSHc9jakhf5wG0BbQ7fSDOg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.0.tgz", + "integrity": "sha512-G1zD0J8dFwKZQ+GaZaay7A/Tg7lhDw0iEkJ/iFFA5UPuvZFpMprCMQttXcTBhLlhhWnyZ8YPn4yqp+amrhQekw==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.8.0" + } + }, + "jsx-ast-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" + } + }, + "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" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true + }, + "known-css-properties": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", + "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", + "dev": true + }, + "language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", + "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", + "dev": true + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.differencewith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.differencewith/-/lodash.differencewith-4.5.0.tgz", + "integrity": "sha1-uvr7yRi1UVTheRdqALsK76rIVLc=", + "dev": true + }, + "lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "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-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "map-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-values/-/map-values-1.0.1.tgz", + "integrity": "sha1-douOecAJvytk/ugG4ip7HEGQyZA=", + "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" + } + }, + "markdown-it": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.0.4.tgz", + "integrity": "sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true + } + } + }, + "markdownlint": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.23.1.tgz", + "integrity": "sha512-iOEwhDfNmq2IJlaA8mzEkHYUi/Hwoa6Ss+HO5jkwUR6wQ4quFr0WzSx+Z9rsWZKUaPbyirIdL1zGmJRkWawr4Q==", + "dev": true, + "requires": { + "markdown-it": "12.0.4" + } + }, + "markdownlint-cli": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.27.1.tgz", + "integrity": "sha512-p1VV6aSbGrDlpUWzHizAnSNEQAweVR3qUI/AIUubxW7BGPXziSXkIED+uRtSohUlRS/jmqp3Wi4es5j6fIrdeQ==", + "dev": true, + "requires": { + "commander": "~7.1.0", + "deep-extend": "~0.6.0", + "get-stdin": "~8.0.0", + "glob": "~7.1.6", + "ignore": "~5.1.8", + "js-yaml": "^4.0.0", + "jsonc-parser": "~3.0.0", + "lodash.differencewith": "~4.5.0", + "lodash.flatten": "~4.4.0", + "markdownlint": "~0.23.1", + "markdownlint-rule-helpers": "~0.14.0", + "minimatch": "~3.0.4", + "minimist": "~1.2.5", + "rc": "~1.2.8" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "commander": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", + "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "markdownlint-rule-helpers": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.14.0.tgz", + "integrity": "sha512-vRTPqSU4JK8vVXmjICHSBhwXUvbfh/VJo+j7hvxqe15tLJyomv3FLgFdFgb8kpj0Fe8SsJa/TZUAXv7/sN+N7A==", + "dev": true + }, + "mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true + }, + "mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "memize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/memize/-/memize-1.1.0.tgz", + "integrity": "sha512-K4FcPETOMTwe7KL2LK0orMhpOmWD2wRGwWWpbZy0fyArwsyIKR8YJVz8+efBAh3BO4zPqlSICu4vsLTRRqtFAg==" + }, + "meow": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", + "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "merge-deep": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz", + "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "dev": true + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dev": true, + "requires": { + "mime-db": "1.49.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.3.0.tgz", + "integrity": "sha512-uzWaOwC+gJrnKbr23J1ZRWx/Wd9W9Ce1mKPlsBGBV/r8zG7/G7oKMxGmxbI65pVGbae2cR7CUx9Ulk0HQt8BfQ==", + "dev": true, + "requires": { + "schema-utils": "^3.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.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 + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "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 + } + } + }, + "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" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "moo": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", + "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "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" + }, + "dependencies": { + "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 + }, + "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 + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node-releases": { + "version": "1.1.76", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", + "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "npm-package-json-lint": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-5.2.4.tgz", + "integrity": "sha512-ziN7r4qJg8+hwpUd8gMA0Xj5IHhawBQmNXizB5bYISc/YaidYqmghGI9ZApzr4Csrbi1o4aHNrSwTL5YJT8c8g==", + "dev": true, + "requires": { + "ajv": "^6.12.6", + "ajv-errors": "^1.0.1", + "chalk": "^4.1.2", + "cosmiconfig": "^6.0.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "ignore": "^5.1.8", + "is-plain-obj": "^3.0.0", + "jsonc-parser": "^2.3.1", + "log-symbols": "^4.1.0", + "meow": "^6.1.1", + "plur": "^4.0.0", + "semver": "^7.3.5", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "dev": true + } + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + } + } + }, + "object-filter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-filter/-/object-filter-1.0.2.tgz", + "integrity": "sha1-rwt5f/6+r4pSxmN87b6IFs/sG8g=", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "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.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "object.hasown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.0.0.tgz", + "integrity": "sha512-qYMF2CLIjxxLGleeM0jrcB4kiv3loGVAjKQKvH8pSU/i2VcRRvUNmxbD+nEMmrXRfORhuVJuH8OtSYCZoue3zA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.1" + } + }, + "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" + } + }, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "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 + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "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 + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "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-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "plur": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "dev": true, + "requires": { + "irregular-plurals": "^3.2.0" + } + }, + "popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "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 + }, + "postcss": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", + "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + } + }, + "postcss-calc": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz", + "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.0.tgz", + "integrity": "sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-convert-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz", + "integrity": "sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-discard-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", + "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "dev": true, + "requires": {} + }, + "postcss-discard-duplicates": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", + "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "dev": true, + "requires": {} + }, + "postcss-discard-empty": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", + "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "dev": true, + "requires": {} + }, + "postcss-discard-overridden": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", + "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", + "dev": true, + "requires": {} + }, + "postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", + "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", + "dev": true, + "requires": { + "htmlparser2": "^3.10.0" + }, + "dependencies": { + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + } + } + }, + "postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", + "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.1.tgz", + "integrity": "sha512-lBmJMvRh1D40dqpWKr9Rpygwxn8M74U9uaCSeYGNKLGInbk9mXBt1ultHf2dH9Ghk6Ue4UXlXWwGMH9QdUJ5ug==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "semver": "^7.3.5" + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, + "postcss-merge-longhand": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz", + "integrity": "sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==", + "dev": true, + "requires": { + "css-color-names": "^1.0.1", + "postcss-value-parser": "^4.1.0", + "stylehacks": "^5.0.1" + } + }, + "postcss-merge-rules": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz", + "integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^2.0.1", + "postcss-selector-parser": "^6.0.5", + "vendors": "^1.0.3" + } + }, + "postcss-minify-font-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz", + "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-minify-gradients": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.2.tgz", + "integrity": "sha512-7Do9JP+wqSD6Prittitt2zDLrfzP9pqKs2EcLX7HJYxsxCOwrrcLt4x/ctQTsiOw+/8HYotAoqNkrzItL19SdQ==", + "dev": true, + "requires": { + "colord": "^2.6", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-minify-params": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz", + "integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "browserslist": "^4.16.0", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz", + "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-normalize-charset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", + "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "dev": true, + "requires": {} + }, + "postcss-normalize-display-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz", + "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-positions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz", + "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz", + "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-string": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz", + "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz", + "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz", + "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-url": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz", + "integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==", + "dev": true, + "requires": { + "is-absolute-url": "^3.0.3", + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz", + "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-ordered-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", + "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-reduce-initial": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", + "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", + "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "requires": { + "postcss": "^7.0.26" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", + "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", + "dev": true, + "requires": { + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", + "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", + "dev": true, + "requires": { + "postcss": "^7.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.2.tgz", + "integrity": "sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0", + "svgo": "^2.3.0" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "svgo": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.6.1.tgz", + "integrity": "sha512-SDo274ymyG1jJ3HtCr3hkfwS8NqWdF0fMr6xPlrJ5y2QMofsQxIEFWgR1epwb197teKGgnZbzozxvJyIeJpE2Q==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "colorette": "^1.4.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "stable": "^0.1.8" + } + } + } + }, + "postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", + "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", + "dev": true, + "requires": {} + }, + "postcss-unique-selectors": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", + "integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "dev": true, + "peer": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "puppeteer-core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-10.2.0.tgz", + "integrity": "sha512-c1COxSnfynsE6Mtt+dW0t3TITjF9Ku4dnJbFMDDVhLQuMTYSpz4rkSP37qvzcSo3k02/Ac3GYWk0/ncp6DKZNA==", + "dev": true, + "requires": { + "debug": "4.3.1", + "devtools-protocol": "0.0.901419", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "node-fetch": "2.6.1", + "pkg-dir": "4.2.0", + "progress": "2.0.1", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.0.0", + "unbzip2-stream": "1.3.3", + "ws": "7.4.6" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", + "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "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" + } + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "requires": {} + } + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, + "requires": { + "performance-now": "^2.1.0" + } + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", + "dev": true, + "requires": { + "bytes": "1", + "string_decoder": "0.10" + }, + "dependencies": { + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "react-shallow-renderer": { + "version": "16.14.1", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz", + "integrity": "sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0" + } + }, + "react-test-renderer": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz", + "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "react-is": "^17.0.2", + "react-shallow-renderer": "^16.13.1", + "scheduler": "^0.20.2" + } + }, + "react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "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" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "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" + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regextras": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", + "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", + "dev": true + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "dev": true, + "requires": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + } + }, + "remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dev": true, + "requires": { + "mdast-util-from-markdown": "^0.8.0" + } + }, + "remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "dev": true, + "requires": { + "mdast-util-to-markdown": "^0.6.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "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 + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "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-bin": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/resolve-bin/-/resolve-bin-0.4.1.tgz", + "integrity": "sha512-cPOo/AQjgGONYhFbAcJd1+nuVHKs5NZ8K96Zb6mW+nDl55a7+ya9MWkeYuSMDv/S+YpksZ3EbeAnGWs5x04x8w==", + "dev": true, + "requires": { + "find-parent-dir": "~0.3.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "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 + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "requires": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", + "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==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.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" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "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" + } + } + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.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-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "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 + }, + "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" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "sass": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.0.tgz", + "integrity": "sha512-kcjxsemgaOnfl43oZgO/IePLvXQI0ZKzo0/xbCt6uyrg3FY/FF8hVK9YoO8GiZBcEG2Ebl79EKnUc+aiE4f2Vw==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz", + "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "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" + } + } + } + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "dev": true, + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true + } + } + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "peer": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.4.tgz", + "integrity": "sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==", + "dev": true + }, + "sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.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": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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" + } + } + } + }, + "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" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true + }, + "source-map-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", + "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "source-map-js": "^0.6.2" + } + }, + "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-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "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 + }, + "spawnd": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-4.4.0.tgz", + "integrity": "sha512-jLPOfB6QOEgMOQY15Z6+lwZEhH3F5ncXxIaZ7WHPIapwNNLyjrs61okj3VJ3K6tmP5TZ6cO0VAu9rEY4MD4YQg==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "signal-exit": "^3.0.2", + "tree-kill": "^1.2.2", + "wait-port": "^0.2.7" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", + "dev": true + }, + "specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "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.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + } + } + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trim": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz", + "integrity": "sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, + "styled-components": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.1.tgz", + "integrity": "sha512-JThv2JRzyH0NOIURrk9iskdxMSAAtCfj/b2Sf1WJaCUsloQkblepy1jaCLX/bYE+mhYo3unmwVSI9I5d9ncSiQ==", + "peer": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^0.8.8", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "peer": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "stylehacks": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", + "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "postcss-selector-parser": "^6.0.4" + } + }, + "stylelint": { + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz", + "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==", + "dev": true, + "requires": { + "@stylelint/postcss-css-in-js": "^0.37.2", + "@stylelint/postcss-markdown": "^0.36.2", + "autoprefixer": "^9.8.6", + "balanced-match": "^2.0.0", + "chalk": "^4.1.1", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "execall": "^2.0.0", + "fast-glob": "^3.2.5", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.0.3", + "globjoin": "^0.1.4", + "html-tags": "^3.1.0", + "ignore": "^5.1.8", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.21.0", + "lodash": "^4.17.21", + "log-symbols": "^4.1.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.4", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.35", + "postcss-html": "^0.36.0", + "postcss-less": "^3.1.4", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.2", + "postcss-sass": "^0.4.4", + "postcss-scss": "^2.1.1", + "postcss-selector-parser": "^6.0.5", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.1.0", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.2", + "strip-ansi": "^6.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^6.6.0", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^3.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "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 + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + } + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, + "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" + } + } + } + }, + "stylelint-config-recommended": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", + "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", + "dev": true, + "requires": {} + }, + "stylelint-config-recommended-scss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-4.3.0.tgz", + "integrity": "sha512-/noGjXlO8pJTr/Z3qGMoaRFK8n1BFfOqmAbX1RjTIcl4Yalr+LUb1zb9iQ7pRx1GsEBXOAm4g2z5/jou/pfMPg==", + "dev": true, + "requires": { + "stylelint-config-recommended": "^5.0.0" + }, + "dependencies": { + "stylelint-config-recommended": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-5.0.0.tgz", + "integrity": "sha512-c8aubuARSu5A3vEHLBeOSJt1udOdS+1iue7BmJDTSXoCBmfEQmmWX+59vYIj3NQdJBY6a/QRv1ozVFpaB9jaqA==", + "dev": true, + "requires": {} + } + } + }, + "stylelint-scss": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.21.0.tgz", + "integrity": "sha512-CMI2wSHL+XVlNExpauy/+DbUcB/oUZLARDtMIXkpV/5yd8nthzylYd1cdHeDMJVBXeYHldsnebUX6MoV5zPW4A==", + "dev": true, + "requires": { + "lodash": "^4.17.15", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "sugarss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.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" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "tannin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz", + "integrity": "sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==", + "requires": { + "@tannin/plural-forms": "^1.1.0" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "tar-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", + "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.8.0.tgz", + "integrity": "sha512-f0JH+6yMpneYcRJN314lZrSwu9eKkUFEHLN/kNy8ceh8gaRiLgFPJqrB9HsXjhEGdv4e/ekjTOFxIlL6xlma8A==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", + "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", + "dev": true, + "requires": { + "jest-worker": "^27.0.6", + "p-limit": "^3.1.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "dependencies": { + "jest-worker": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", + "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dev": true, + "requires": { + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.3.0", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "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" + } + }, + "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": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "dev": true + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unbzip2-stream": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + } + } + }, + "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" + } + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unist-util-find-all-after": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", + "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", + "dev": true, + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.2" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "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 + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "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 + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + } + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "wait-on": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz", + "integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.3", + "core-js": "^2.6.5", + "minimist": "^1.2.0", + "request": "^2.88.0", + "rx": "^4.1.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + } + } + }, + "wait-port": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.9.tgz", + "integrity": "sha512-hQ/cVKsNqGZ/UbZB/oakOGFqic00YAMM5/PEj3Bt4vKarv2jWIWzDbqlwT94qMs/exAQAsvMOq99sZblV92zxQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "commander": "^3.0.2", + "debug": "^4.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "webpack": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.53.0.tgz", + "integrity": "sha512-RZ1Z3z3ni44snoWjfWeHFyzvd9HMVYDYC5VXmlYUT6NWgEOWdCNpad5Fve2CzzHoRED7WtsKe+FCyP5Vk4pWiQ==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.7.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", + "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", + "dev": true, + "requires": {} + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "webpack-sources": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz", + "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==", + "dev": true + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", + "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", + "dev": true, + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^6.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.8.0.tgz", + "integrity": "sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.4", + "@webpack-cli/info": "^1.3.0", + "@webpack-cli/serve": "^1.5.2", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + } + } + }, + "webpack-livereload-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/webpack-livereload-plugin/-/webpack-livereload-plugin-3.0.2.tgz", + "integrity": "sha512-5JeZ2dgsvSNG+clrkD/u2sEiPcNk4qwCVZZmW8KpqKcNlkGv7IJjdVrq13+etAmMZYaCF1EGXdHkVFuLgP4zfw==", + "dev": true, + "requires": { + "anymatch": "^3.1.1", + "portfinder": "^1.0.17", + "schema-utils": ">1.0.0", + "tiny-lr": "^1.1.1" + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "dependencies": { + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.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 + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + } + } + }, + "webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + }, + "dependencies": { + "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" + } + } + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..18520c5 --- /dev/null +++ b/package.json @@ -0,0 +1,106 @@ +{ + "name": "@aivec/wp-phpdoc-parser", + "description": "WP-Parser is the parser for creating the new code reference at [developer.wordpress.org](https://developer.wordpress.org/reference). It parses the inline documentation and produces custom post type entries in WordPress.", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "lint": "eslint --ext .ts,.tsx src", + "lint:fix": "eslint --fix --ext .ts,.tsx src", + "format": "prettier --check \"src/**/*.{ts,tsx}\"", + "format:fix": "prettier --write \"src/**/*.{ts,tsx}\"", + "build:dev": "cross-env NODE_ENV=development wp-scripts build --config ./node_modules/@aivec/wp-typescript-react/src/configs/webpack.config.js", + "build:prod": "cross-env NODE_ENV=production wp-scripts build --config ./node_modules/@aivec/wp-typescript-react/src/configs/webpack.config.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/aivec/phpdoc-parser.git" + }, + "license": "GPL-2.0", + "bugs": { + "url": "https://github.com/aivec/phpdoc-parser/issues" + }, + "homepage": "https://github.com/aivec/phpdoc-parser#readme", + "dependencies": { + "@aivec/react-material-components": "^3.0.3", + "@aivec/reqres-utils": "^6.0.1", + "@material-ui/core": "^4.12.3", + "@material-ui/icons": "^4.11.2", + "@wordpress/i18n": "^4.2.2", + "axios": "^0.21.4" + }, + "devDependencies": { + "@aivec/wp-typescript-react": "^2.0.1", + "@types/react": "^17.0.22", + "@types/react-dom": "^17.0.9", + "@typescript-eslint/eslint-plugin": "^4.31.2", + "@typescript-eslint/parser": "^4.31.2", + "@wordpress/scripts": "^18.0.1", + "eslint": "^7.32.0", + "eslint-config-airbnb-typescript": "^14.0.0", + "eslint-config-prettier": "^8.3.0", + "eslint-import-resolver-typescript": "^2.5.0", + "eslint-plugin-import": "^2.24.2", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.25.3", + "eslint-plugin-react-hooks": "^4.2.0", + "typescript": "^4.4.3" + }, + "eslintIgnore": [ + "test/**/*.js" + ], + "eslintConfig": { + "plugins": [ + "prettier" + ], + "extends": [ + "airbnb-typescript", + "airbnb/hooks", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:prettier/recommended" + ], + "parserOptions": { + "project": "./tsconfig.json" + }, + "rules": { + "react/state-in-constructor": [ + 1, + "never" + ], + "react/jsx-wrap-multilines": [ + "error", + { + "declaration": false, + "assignment": false + } + ], + "prettier/prettier": "error", + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "default", + "format": [ + "camelCase", + "PascalCase", + "UPPER_CASE" + ], + "leadingUnderscore": "allow", + "trailingUnderscore": "allow" + } + ] + }, + "settings": { + "import/resolver": { + "typescript": {} + } + } + }, + "prettier": { + "printWidth": 100, + "tabWidth": 2, + "semi": true, + "singleQuote": true, + "trailingComma": "all" + } +} diff --git a/plugin.php b/plugin.php index 0ee7199..6ab7bf7 100644 --- a/plugin.php +++ b/plugin.php @@ -16,13 +16,15 @@ define('AVCPDP_LANG_DIR', __DIR__ . '/languages'); define('AVCPDP_PLUGIN_DIR', ABSPATH . 'wp-content/plugins/' . plugin_basename(dirname(__FILE__))); define('AVCPDP_PLUGIN_URL', site_url() . '/wp-content/plugins/' . plugin_basename(dirname(__FILE__))); +define('AVCPDP_DIST_DIR', AVCPDP_PLUGIN_DIR . '/dist'); +define('AVCPDP_DIST_URL', AVCPDP_PLUGIN_URL . '/dist'); load_plugin_textdomain('wp-parser', false, dirname(plugin_basename(__FILE__)) . '/languages'); if (file_exists(__DIR__ . '/vendor/autoload.php')) { require __DIR__ . '/vendor/autoload.php'; } -Aivec\Plugins\DocParser\Master::init(); +(new Aivec\Plugins\DocParser\Master())->init(); register_activation_hook(__FILE__, ['P2P_Storage', 'init']); register_activation_hook(__FILE__, ['P2P_Storage', 'install']); diff --git a/src/API/Commands.php b/src/API/Commands.php new file mode 100644 index 0000000..2304416 --- /dev/null +++ b/src/API/Commands.php @@ -0,0 +1,184 @@ +_get_phpdoc_data($directory, 'array'); + $data = [ + 'config' => new ImportConfig( + $parser_meta['type'], + $parser_meta['name'], + $version, + $exclude, + $exclude_strict + ), + 'trash_old_refs' => $trashOldRefs, + 'files' => $data, + ]; + + // Import data + $this->_do_import($data, isset($quick), isset($importInternal)); + } + + /** + * Generate the data from the PHPDoc markup. + * + * @param string $path Directory or file to scan for PHPDoc + * @param string $format What format the data is returned in: [json|array]. + * @throws CliErrorException Thrown when an error occurs. + * @return string|array + */ + protected function _get_phpdoc_data($path, $format = 'json') { + do_action('avcpdp_command_print_line', sprintf('Extracting PHPDoc from %1$s. This may take a few minutes...', $path)); + $is_file = is_file($path); + $files = $is_file ? [$path] : Parser::getWpFiles($path); + $path = $is_file ? dirname($path) : $path; + + if ($files instanceof \WP_Error) { + throw new CliErrorException(sprintf('Problem with %1$s: %2$s', $path, $files->get_error_message()), 1); + } + + $output = Parser::parseFiles($files, $path); + + if ('json' == $format) { + return json_encode($output, JSON_PRETTY_PRINT); + } + + return $output; + } + + /** + * Import the PHPDoc $data into WordPress posts and taxonomies + * + * @param array $data + * @param bool $skip_sleep If true, the sleep() calls are skipped. + * @param bool $import_ignored If true, functions marked `@ignore` will be imported. + * @throws CliErrorException Thrown when an error occurs. + * @return void + */ + protected function _do_import(array $data, $skip_sleep = false, $import_ignored = false) { + if (!wp_get_current_user()->exists()) { + throw new CliErrorException('Please specify a valid user: --user=', 1); + } + + // Run the importer + $importer = new Importer($data['config'], $data['trash_old_refs']); + $importer->setLogger(new Logger()); + $importer->import($data['files'], $skip_sleep, $import_ignored); + + do_action('avcpdp_command_print_line', ''); + } +} diff --git a/src/CLI/CliErrorException.php b/src/CLI/CliErrorException.php new file mode 100644 index 0000000..d73f59e --- /dev/null +++ b/src/CLI/CliErrorException.php @@ -0,0 +1,42 @@ + + * @param string $message + * @param int $code + * @param bool $exit + * @return void + */ + public function __construct($message = '', $code = 0, $exit = true) { + $this->exit = $exit; + parent::__construct($message, $code); + } + + /** + * Getter for `$this->exit` + * + * @author Evan D Shaw + * @return true + */ + public function getExit() { + return $this->exit; + } +} diff --git a/src/CLI/Commands.php b/src/CLI/Commands.php index 775370c..73eaef4 100644 --- a/src/CLI/Commands.php +++ b/src/CLI/Commands.php @@ -4,7 +4,7 @@ use Aivec\Plugins\DocParser\Importer\Importer; use Aivec\Plugins\DocParser\Importer\Parser; -use Aivec\Plugins\DocParser\Models\ImportConfig; +use Aivec\Plugins\DocParser\API\Commands as API; use WP_CLI; use WP_CLI_Command; @@ -89,122 +89,17 @@ public function create($args, $assoc_args) { list( $directory ) = $args; $directory = realpath($directory); - if (empty($directory)) { - WP_CLI::error(sprintf("Can't read %1\$s. Does the file exist?", $directory)); - exit; - } - - WP_CLI::line(); - - $parser_meta_filen = 'docparser-meta.json'; - $parser_meta_filep = ''; - if ($directory === '.') { - $parser_meta_filep = "./{$parser_meta_filen}"; - } else { - $parser_meta_filep = "{$directory}/{$parser_meta_filen}"; - } + add_action('avcpdp_command_print_line', function ($message) { + WP_CLI::line($message); + }, 10, 1); - WP_CLI::line(sprintf('Getting source meta data from %1$s', $parser_meta_filep)); - - if (!file_exists($parser_meta_filep)) { - WP_CLI::error(sprintf('Missing required file: %1$s', $parser_meta_filep)); + $trashOldRefs = isset($assoc_args['trash-old-refs']) && $assoc_args['trash-old-refs'] === true; + try { + (new API())->create($directory, $trashOldRefs, $assoc_args['quick'], $assoc_args['import-internal']); + } catch (CliErrorException $e) { + WP_CLI::error($e->getMessage()); exit; } - - $metaf = file_get_contents($parser_meta_filep); - if (empty($metaf)) { - WP_CLI::error(sprintf("Can't read %1\$s. Possible permissions error.", $parser_meta_filep)); - exit; - } - - $parser_meta = json_decode($metaf, true); - if ($parser_meta === null) { - WP_CLI::error(sprintf( - '%1$s is malformed. Make sure the file is in proper JSON format.', - $parser_meta_filen - )); - exit; - } - - $types = ['plugin', 'theme', 'composer-packages']; - $validtypesm = 'Valid types are "plugin", "theme", and "composer-package"'; - if (empty($parser_meta['type'])) { - WP_CLI::error('The "type" key is missing.', false); - WP_CLI::log($validtypesm); - exit; - } - - if (!in_array($parser_meta['type'], $types, true)) { - WP_CLI::error($validtypesm); - exit; - } - - if (empty($parser_meta['name'])) { - WP_CLI::error('The "name" key is missing or contains an empty value.'); - exit; - } - - if (!is_string($parser_meta['name'])) { - WP_CLI::error('"name" must be a string.'); - exit; - } - - if (isset($parser_meta['exclude'])) { - if (!is_array($parser_meta['exclude'])) { - WP_CLI::error('"exclude" must be an array of strings.'); - exit; - } - - foreach ($parser_meta['exclude'] as $target) { - if (!is_string($target)) { - WP_CLI::error('"exclude" must be an array of strings.'); - exit; - } - } - } - - if (isset($parser_meta['excludeStrict'])) { - if (!is_bool($parser_meta['excludeStrict'])) { - WP_CLI::error('"excludeStrict" must be a boolean.'); - exit; - } - } - - if (isset($parser_meta['version'])) { - if (!is_string($parser_meta['version'])) { - WP_CLI::error('"version" must be a string.'); - exit; - } - } - - // handle file/folder exclusions - $exclude = !empty($parser_meta['exclude']) ? $parser_meta['exclude'] : []; - add_filter('wp_parser_exclude_directories', function () use ($exclude) { - return $exclude; - }); - - $exclude_strict = isset($parser_meta['excludeStrict']) ? (bool)$parser_meta['excludeStrict'] : false; - add_filter('wp_parser_exclude_directories_strict', function () use ($exclude_strict) { - return $exclude_strict; - }); - - $version = isset($parser_meta['version']) ? $parser_meta['version'] : null; - - $data = $this->_get_phpdoc_data($directory, 'array'); - $data = [ - 'config' => new ImportConfig( - $parser_meta['type'], - $parser_meta['name'], - $version, - $exclude, - $exclude_strict - ), - 'trash_old_refs' => isset($assoc_args['trash-old-refs']) && $assoc_args['trash-old-refs'] === true, - 'files' => $data, - ]; - - // Import data - $this->_do_import($data, isset($assoc_args['quick']), isset($assoc_args['import-internal'])); } /** @@ -251,7 +146,13 @@ protected function _do_import(array $data, $skip_sleep = false, $import_ignored // Run the importer $importer = new Importer($data['config'], $data['trash_old_refs']); $importer->setLogger(new Logger()); - $importer->import($data['files'], $skip_sleep, $import_ignored); + + try { + $importer->import($data['files'], $skip_sleep, $import_ignored); + } catch (CliErrorException $e) { + WP_CLI::error($e->getMessage()); + exit; + } WP_CLI::line(); } diff --git a/src/CLI/Logger.php b/src/CLI/Logger.php index feb67be..5dfef67 100644 --- a/src/CLI/Logger.php +++ b/src/CLI/Logger.php @@ -4,6 +4,7 @@ use Psr\Log\AbstractLogger; use Psr\Log\LogLevel; +use WP_CLI\Loggers\Execution; /** * PSR-3 logger for WP CLI. @@ -28,7 +29,7 @@ public function log($level, $message, array $context = []) { case LogLevel::ALERT: case LogLevel::EMERGENCY: case LogLevel::CRITICAL: - \WP_CLI::error($message); + \WP_CLI::error($message, false); break; default: diff --git a/src/ErrorStore.php b/src/ErrorStore.php new file mode 100644 index 0000000..14ccb3b --- /dev/null +++ b/src/ErrorStore.php @@ -0,0 +1,61 @@ + + * @return void + */ + public function populate() { + $this->addError(new GenericError( + self::REQUIRED_FIELDS_MISSING, + $this->getConstantNameByValue(self::REQUIRED_FIELDS_MISSING), + 400, + function ($field) { + // translators: name of the missing field + return sprintf(__('"%s" is required', 'wp-parser'), $field); + }, + function ($message) { + return $message; + } + )); + + $em = function ($name) { + // translators: name of the plugin/theme/composer-package + return sprintf(__('"%s" does not exist', 'wp-parser'), $name); + }; + $this->addError(new GenericError( + self::SOURCE_NOT_FOUND, + $this->getConstantNameByValue(self::SOURCE_NOT_FOUND), + 404, + $em, + $em + )); + + $this->addError(new GenericError( + self::IMPORT_ERROR, + $this->getConstantNameByValue(self::IMPORT_ERROR), + 422, + function ($message) { + return $message; + }, + function ($message) { + return $message; + } + )); + } +} diff --git a/src/Importer/Importer.php b/src/Importer/Importer.php index 7dc85ab..188ec62 100644 --- a/src/Importer/Importer.php +++ b/src/Importer/Importer.php @@ -2,6 +2,7 @@ namespace Aivec\Plugins\DocParser\Importer; +use Aivec\Plugins\DocParser\CLI\CliErrorException; use Aivec\Plugins\DocParser\Models\ImportConfig; use Aivec\Plugins\DocParser\Registrations; use Psr\Log\LoggerAwareInterface; @@ -202,26 +203,29 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio // Sanity check -- do the required post types exist? if (!post_type_exists($this->post_type_class) || !post_type_exists($this->post_type_function) || !post_type_exists($this->post_type_hook)) { - $this->logger->error(sprintf('Missing post type; check that "%1$s", "%2$s", and "%3$s" are registered.', $this->post_type_class, $this->post_type_function, $this->post_type_hook)); - exit; + $error = sprintf('Missing post type; check that "%1$s", "%2$s", and "%3$s" are registered.', $this->post_type_class, $this->post_type_function, $this->post_type_hook); + $this->logger->error($error); + throw new CliErrorException($error, 1); } // Sanity check -- do the required taxonomies exist? foreach (['taxonomy_file', 'taxonomy_since_version', 'taxonomy_package', 'taxonomy_source_type'] as $taxonomy_name) { if (!taxonomy_exists($this->{$taxonomy_name})) { - $this->logger->error(sprintf('Missing taxonomy; check that "%1$s" is registered.', $this->{$taxonomy_name})); - exit; + $error = sprintf('Missing taxonomy; check that "%1$s" is registered.', $this->{$taxonomy_name}); + $this->logger->error($error); + throw new CliErrorException($error, 1); } } // Sanity check -- make sure `wp-parser-source-type` default terms exist foreach (['plugin', 'theme', 'composer-package'] as $term_slug) { if (!term_exists($term_slug, $this->taxonomy_source_type)) { - $this->logger->error(sprintf( + $error = sprintf( "Missing term for {$this->taxonomy_source_type}; check that '%1\$s' is registered.", $term_slug - )); - exit; + ); + $this->logger->error($error); + throw new CliErrorException($error, 1); } } @@ -233,11 +237,12 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio 'taxonomy' => $this->taxonomy_source_type, ]); if (empty($parent_term) || ($parent_term instanceof \WP_Error)) { - $this->logger->error(sprintf( + $error = sprintf( "Missing term for {$this->taxonomy_source_type}; check that '%1\$s' is registered.", $this->source_type_meta['type'] - )); - exit; + ); + $this->logger->error($error); + throw new CliErrorException($error, 1); } $parent_term_id = $parent_term[0]; @@ -251,8 +256,9 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio 'taxonomy' => $this->taxonomy_source_type, ]); if ($source_type_term instanceof \WP_Error) { - $this->logger->error("An error occured getting the {$this->source_type_meta['name']} term."); - exit; + $error = "An error occured getting the {$this->source_type_meta['name']} term."; + $this->logger->error($error); + throw new CliErrorException($error, 1); } if (empty($source_type_term)) { $source_type_term = wp_insert_term( @@ -262,17 +268,19 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio ); if ($source_type_term instanceof \WP_Error) { - $this->logger->error(sprintf( + $error = sprintf( "Failed creating child term {$this->source_type_meta['name']}; check that the parent term '%1\$s' is registered.", $this->source_type_meta['type'] - )); - exit; + ); + $this->logger->error($error); + throw new CliErrorException($error, 1); } $source_term_id = $source_type_term['term_id']; } else { $source_term_id = $source_type_term[0]; } + return; // Set term data so we can create relationships later $this->source_type_meta['type_term_id'] = $source_term_id; $this->source_type_meta['type_parent_term_id'] = $parent_term_id; diff --git a/src/Master.php b/src/Master.php index 72ce451..ab4f9c1 100644 --- a/src/Master.php +++ b/src/Master.php @@ -7,17 +7,41 @@ */ class Master { + const REACT_DOM_NODE = 'avcpdp_react'; + + /** + * Error store object + * + * @var ErrorStore + */ + public $estore; + + /** + * Routes object + * + * @var Routes + */ + public $routes; + /** * Initializes plugin * * @author Evan D Shaw * @return void */ - public static function init() { + public function init() { if (defined('WP_CLI') && WP_CLI) { \WP_CLI::add_command('parser', __NAMESPACE__ . '\\CLI\\Commands'); } + $this->estore = new ErrorStore(); + $this->estore->populate(); + add_action('init', function () { + $this->routes = new Routes($this); + $this->routes->dispatcher->listen(); + }, 12); + + (new Views\ImporterPage\ImporterPage($this))->init(); (new Importer\Relationships())->init(); (new Registrations())->init(); (new Explanations\Explanations())->init(); @@ -29,4 +53,18 @@ public static function init() { Admin::init(); } } + + /** + * Returns variables to be injected into JS scripts + * + * @author Evan D Shaw + * @return array + */ + public function getScriptInjectionVariables() { + return array_merge( + ['reactDomNode' => self::REACT_DOM_NODE], + $this->estore->getScriptInjectionVariables(), + $this->routes->getScriptInjectionVariables() + ); + } } diff --git a/src/REST/Import.php b/src/REST/Import.php new file mode 100644 index 0000000..f500e05 --- /dev/null +++ b/src/REST/Import.php @@ -0,0 +1,93 @@ + + * @param Master $master + * @return void + */ + public function __construct(Master $master) { + $this->master = $master; + } + + /** + * Imports source code + * + * Mirror of the `create` command for `wp parser` + * + * @author Evan D Shaw + * @param array $args + * @param array $payload + * @return GenericError|string + */ + public function create(array $args, array $payload) { + $fpath = ImporterPage::getSettings()['sourceFoldersAbspath']; + $fname = $args['fname']; + $fullpath = trailingslashit($fpath) . trim($fname, '/'); + if (!is_dir($fullpath)) { + return $this->master->estore->getErrorResponse( + ErrorStore::SOURCE_NOT_FOUND, + [$fullpath], + [$fullpath] + ); + } + + $trashOldRefs = isset($assoc_args['trashOldRefs']) && $assoc_args['trashOldRefs'] === true; + + $settings = ImporterPage::getSettings(); + try { + $execution_logger = new Execution(true); + $execution_logger->ob_start(); + \WP_CLI::set_logger($execution_logger); + (new API())->create($fullpath, $trashOldRefs); + $execution_logger->ob_end(); + $stdout = $execution_logger->stdout; + $stderr = $execution_logger->stderr; + $settings['importOutput'] = $stdout; + } catch (Exception $e) { + ob_clean(); + return $this->master->estore->getErrorResponse( + ErrorStore::IMPORT_ERROR, + [$e->getMessage()], + [$e->getMessage()] + ); + } + + return 'success'; + } + + public function status(array $args) { + $status = get_option(self::STATUS_TRACKER, [ + 'status' => '', + 'fulloutput' => '', + ]); + + return $status; + } +} diff --git a/src/REST/Settings.php b/src/REST/Settings.php new file mode 100644 index 0000000..e85f680 --- /dev/null +++ b/src/REST/Settings.php @@ -0,0 +1,60 @@ + + * @param Master $master + * @return void + */ + public function __construct(Master $master) { + $this->master = $master; + } + + /** + * Updates the absolute path to the folder containing source folders to be imported + * + * @author Evan D Shaw + * @param array $args + * @param array $payload + * @return GenericError|string `success` on success + */ + public function updateSourceFoldersAbspath(array $args, array $payload) { + $path = !empty($payload['path']) ? (string)$payload['path'] : ''; + if (empty($path)) { + return $this->master->estore->getErrorResponse( + ErrorStore::REQUIRED_FIELDS_MISSING, + ['path'], + [__('Path cannot be empty.', 'cptmp')] + ); + } + + $settings = ImporterPage::getSettings(); + $settings['sourceFoldersAbspath'] = $path; + $res = update_option(ImporterPage::OPTIONS_KEY, $settings); + if ($res === false) { + return $this->master->estore->getErrorResponse(ErrorStore::INTERNAL_SERVER_ERROR); + } + + return 'success'; + } +} diff --git a/src/Routes.php b/src/Routes.php new file mode 100644 index 0000000..efe6049 --- /dev/null +++ b/src/Routes.php @@ -0,0 +1,50 @@ + + * @param Master $master + * @return void + */ + public function __construct(Master $master) { + $this->master = $master; + parent::__construct('/avcpdp', 'avcpdp_nonce_key', 'avcpdp_nonce_name'); + } + + /** + * Declares routes + * + * @author Evan D Shaw + * @param WordPressRouteCollector $r + * @return void + */ + public function declareRoutes(WordPressRouteCollector $r) { + $r->addGroup('/v1', function (WordPressRouteCollector $r) { + // REST handlers + $settings = new REST\Settings($this->master); + $import = new REST\Import($this->master); + + // REST routes + $r->addAdministratorRoute('POST', '/updateSourceFoldersAbspath', [$settings, 'updateSourceFoldersAbspath']); + $r->addAdministratorRoute('POST', '/parser/create/{fname}', [$import, 'create']); + }); + } +} diff --git a/src/SourceTypeTerm.php b/src/SourceTypeTerm.php index 5fd68fe..89980f9 100644 --- a/src/SourceTypeTerm.php +++ b/src/SourceTypeTerm.php @@ -41,6 +41,7 @@ public static function addFormAttributeEncTypeMultiPart() { * Adds item image pick field to term edit page * * @author Seiyu Inoue + * @param \WP_Term $term * @return void */ public static function addFieldsItemImage($term) { @@ -175,7 +176,7 @@ public static function generateSvgAttachmentMetaData($metadata, $attachment_id) // get the path relative to /uploads/ - found no better way: $relative_path = str_replace($upload_dir['basedir'], '', $svg_path); $filename = basename($svg_path); - $dimensions = $this->getSvgDimensions($svg_path); + $dimensions = self::getSvgDimensions($svg_path); $metadata = [ 'width' => intval($dimensions->width), 'height' => intval($dimensions->height), @@ -218,7 +219,7 @@ public static function response4Svg($response, $attachment) { $svg_path = get_attached_file($attachment->ID); // If SVG is external, use the URL instead of the path $svg_path = file_exists($svg_path) ?: $response['url']; - $dimensions = $this->getSvgDimensions($svg_path); + $dimensions = self::getSvgDimensions($svg_path); $response['sizes'] = [ 'full' => [ 'url' => $response['url'], diff --git a/src/Types/Injected.ts b/src/Types/Injected.ts new file mode 100644 index 0000000..791c40f --- /dev/null +++ b/src/Types/Injected.ts @@ -0,0 +1,5 @@ +import { InjectedErrorObjects, InjectedRouterVariables } from '@aivec/reqres-utils'; + +export interface InjectedVars extends InjectedErrorObjects, InjectedRouterVariables { + reactDomNode: string; +} diff --git a/src/Types/globals.d.ts b/src/Types/globals.d.ts new file mode 100644 index 0000000..8ce7975 --- /dev/null +++ b/src/Types/globals.d.ts @@ -0,0 +1,5 @@ +declare module 'injected-vars' { + global { + const avcpdp: { [key: string]: any } | any[]; + } +} diff --git a/src/Views/ImporterPage/App.tsx b/src/Views/ImporterPage/App.tsx new file mode 100644 index 0000000..f4aa552 --- /dev/null +++ b/src/Views/ImporterPage/App.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { render } from 'react-dom'; +import { InjectedVars } from 'src/Types/Injected'; +import App from './ImporterPage'; + +const { reactDomNode } = avcpdp as InjectedVars; + +document.addEventListener('DOMContentLoaded', () => + render(, document.querySelector(`#${reactDomNode}`)), +); diff --git a/src/Views/ImporterPage/Import.tsx b/src/Views/ImporterPage/Import.tsx new file mode 100644 index 0000000..9b8c65d --- /dev/null +++ b/src/Views/ImporterPage/Import.tsx @@ -0,0 +1,94 @@ +import React, { useState } from 'react'; +import axios from 'axios'; +import { __ } from '@wordpress/i18n'; +import { CustomSnackbarProps } from '@aivec/react-material-components/Snackbar'; +import { createErrorMessage, createRequestBody } from '@aivec/reqres-utils'; +import { InjectedSettings } from './Types'; + +const { endpoint, importOutput } = avcpdp as InjectedSettings; + +const Import = ({ + setSnackbar, + closeSnackbar, +}: { + setSnackbar: (props: CustomSnackbarProps) => void; + closeSnackbar: () => void; +}): JSX.Element => { + const [loading, setLoading] = useState(false); + const [fname, setFolderName] = useState(''); + const [trashOldRefs, setTrashOldRefs] = useState(true); + const [output, setOutput] = useState(importOutput); + + const updateFolderName = (event: React.ChangeEvent): void => { + setFolderName(String(event.target.value)); + }; + + const updateTrashOldRefs = (event: React.ChangeEvent): void => { + setTrashOldRefs(event.target.checked); + }; + + const updateOutput = (out: string): void => { + setOutput(out); + }; + + const create = async (): Promise => { + closeSnackbar(); + setLoading(true); + try { + const { data }: { data: string } = await axios.post( + `${endpoint}/v1/parser/create/${fname}`, + createRequestBody(avcpdp as InjectedSettings, { trashOldRefs }), + ); + updateOutput(data); + } catch (error) { + const message = String(createErrorMessage(avcpdp as InjectedSettings, error)); + setSnackbar({ open: true, type: 'error', message }); + setLoading(false); + } + }; + + return ( +
    +

    {__('Import', 'wp-parser')}

    +
    +
    {__('Enter the folder name of the plugin/theme/composer-package', 'wp-parser')}
    +
    + +
    +
    + +
    +
    + {!fname ? ( + + ) : loading ? ( + + ) : ( + + )} +
    + {output && ( +
    +
    {output}
    +
    + )} +
    +
    + ); +}; + +export default Import; diff --git a/src/Views/ImporterPage/ImporterPage.php b/src/Views/ImporterPage/ImporterPage.php new file mode 100644 index 0000000..0998d04 --- /dev/null +++ b/src/Views/ImporterPage/ImporterPage.php @@ -0,0 +1,147 @@ + + * @param Master $master + * @return void + */ + public function __construct(Master $master) { + $this->master = $master; + } + + /** + * Registers hooks + * + * @author Evan D Shaw + * @return void + */ + public function init() { + add_action('admin_menu', [get_class(), 'registerSettingsPage']); + add_action('admin_init', [get_class(), 'registerSetting']); + add_action('admin_enqueue_scripts', [$this, 'load'], 10, 1); + } + + /** + * Loads settings page assets + * + * @author Evan D Shaw + * @param string $hook_suffix + * @return void + */ + public function load($hook_suffix) { + if ($hook_suffix !== 'settings_page_' . self::PAGE) { + return; + } + + $assetsmap = include(AVCPDP_DIST_DIR . '/js/Views/ImporterPage/App.asset.php'); + wp_enqueue_script( + self::PAGE, + AVCPDP_DIST_URL . '/js/Views/ImporterPage/App.js', + $assetsmap['dependencies'], + $assetsmap['version'], + true + ); + + PluginLoader::loadCoreCss(); + wp_enqueue_style( + 'avcpdp-importer-page', + AVCPDP_PLUGIN_URL . '/src/Views/ImporterPage/importer-page.css', + [], + AVCPDP_VERSION + ); + + wp_set_script_translations(self::PAGE, 'wp-parser', AVCPDP_LANG_DIR); + wp_localize_script( + self::PAGE, + 'avcpdp', + array_merge( + self::getSettings(), + $this->master->getScriptInjectionVariables() + ) + ); + } + + /** + * Returns settings array + * + * @author Evan D Shaw + * @return array + */ + public static function getSettings() { + $settings = get_option(self::OPTIONS_KEY, [ + 'sourceFoldersAbspath' => ABSPATH, + 'importOutput' => '', + ]); + return $settings; + } + + /** + * Registers `avcpdp_settings` option name + * + * @author Evan D Shaw + * @return void + */ + public static function registerSetting() { + register_setting(self::PAGE, self::OPTIONS_KEY); + } + + /** + * Adds settings page + * + * @author Evan D Shaw + * @return void + */ + public static function registerSettingsPage() { + add_options_page( + 'AVC WP Parser Importer', + 'AVC WP Parser Importer', + 'manage_options', + self::PAGE, + [get_class(), 'addSettingsPage'] + ); + } + + /** + * Adds `AVC WP Parser Importer` page + * + * @author Evan D Shaw + * @return void + */ + public static function addSettingsPage() { + if (!current_user_can('manage_options')) { + wp_die(__('You do not have sufficient permissions to access this page.')); + } + + ?> +
    +

    +
    +
    + { + const [snackbar, setOurSnackbar] = useState(initialSnackbarProps); + + const setSnackbar = (props: CustomSnackbarProps): void => { + setOurSnackbar({ ...snackbar, ...props }); + }; + + const closeSnackbar = (): void => { + setOurSnackbar({ ...snackbar, open: false }); + }; + + return ( + <> + +
    + + + + ); +}; + +export default ImporterPage; diff --git a/src/Views/ImporterPage/Settings.tsx b/src/Views/ImporterPage/Settings.tsx new file mode 100644 index 0000000..57545d5 --- /dev/null +++ b/src/Views/ImporterPage/Settings.tsx @@ -0,0 +1,72 @@ +import React, { useState } from 'react'; +import axios from 'axios'; +import { __ } from '@wordpress/i18n'; +import { CustomSnackbarProps } from '@aivec/react-material-components/Snackbar'; +import { createErrorMessage, createRequestBody } from '@aivec/reqres-utils'; +import { InjectedSettings } from './Types'; + +const { endpoint, sourceFoldersAbspath } = avcpdp as InjectedSettings; + +const UpdateServerFolderLocation = ({ + setSnackbar, + closeSnackbar, +}: { + setSnackbar: (props: CustomSnackbarProps) => void; + closeSnackbar: () => void; +}): JSX.Element => { + const [loading, setLoading] = useState(false); + const [path, setFolderPath] = useState(sourceFoldersAbspath); + + const set = (event: React.ChangeEvent): void => { + setFolderPath(String(event.target.value)); + }; + + const update = async (): Promise => { + closeSnackbar(); + setLoading(true); + try { + const { data }: { data: string } = await axios.post( + `${endpoint}/v1/updateSourceFoldersAbspath`, + createRequestBody(avcpdp as InjectedSettings, { path }), + ); + if (data !== 'success') { + throw new Error(); + } + setSnackbar({ + open: true, + type: 'success', + message: __('Updated', 'wp-parser'), + }); + } catch (error) { + const message = String(createErrorMessage(avcpdp as InjectedSettings, error)); + setSnackbar({ open: true, type: 'error', message }); + } finally { + setLoading(false); + } + }; + + return ( +
    +

    {__('Source folders parent path', 'wp-parser')}

    +
    +
    + {__('Enter the absolute path to the location of the source folders', 'wp-parser')} +
    + +
    + {loading ? ( + + ) : ( + + )} +
    +
    +
    + ); +}; + +export default UpdateServerFolderLocation; diff --git a/src/Views/ImporterPage/Types.ts b/src/Views/ImporterPage/Types.ts new file mode 100644 index 0000000..c2f4051 --- /dev/null +++ b/src/Views/ImporterPage/Types.ts @@ -0,0 +1,6 @@ +import { InjectedVars } from 'src/Types/Injected'; + +export interface InjectedSettings extends InjectedVars { + sourceFoldersAbspath: string; + importOutput: string; +} diff --git a/src/Views/ImporterPage/importer-page.css b/src/Views/ImporterPage/importer-page.css new file mode 100644 index 0000000..e93ca95 --- /dev/null +++ b/src/Views/ImporterPage/importer-page.css @@ -0,0 +1,5 @@ +.output-container { + max-height: 200px; + overflow-y: scroll; + overflow-x: hidden; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..4794b98 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,35 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "noFallthroughCasesInSwitch": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "esModuleInterop": true, + "noUnusedLocals": true, + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "moduleResolution": "node", + "declarationDir": "dist/types", + "declaration": true, + "target": "es6", + "module": "es6", + "jsx": "react", + "strict": true, + "baseUrl": ".", + "paths": { + "src/*": [ + "src/*" + ] + } + }, + "exclude": [ + "node_modules", + "dist", + "webpack.config.js" + ], + "include": [ + "src/**/*.ts", + "src/**/*.tsx" + ] +} \ No newline at end of file From fd13540f9ac51a0445d2087255cceb4be005e530 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 22 Sep 2021 13:08:25 +0900 Subject: [PATCH 35/66] feat: finish frontend import feature --- src/Importer/Importer.php | 1 - src/REST/Import.php | 28 +++++++++--------------- src/Views/ImporterPage/Import.tsx | 1 + src/Views/ImporterPage/importer-page.css | 13 +++++++++-- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/Importer/Importer.php b/src/Importer/Importer.php index 188ec62..6fa594a 100644 --- a/src/Importer/Importer.php +++ b/src/Importer/Importer.php @@ -280,7 +280,6 @@ public function import(array $data, $skip_sleep = false, $import_ignored_functio $source_term_id = $source_type_term[0]; } - return; // Set term data so we can create relationships later $this->source_type_meta['type_term_id'] = $source_term_id; $this->source_type_meta['type_parent_term_id'] = $parent_term_id; diff --git a/src/REST/Import.php b/src/REST/Import.php index f500e05..033f9fa 100644 --- a/src/REST/Import.php +++ b/src/REST/Import.php @@ -4,20 +4,18 @@ use Aivec\Plugins\DocParser\API\Commands as API; use Aivec\Plugins\DocParser\ErrorStore; +use Aivec\Plugins\DocParser\Importer\Relationships; use Aivec\Plugins\DocParser\Master; use Aivec\Plugins\DocParser\Views\ImporterPage\ImporterPage; use AVCPDP\Aivec\ResponseHandler\GenericError; -use Exception; use WP_CLI\Loggers\Execution; -use WP_CLI\Loggers\Regular; +use Exception; /** * REST handler for importing source code */ class Import { - const STATUS_TRACKER = 'avcpdp_importer_status'; - /** * Master object * @@ -58,10 +56,13 @@ public function create(array $args, array $payload) { ); } - $trashOldRefs = isset($assoc_args['trashOldRefs']) && $assoc_args['trashOldRefs'] === true; + $trashOldRefs = isset($payload['trashOldRefs']) && $payload['trashOldRefs'] === true; - $settings = ImporterPage::getSettings(); + $res = ''; try { + $relationships = new Relationships(); + $relationships->requirePostsToPosts(); + $relationships->registerPostRelationships(); $execution_logger = new Execution(true); $execution_logger->ob_start(); \WP_CLI::set_logger($execution_logger); @@ -69,9 +70,9 @@ public function create(array $args, array $payload) { $execution_logger->ob_end(); $stdout = $execution_logger->stdout; $stderr = $execution_logger->stderr; - $settings['importOutput'] = $stdout; + $res = $stdout . $stderr; } catch (Exception $e) { - ob_clean(); + ob_end_flush(); return $this->master->estore->getErrorResponse( ErrorStore::IMPORT_ERROR, [$e->getMessage()], @@ -79,15 +80,6 @@ public function create(array $args, array $payload) { ); } - return 'success'; - } - - public function status(array $args) { - $status = get_option(self::STATUS_TRACKER, [ - 'status' => '', - 'fulloutput' => '', - ]); - - return $status; + return $res; } } diff --git a/src/Views/ImporterPage/Import.tsx b/src/Views/ImporterPage/Import.tsx index 9b8c65d..7ff9ca6 100644 --- a/src/Views/ImporterPage/Import.tsx +++ b/src/Views/ImporterPage/Import.tsx @@ -43,6 +43,7 @@ const Import = ({ } catch (error) { const message = String(createErrorMessage(avcpdp as InjectedSettings, error)); setSnackbar({ open: true, type: 'error', message }); + } finally { setLoading(false); } }; diff --git a/src/Views/ImporterPage/importer-page.css b/src/Views/ImporterPage/importer-page.css index e93ca95..07251f5 100644 --- a/src/Views/ImporterPage/importer-page.css +++ b/src/Views/ImporterPage/importer-page.css @@ -1,5 +1,14 @@ .output-container { - max-height: 200px; + padding-left: 5px; + max-height: 400px; overflow-y: scroll; - overflow-x: hidden; + overflow-x: scroll; + display: flex; + flex-flow: column-reverse; + background-color: white; +} + +.output-container pre { + margin-top: 5px; + margin-bottom: 5px; } From e08c0357e0621f9761434f64c5a5f1b38ee60e23 Mon Sep 17 00:00:00 2001 From: Seiyu Inoue Date: Tue, 28 Sep 2021 19:06:47 +0900 Subject: [PATCH 36/66] posts added filter --- src/Master.php | 1 + src/PostsPluginFilter.php | 90 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 src/PostsPluginFilter.php diff --git a/src/Master.php b/src/Master.php index 72ce451..4314e75 100644 --- a/src/Master.php +++ b/src/Master.php @@ -25,6 +25,7 @@ public static function init() { Queries::init(); Formatting::init(); SourceTypeTerm::init(); + PostsPluginFilter::init(); if (is_admin()) { Admin::init(); } diff --git a/src/PostsPluginFilter.php b/src/PostsPluginFilter.php new file mode 100644 index 0000000..9204788 --- /dev/null +++ b/src/PostsPluginFilter.php @@ -0,0 +1,90 @@ + + * @return void + */ + public static function init() { + add_action('restrict_manage_posts', [get_class(), 'addSourceTypePluginFilter'], 10, 1); + add_filter('query_vars', [get_class(), 'addSourceTypePlugin'], 10, 1); + add_filter('posts_where', [get_class(), 'postsWhereSourceTypePlugin'], 10, 1); + } + + /** + * Adds form attribute to term edit page + * + * @author Seiyu Inoue + * @param string $post_type Post type to get the templates for. Default 'page'. + * @return void + */ + public static function addSourceTypePluginFilter($post_type) { + $post_types = avcpdp_get_parsed_post_types(); + if (!in_array($post_type, $post_types, true)) { + return; + } + + $plugin_term = avcpdp_get_source_type_plugin_term(); + if (!$plugin_term) { + return; + } + + $show_option_all = __('All Plugins', 'wp-parser'); + $plugin_term_id = get_query_var('plugin'); + $args = [ + 'show_option_all' => $show_option_all, + 'selected' => $plugin_term_id, + 'hide_empty' => 0, + 'child_of' => $plugin_term->term_id, + 'name' => 'plugin', + 'taxonomy' => $plugin_term->taxonomy, + ]; + + wp_dropdown_categories($args); + } + + /** + * Added search condition value "plugin" + * + * @author Seiyu Inoue + * @param array $vars + * @return array $vars + */ + public static function addSourceTypePlugin($vars) { + $vars[] = 'plugin'; + return $vars; + } + + /** + * Add plugin to search criteria + * + * @author Seiyu Inoue + * @param string $where The WHERE clause of the query. + * @return string $where + */ + public static function postsWhereSourceTypePlugin($where) { + global $wpdb; + if (is_admin()) { + $value = get_query_var('plugin'); + if (!empty($value)) { + $where .= $wpdb->prepare( + " AND EXISTS ( SELECT + 1 + FROM {$wpdb->term_relationships} AS m + WHERE m.object_id = {$wpdb->posts}.ID + AND m.term_taxonomy_id = %d )", + (int)$value + ); + } + } + return $where; + } +} From e75a5882ddd79ed9d6a34a7bc6d403a1b5f8e867 Mon Sep 17 00:00:00 2001 From: Seiyu Inoue Date: Thu, 30 Sep 2021 21:32:40 +0900 Subject: [PATCH 37/66] review content reflected --- src/PostsPluginFilter.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/PostsPluginFilter.php b/src/PostsPluginFilter.php index 9204788..f785cc6 100644 --- a/src/PostsPluginFilter.php +++ b/src/PostsPluginFilter.php @@ -38,13 +38,13 @@ public static function addSourceTypePluginFilter($post_type) { } $show_option_all = __('All Plugins', 'wp-parser'); - $plugin_term_id = get_query_var('plugin'); + $plugin_term_id = get_query_var('avcpdp_plugin'); $args = [ 'show_option_all' => $show_option_all, 'selected' => $plugin_term_id, 'hide_empty' => 0, 'child_of' => $plugin_term->term_id, - 'name' => 'plugin', + 'name' => 'avcpdp_plugin', 'taxonomy' => $plugin_term->taxonomy, ]; @@ -59,7 +59,7 @@ public static function addSourceTypePluginFilter($post_type) { * @return array $vars */ public static function addSourceTypePlugin($vars) { - $vars[] = 'plugin'; + $vars[] = 'avcpdp_plugin'; return $vars; } @@ -73,7 +73,7 @@ public static function addSourceTypePlugin($vars) { public static function postsWhereSourceTypePlugin($where) { global $wpdb; if (is_admin()) { - $value = get_query_var('plugin'); + $value = get_query_var('avcpdp_plugin'); if (!empty($value)) { $where .= $wpdb->prepare( " AND EXISTS ( SELECT From a4b0503d1e325428333fa33ca9acda4f7761ef91 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Fri, 1 Oct 2021 12:09:27 +0900 Subject: [PATCH 38/66] refactor: change importer config file name from 'docparser-meta.json' to 'docparser.config.json' --- src/API/Commands.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/API/Commands.php b/src/API/Commands.php index 2304416..0c9afc0 100644 --- a/src/API/Commands.php +++ b/src/API/Commands.php @@ -7,7 +7,6 @@ use Aivec\Plugins\DocParser\Importer\Importer; use Aivec\Plugins\DocParser\Importer\Parser; use Aivec\Plugins\DocParser\Models\ImportConfig; -use Exception; // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps // phpcs:disable PSR2.Methods.MethodDeclaration.Underscore @@ -34,7 +33,7 @@ public function create($directory, $trashOldRefs = false, $quick = null, $import do_action('avcpdp_command_print_line', ''); - $parser_meta_filen = 'docparser-meta.json'; + $parser_meta_filen = 'docparser.config.json'; $parser_meta_filep = ''; if ($directory === '.') { $parser_meta_filep = "./{$parser_meta_filen}"; From b5f9d61e64f31e52cac8c52db352e0e5f53e76c2 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 6 Oct 2021 11:12:55 +0900 Subject: [PATCH 39/66] feat: add avcpdp_get_associated_tags api function --- src/api-functions.php | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/api-functions.php b/src/api-functions.php index c7a5797..dd0897f 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -484,6 +484,54 @@ function avcpdp_get_reference_post_list_by_role($stterms, $role, $posts_per_page return $q; } +/** + * Returns list of tags that have at least one association with a `wp-parser-*` post + * + * @author Evan D Shaw + * @param array $stterms Source type terms + * @param string $fields + * @param bool $hide_empty + * @return WP_Term[] + */ +function avcpdp_get_associated_tags($stterms, $fields = 'all', $hide_empty = true) { + $terms = get_tags([ + 'hide_empty' => $hide_empty, + 'fields' => $fields, + ]); + if ($terms instanceof WP_Error) { + return []; + } + + $tagswithposts = []; + foreach ($terms as $tag) { + $q = new WP_Query([ + 'fields' => 'ids', + 'post_type' => avcpdp_get_parsed_post_types(), + 'tax_query' => [ + 'relation' => 'AND', + [ + 'taxonomy' => 'post_tag', + 'field' => 'slug', + 'terms' => $tag->slug, + 'include_children' => true, + ], + [ + 'taxonomy' => Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG, + 'field' => 'slug', + 'terms' => [$stterms['type']->slug, $stterms['name']->slug], + 'include_children' => false, + 'operator' => 'AND', + ], + ], + ]); + if ($q->post_count > 0) { + $tagswithposts[] = $tag; + } + } + + return $tagswithposts; +} + /** * Returns list of role terms for a source * From 606e373f574d858e1d300640dc80c6f3eb67e8c1 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 6 Oct 2021 16:26:57 +0900 Subject: [PATCH 40/66] feat: add search helper functions --- src/api-functions.php | 204 ++++++++++++++++++++++++++++++++---------- 1 file changed, 159 insertions(+), 45 deletions(-) diff --git a/src/api-functions.php b/src/api-functions.php index dd0897f..60aaa7c 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -1,5 +1,7 @@ + * @param string $s + * @param array $args + * @param array $post_types + * @return string + */ +function avcpdp_get_search_link($s = '', $args = [], $post_types = []) { + $sttstring = ''; + $stterms = avcpdp_get_source_type_terms(); + if (!empty($stterms)) { + $sttstring = $stterms['type']->slug . ',' . $stterms['name']->slug; + } + if (empty($post_types)) { + $post_types = avcpdp_get_parsed_post_types(); + } + $defaultargs = [ + 's' => $s, + 'post_type' => $post_types, + 'taxonomy' => Registrations::SOURCE_TYPE_TAX_SLUG, + Registrations::SOURCE_TYPE_TAX_SLUG => $sttstring, + ]; + + return add_query_arg(array_merge($defaultargs, $args), get_home_url()); +} + +/** + * Returns `true` if the current query is the main query and a search query + * for at least one of the 4 `wp-parser-*` reference post types + * + * @author Evan D Shaw + * @return bool + */ +function avcpdp_is_reference_search() { + // only process main query + if (!is_main_query()) { + return false; + } + // check if search query + if (!is_search()) { + return false; + } + + return avcpdp_is_parsed_post_type(); +} + +/** + * Returns source type "type" and "name" terms for the current page + * + * If the current page is an archive or search page and at least one + * of the queried post types is a `wp-parser-*` post type, this function + * will attempt to extract the source type terms from the taxonomy query. + * + * If the current page is a single page, source type terms associated with + * the post ID will be returned. + * + * @author Evan D Shaw + * @return array { + * A key-value map of source type terms. Empty array if the source type terms could + * not be determined + * + * @type \WP_Term $type The type of source (plugin, theme, or composer-package) + * @type \WP_Term $name The unique name for the source (eg: my-plugin) + * } + */ +function avcpdp_get_source_type_terms() { + if (is_archive() || is_search()) { + return avcpdp_get_reference_archive_source_type_terms(); + } + + return avcpdp_get_post_source_type_terms(); +} + +/** + * Returns source type "type" and "name" terms for the current post + * + * @author Evan D Shaw + * @param int|null $post_id + * @return array + */ +function avcpdp_get_post_source_type_terms($post_id = null) { + if ($post_id === null) { + $post_id = get_the_ID(); + } + + if (empty($post_id)) { + return []; + } + + $terms = wp_get_post_terms($post_id, Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG); + if (empty($terms)) { + return []; + } + + $res = []; + foreach ($terms as $term) { + if ($term->parent === 0) { + $res['type'] = $term; + } else { + $res['name'] = $term; + } + } + + if (empty($res['type']) || empty($res['name'])) { + return []; + } + + return $res; +} + /** * Returns the source type terms for the `wp-parser-*` post type currently being queried * @@ -87,15 +228,25 @@ function avcpdp_post_type_has_source_code($post_type = null) { * @return WP_Term[] */ function avcpdp_get_reference_archive_source_type_terms() { - if (!is_archive()) { + if (!is_archive() && !is_search()) { // not a code reference archive, cannot get source type terms return []; } - $ptype = get_query_var('post_type'); - if (!in_array($ptype, avcpdp_get_parsed_post_types(), true)) { - // only get source type terms from `wp-parser-*` post types - return []; + // only get source type terms from `wp-parser-*` post types + $ptypes = get_query_var('post_type'); + $ptypes = !empty($ptypes) ? $ptypes : ''; + if (is_array($ptypes)) { + foreach ($ptypes as $ptype) { + if (!in_array($ptype, avcpdp_get_parsed_post_types(), true)) { + return false; + } + } + } else { + if (!in_array($ptypes, avcpdp_get_parsed_post_types(), true)) { + return false; + } } + $stype = get_query_var(\Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG); if (empty($stype)) { // source type not queried for, cannot determine URL @@ -275,43 +426,6 @@ function avcpdp_get_reference_landing_page_posts_from_source_type_terms($stterms return $trail; } -/** - * Returns source type "type" and "name" terms for the current post - * - * @author Evan D Shaw - * @param int|null $post_id - * @return array|null - */ -function avcpdp_get_post_source_type_terms($post_id = null) { - if ($post_id === null) { - $post_id = get_the_ID(); - } - - if (empty($post_id)) { - return null; - } - - $terms = wp_get_post_terms($post_id, Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG); - if (empty($terms)) { - return null; - } - - $res = []; - foreach ($terms as $term) { - if ($term->parent === 0) { - $res['type'] = $term; - } else { - $res['name'] = $term; - } - } - - if (empty($res['type']) || empty($res['name'])) { - return null; - } - - return $res; -} - /** * Checks whether the source type terms are valid for a post * From b3488337fcb6696ef7add62917991c20a1de594d Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 6 Oct 2021 17:19:14 +0900 Subject: [PATCH 41/66] fix: encode values for search link/args functions --- src/api-functions.php | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/api-functions.php b/src/api-functions.php index 60aaa7c..9b6623f 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -50,9 +50,8 @@ function avcpdp_is_parsed_post_type($post_type = null) { return in_array($post_type, avcpdp_get_parsed_post_types()); } - $pid = get_the_ID(); - if (!empty($pid)) { - return in_array(get_post_type($pid), avcpdp_get_parsed_post_types()); + if (is_single()) { + return in_array(get_post_type(), avcpdp_get_parsed_post_types()); } $ptypes = get_query_var('post_type'); @@ -119,6 +118,25 @@ function avcpdp_post_type_has_source_code($post_type = null) { * @return string */ function avcpdp_get_search_link($s = '', $args = [], $post_types = []) { + $args = avcpdp_get_search_args($s, $args, $post_types); + foreach ($args as $argk => $argsv) { + if (is_string($argsv)) { + $args[$argk] = rawurlencode($argsv); + } + } + return add_query_arg($args, home_url('/')); +} + +/** + * Returns search arguments + * + * @author Evan D Shaw + * @param string $s + * @param array $args + * @param array $post_types + * @return (string|array)[] + */ +function avcpdp_get_search_args($s = '', $args = [], $post_types = []) { $sttstring = ''; $stterms = avcpdp_get_source_type_terms(); if (!empty($stterms)) { @@ -127,14 +145,16 @@ function avcpdp_get_search_link($s = '', $args = [], $post_types = []) { if (empty($post_types)) { $post_types = avcpdp_get_parsed_post_types(); } - $defaultargs = [ - 's' => $s, - 'post_type' => $post_types, - 'taxonomy' => Registrations::SOURCE_TYPE_TAX_SLUG, - Registrations::SOURCE_TYPE_TAX_SLUG => $sttstring, - ]; - return add_query_arg(array_merge($defaultargs, $args), get_home_url()); + return array_merge( + [ + 's' => $s, + 'post_type' => $post_types, + 'taxonomy' => Registrations::SOURCE_TYPE_TAX_SLUG, + Registrations::SOURCE_TYPE_TAX_SLUG => $sttstring, + ], + $args + ); } /** From 42a1181a3b1af1780fe21779867f24e4e2dbedd6 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Thu, 7 Oct 2021 12:25:08 +0900 Subject: [PATCH 42/66] fix: fix search post_type filtering --- src/Queries.php | 21 ++++++++++++++++----- src/api-functions.php | 4 +--- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Queries.php b/src/Queries.php index 1cbf714..3e6dc90 100644 --- a/src/Queries.php +++ b/src/Queries.php @@ -15,7 +15,7 @@ class Queries */ public static function init() { add_action('pre_get_posts', [get_class(), 'preGetPosts'], 10, 1); - add_filter('query_vars', [get_class(), 'addHookTypeQueryVar'], 10, 1); + add_filter('query_vars', [get_class(), 'addCustomQueryVars'], 10, 1); add_action('parse_tax_query', [get_class(), 'taxQueryNoChildren'], 10, 1); add_filter('pre_handle_404', [get_class(), 'force404onWrongSourceType'], 10, 2); add_filter('posts_results', [get_class(), 'orderByNotDeprecated'], 10, 1); @@ -72,11 +72,20 @@ public static function preGetPosts($query) { $ptype = !empty($query->query['post_type']) ? $query->query['post_type'] : ''; $hook_type = !empty($query->query['hook_type']) ? $query->query['hook_type'] : ''; if ($ptype === 'wp-parser-hook' && ($hook_type === 'filter' || $hook_type === 'action')) { - $query->query_vars['meta_key'] = '_wp-parser_hook_type'; - $query->query_vars['meta_value'] = $hook_type; + $query->set('meta_key', '_wp-parser_hook_type'); + $query->set('meta_value', $hook_type); } } + if ( + $query->is_main_query() + && $query->is_search() + && empty($query->query['post_type']) + && !empty($query->query['avcpdp_search']) + ) { + $query->set('post_type', avcpdp_get_parsed_post_types()); + } + if ($query->is_main_query() && $query->is_tax() && $query->get('wp-parser-source-file')) { $query->set('wp-parser-source-file', str_replace(['.php', '/'], ['-php', '_'], $query->query['wp-parser-source-file'])); } @@ -85,13 +94,15 @@ public static function preGetPosts($query) { } /** - * Adds `hook_type` query var for filtering hooks by type + * Adds `hook_type` query var for filtering hooks by type and + * `avcpdp_search` for reference search * * @author Evan D Shaw * @param array $qvars * @return array */ - public static function addHookTypeQueryVar($qvars) { + public static function addCustomQueryVars($qvars) { + $qvars[] = 'avcpdp_search'; $qvars[] = 'hook_type'; return $qvars; } diff --git a/src/api-functions.php b/src/api-functions.php index 9b6623f..1c0cdea 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -142,14 +142,12 @@ function avcpdp_get_search_args($s = '', $args = [], $post_types = []) { if (!empty($stterms)) { $sttstring = $stterms['type']->slug . ',' . $stterms['name']->slug; } - if (empty($post_types)) { - $post_types = avcpdp_get_parsed_post_types(); - } return array_merge( [ 's' => $s, 'post_type' => $post_types, + 'avcpdp_search' => 1, 'taxonomy' => Registrations::SOURCE_TYPE_TAX_SLUG, Registrations::SOURCE_TYPE_TAX_SLUG => $sttstring, ], From adcdbe464266643880f51895204c4f4206fad783 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Thu, 7 Oct 2021 18:02:40 +0900 Subject: [PATCH 43/66] fix: order by not deprecated for wp-parser-* archive and search results --- src/Queries.php | 110 ++++++++++++++++++++++++++---------------- src/api-functions.php | 29 +++++++---- 2 files changed, 88 insertions(+), 51 deletions(-) diff --git a/src/Queries.php b/src/Queries.php index 3e6dc90..0b2171b 100644 --- a/src/Queries.php +++ b/src/Queries.php @@ -15,48 +15,43 @@ class Queries */ public static function init() { add_action('pre_get_posts', [get_class(), 'preGetPosts'], 10, 1); + add_filter('posts_orderby', [get_class(), 'orderByNotDeprecated'], 10, 2); add_filter('query_vars', [get_class(), 'addCustomQueryVars'], 10, 1); add_action('parse_tax_query', [get_class(), 'taxQueryNoChildren'], 10, 1); add_filter('pre_handle_404', [get_class(), 'force404onWrongSourceType'], 10, 2); - add_filter('posts_results', [get_class(), 'orderByNotDeprecated'], 10, 1); } /** - * Uses PHP to put deprecated wp-parser-* posts at the end of the list for - * archive pages + * Filters the ORDER BY clause so that deprecated functions/methods/classes are + * put at the bottom of the results * * @author Evan D Shaw - * @param \WP_Posts[] $posts - * @return \WP_Posts[] + * @param string $orderby + * @param \WP_Query $query + * @return string */ - public static function orderByNotDeprecated($posts) { - global $wp_query; + public static function orderByNotDeprecated($orderby, $query) { + if ($query->order_by_not_deprecated) { + $case = "CASE + WHEN wp_postmeta.meta_value NOT LIKE '%name\";s:10:\"deprecated%' THEN 1 + ELSE 2 + END"; - if (!$wp_query->is_main_query() || !$wp_query->is_post_type_archive()) { - return $posts; + $orderby = !empty($orderby) ? "{$case}, {$orderby}" : $case; + return $orderby; } - $ptype = !empty($wp_query->query['post_type']) ? $wp_query->query['post_type'] : ''; - if (!avcpdp_is_parsed_post_type($ptype)) { - return $posts; - } + if ($query->order_by_not_deprecated_hook) { + $case = "CASE + WHEN wp_postmeta.meta_value != 'filter_deprecated' AND wp_postmeta.meta_value != 'action_deprecated' THEN 1 + ELSE 2 + END"; - $isdeprecated = []; - $notdeprecated = []; - foreach ($posts as $post) { - $tags = get_post_meta($post->ID, '_wp-parser_tags', true); - $deprecated = wp_filter_object_list($tags, ['name' => 'deprecated']); - $deprecated = array_shift($deprecated); - if ($deprecated) { - $isdeprecated[] = $post; - } else { - $notdeprecated[] = $post; - } + $orderby = !empty($orderby) ? "{$case}, {$orderby}" : $case; + return $orderby; } - $posts = array_merge($notdeprecated, $isdeprecated); - - return $posts; + return $orderby; } /** @@ -66,28 +61,61 @@ public static function orderByNotDeprecated($posts) { * @return void */ public static function preGetPosts($query) { - if ($query->is_main_query() && $query->is_post_type_archive()) { + $orderbynotdep = false; + $orderbynotdephook = false; + $ptype = !empty($query->query['post_type']) ? $query->query['post_type'] : ''; + if ($query->is_post_type_archive()) { + if (!avcpdp_is_parsed_post_type($ptype)) { + return; + } + $query->set('orderby', 'title'); $query->set('order', 'ASC'); - $ptype = !empty($query->query['post_type']) ? $query->query['post_type'] : ''; $hook_type = !empty($query->query['hook_type']) ? $query->query['hook_type'] : ''; - if ($ptype === 'wp-parser-hook' && ($hook_type === 'filter' || $hook_type === 'action')) { - $query->set('meta_key', '_wp-parser_hook_type'); - $query->set('meta_value', $hook_type); + if ($ptype === 'wp-parser-hook') { + if ($hook_type === 'filter' || $hook_type === 'action') { + $query->set('meta_key', '_wp-parser_hook_type'); + $query->set('meta_value', $hook_type); + } else { + $orderbynotdephook = true; + } + } else { + $orderbynotdep = true; } } - if ( - $query->is_main_query() - && $query->is_search() - && empty($query->query['post_type']) - && !empty($query->query['avcpdp_search']) - ) { - $query->set('post_type', avcpdp_get_parsed_post_types()); + if ($query->is_search() && !empty($query->query['avcpdp_search'])) { + if (empty($ptype)) { + $query->set('post_type', avcpdp_get_parsed_post_types()); + $orderbynotdep = true; + } else { + if ( + $ptype === 'wp-parser-hook' + || ( + is_array($ptype) && count($ptype) === 1 && $ptype[0] === 'wp-parser-hook' + ) + ) { + $orderbynotdephook = true; + } else { + $orderbynotdep = true; + } + } + $query->set('orderby', 'title'); + $query->set('order', 'ASC'); + } + + if ($orderbynotdep === true) { + // JOIN on `_wp-parser_tags` so that we can ORDER BY not deprecated + $query->set('meta_key', '_wp-parser_tags'); + // set arbitrary member variable so we don't have to do these checks again... + $query->order_by_not_deprecated = true; } - if ($query->is_main_query() && $query->is_tax() && $query->get('wp-parser-source-file')) { - $query->set('wp-parser-source-file', str_replace(['.php', '/'], ['-php', '_'], $query->query['wp-parser-source-file'])); + if ($orderbynotdephook === true) { + // JOIN on `_wp-parser_hook_type` so that we can ORDER BY not deprecated + $query->set('meta_key', '_wp-parser_hook_type'); + // set arbitrary member variable so we don't have to do these checks again... + $query->order_by_not_deprecated_hook = true; } // For search query modifications see DevHub_Search. diff --git a/src/api-functions.php b/src/api-functions.php index 1c0cdea..ab7af93 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -585,15 +585,19 @@ function avcpdp_get_source_type_plugin_terms() { * Returns list of reference post type posts for a given role slug * * @author Evan D Shaw - * @param WP_Term[] $stterms - * @param string $role - * @param int $posts_per_page + * @param WP_Term[] $stterms + * @param string $role + * @param array|string $post_type + * @param int $posts_per_page * @return WP_Query */ -function avcpdp_get_reference_post_list_by_role($stterms, $role, $posts_per_page = 5) { +function avcpdp_get_reference_post_list_by_role($stterms, $role, $post_type, $posts_per_page = 5) { + if (empty($post_type)) { + $post_type = avcpdp_get_parsed_post_types(); + } $q = new WP_Query([ 'fields' => 'ids', - 'post_type' => avcpdp_get_parsed_post_types(), + 'post_type' => $post_type, 'posts_per_page' => $posts_per_page, 'tax_query' => [ 'relation' => 'AND', @@ -668,12 +672,13 @@ function avcpdp_get_associated_tags($stterms, $fields = 'all', $hide_empty = tru * Returns list of role terms for a source * * @author Evan D Shaw - * @param array $stterms Source type terms - * @param string $fields - * @param bool $hide_empty + * @param array $stterms Source type terms + * @param array|string $post_type + * @param string $fields + * @param bool $hide_empty * @return WP_Term[] */ -function avcpdp_get_role_terms($stterms, $fields = 'all', $hide_empty = true) { +function avcpdp_get_role_terms($stterms, $post_type, $fields = 'all', $hide_empty = true) { $terms = get_terms([ 'taxonomy' => Aivec\Plugins\DocParser\Registrations::ROLE_TAX_SLUG, 'hide_empty' => $hide_empty, @@ -683,11 +688,15 @@ function avcpdp_get_role_terms($stterms, $fields = 'all', $hide_empty = true) { return []; } + if (empty($post_type)) { + $post_type = avcpdp_get_parsed_post_types(); + } + $roleswithposts = []; foreach ($terms as $role) { $q = new WP_Query([ 'fields' => 'ids', - 'post_type' => avcpdp_get_parsed_post_types(), + 'post_type' => $post_type, 'tax_query' => [ 'relation' => 'AND', [ From 7c561d6ca1cb59ab59d2396fcb13b5975cc68be4 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Thu, 7 Oct 2021 19:10:36 +0900 Subject: [PATCH 44/66] feat: add utility method for retrieving the reference source type logo from term meta --- src/api-functions.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/api-functions.php b/src/api-functions.php index ab7af93..7a469e2 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -108,6 +108,32 @@ function avcpdp_post_type_has_source_code($post_type = null) { return in_array($post_type, avcpdp_get_post_types_with_source_code()); } +/** + * Returns the SVG logo term meta for the current reference + * + * @author Evan D Shaw + * @return array { + * The SVG logo term meta data + * + * @type string $file Image path + * @type string $url Image URL + * @type string $type File extension + * } + */ +function avcpdp_get_reference_logo() { + $stterms = avcpdp_get_source_type_terms(); + if (empty($stterms)) { + return null; + } + + $svglogo = get_term_meta($stterms['name']->term_id, 'item_image', true); + if (empty($svglogo)) { + return null; + } + + return $svglogo; +} + /** * Returns search page link * From 5d5d1a5e8058c372809954697dfd6b0e140dc947 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 13 Oct 2021 12:28:26 +0900 Subject: [PATCH 45/66] feat: add a few more utility functions --- src/api-functions.php | 111 +++++++++++++++++++++++++++++++++--------- 1 file changed, 89 insertions(+), 22 deletions(-) diff --git a/src/api-functions.php b/src/api-functions.php index 7a469e2..89eeb2c 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -47,11 +47,11 @@ function avcpdp_get_parsed_post_types($labels = '') { */ function avcpdp_is_parsed_post_type($post_type = null) { if (!empty($post_type)) { - return in_array($post_type, avcpdp_get_parsed_post_types()); + return in_array($post_type, avcpdp_get_parsed_post_types(), true); } if (is_single()) { - return in_array(get_post_type(), avcpdp_get_parsed_post_types()); + return in_array(get_post_type(), avcpdp_get_parsed_post_types(), true); } $ptypes = get_query_var('post_type'); @@ -71,6 +71,49 @@ function avcpdp_is_parsed_post_type($post_type = null) { return true; } +/** + * Gets the current parsed post type + * + * This function will use the post type of the current post, or the + * queried post type if archive or search + * + * If archive or search, `null` will be returned if any of the queried + * post types are not a `wp-parser-*` post type + * + * @author Evan D Shaw + * @return string|string[]|null + */ +function avcpdp_get_parsed_post_type() { + if (is_single()) { + $sptype = get_post_type(); + if (!in_array($sptype, avcpdp_get_parsed_post_types(), true)) { + return null; + } + + return $sptype; + } + + $ptypes = get_query_var('post_type'); + $ptypes = !empty($ptypes) ? $ptypes : null; + if ($ptypes === null) { + return null; + } + + if (is_array($ptypes)) { + foreach ($ptypes as $ptype) { + if (!in_array($ptype, avcpdp_get_parsed_post_types(), true)) { + return null; + } + } + } else { + if (!in_array($ptypes, avcpdp_get_parsed_post_types(), true)) { + return null; + } + } + + return $ptypes; +} + /** * Get the specific type of hook. * @@ -308,39 +351,63 @@ function avcpdp_get_reference_archive_source_type_terms() { } /** - * Returns the base URL for the `wp-parser-*` post type currently being queried + * Returns the base URL for the `wp-parser-*` post type of the current post/query * * This function will return an empty string if the current main query is not related - * to a reference post type + * to a reference post type or if the current page is a singular page but the post + * type is not a reference post type * * @author Evan D Shaw - * @return string + * @return string Example: `/reference/plugin/my-plugin/functions` */ -function avcpdp_get_reference_archive_base_url() { - if (!is_archive()) { - // not a code reference archive, cannot determine URL +function avcpdp_get_reference_base_url() { + $baseurl = avcpdp_get_reference_type_base_url(); + if (empty($baseurl)) { return ''; } - $ptype = get_query_var('post_type'); - if (!in_array($ptype, avcpdp_get_parsed_post_types(), true)) { - // only show filter by category section for `wp-parser-*` post types + $ptype = avcpdp_get_parsed_post_type(); + if (!is_string($ptype)) { return ''; } - $stype = get_query_var(\Aivec\Plugins\DocParser\Registrations::SOURCE_TYPE_TAX_SLUG); - if (empty($stype)) { - // source type not queried for, cannot determine URL + $parsertype = avcpdp_get_reference_post_type_url_slug($ptype); + $baseurl .= "/{$parsertype}"; + + return $baseurl; +} + +/** + * Returns URL portion for a `wp-parser-*` post type + * + * @author Evan D Shaw + * @param string $ptype + * @return string + */ +function avcpdp_get_reference_post_type_url_slug($ptype) { + if (!avcpdp_is_parsed_post_type($ptype)) { return ''; } - $stypepieces = explode(',', $stype); - if (!avcpdp_source_type_term_slugs_are_valid($stypepieces)) { - // the combination of source type terms are not valid + + return \Aivec\Plugins\DocParser\Registrations::WP_PARSER_PT_MAP[$ptype]['urlpiece']; +} + +/** + * Returns the base URL for the source type terms of the current post/query + * + * This function will return an empty string if the current main query does not + * contain a source type taxonomy search or if the current page is a singular page + * but the post does not have source type terms applied to it. + * + * @author Evan D Shaw + * @return string Example: `/reference/plugin/my-plugin` + */ +function avcpdp_get_reference_type_base_url() { + $stterms = avcpdp_get_source_type_terms(); + if (empty($stterms)) { return ''; } - - $type = $stypepieces[0]; - $name = $stypepieces[1]; - $parsertype = \Aivec\Plugins\DocParser\Registrations::WP_PARSER_PT_MAP[$ptype]['urlpiece']; - $baseurl = home_url("/reference/{$type}/{$name}/{$parsertype}"); + $type = $stterms['type']->slug; + $name = $stterms['name']->slug; + $baseurl = home_url("/reference/{$type}/{$name}"); return $baseurl; } From f556b69b27087527d330a1c9d5e524b32a2b720a Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Mon, 18 Oct 2021 10:38:30 +0900 Subject: [PATCH 46/66] fix: combine the functionality of a few functions into one --- src/api-functions.php | 49 +++---------------------------------------- 1 file changed, 3 insertions(+), 46 deletions(-) diff --git a/src/api-functions.php b/src/api-functions.php index 89eeb2c..5a64a74 100644 --- a/src/api-functions.php +++ b/src/api-functions.php @@ -443,59 +443,16 @@ function avcpdp_get_reference_single_base_url($pid = null) { } /** - * Returns hierarchical descending array of reference landing page posts tied to the current reference - * single post via the source type taxonomy - * - * @author Evan D Shaw - * @param int|null $pid Optional. Post ID. Defaults to current post - * @return array - */ -function avcpdp_get_reference_landing_page_posts_from_reference_single_post($pid = null) { - if (empty($pid)) { - $pid = get_the_ID(); - } - if (empty($pid)) { - return []; - } - if (!is_single($pid)) { - return []; - } - if (!avcpdp_is_parsed_post_type()) { - return []; - } - if (!avcpdp_source_type_terms_are_valid_for_post($pid)) { - return []; - } - - $stterms = avcpdp_get_post_source_type_terms($pid); - - return avcpdp_get_reference_landing_page_posts_from_source_type_terms($stterms); -} - -/** - * Returns hierarchical descending array of reference landing page posts tied to the source types terms - * of the current `wp-parser-*` post type currently being queired + * Returns hierarchical descending array of reference landing page posts tied to the current source types terms * * @author Evan D Shaw * @return array */ -function avcpdp_get_reference_landing_page_posts_from_archive() { - $stterms = avcpdp_get_reference_archive_source_type_terms(); +function avcpdp_get_reference_landing_page_posts_from_source_type_terms() { + $stterms = avcpdp_get_source_type_terms(); if (empty($stterms)) { return []; } - - return avcpdp_get_reference_landing_page_posts_from_source_type_terms($stterms); -} - -/** - * Returns hierarchical descending array of reference landing page posts tied to the given source types terms - * - * @author Evan D Shaw - * @param array $stterms - * @return array - */ -function avcpdp_get_reference_landing_page_posts_from_source_type_terms($stterms) { $trail = []; $stypelanding = get_posts([ 'order' => 'ASC', From 0924439cf462288eb8414eebec864c640a7dafe1 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Thu, 21 Oct 2021 18:54:24 +0900 Subject: [PATCH 47/66] fix: fix handling of @see tag internal references --- src/Admin.php | 4 +- src/Explanations/Explanations.php | 2 +- src/Formatting.php | 77 +++++++++++++++---------------- 3 files changed, 39 insertions(+), 44 deletions(-) diff --git a/src/Admin.php b/src/Admin.php index b198a44..3844c02 100644 --- a/src/Admin.php +++ b/src/Admin.php @@ -54,9 +54,9 @@ public static function adminEnqueueScripts() { * * @param bool True if admin.css should be enqueued, false otherwise. */ - if ((bool)apply_filters('devhub-admin_enqueue_scripts', in_array(get_current_screen()->id, $screen_ids))) { + if ((bool)apply_filters('avcpdp_admin_enqueue_scripts', in_array(get_current_screen()->id, $screen_ids))) { wp_enqueue_style( - 'wporg-admin', + 'avcpdp-admin', AVCPDP_PLUGIN_URL . '/src/styles/admin.css', [], AVCPDP_VERSION diff --git a/src/Explanations/Explanations.php b/src/Explanations/Explanations.php index 64b9db0..2c4a599 100644 --- a/src/Explanations/Explanations.php +++ b/src/Explanations/Explanations.php @@ -74,7 +74,7 @@ public function init() { add_filter('post_row_actions', [$this, 'explRowAction'], 10, 2); // Script and styles. - add_filter('devhub-admin_enqueue_scripts', [$this, 'adminEnqueueBaseScripts']); + add_filter('avcpdp_admin_enqueue_scripts', [$this, 'adminEnqueueBaseScripts']); add_action('admin_enqueue_scripts', [$this, 'adminEnqueueScripts']); // AJAX. diff --git a/src/Formatting.php b/src/Formatting.php index 54e991e..494f8ef 100644 --- a/src/Formatting.php +++ b/src/Formatting.php @@ -34,17 +34,17 @@ public static function doInit() { add_filter('the_excerpt', [get_class(), 'autolinkReferences'], 11); add_filter('the_content', [get_class(), 'autolinkReferences'], 11); - add_filter('devhub-parameter-type', [get_class(), 'autolinkReferences']); + add_filter('avcapps-parameter-type', [get_class(), 'autolinkReferences']); - add_filter('devhub-format-description', [get_class(), 'autolinkReferences']); - add_filter('devhub-format-description', [get_class(), 'fixParamHashFormatting'], 9); - add_filter('devhub-format-description', [get_class(), 'fixParamDescriptionHtmlAsCode']); - add_filter('devhub-format-description', [get_class(), 'convertListsToMarkup']); + add_filter('avcpdp-format-description', [get_class(), 'autolinkReferences']); + add_filter('avcpdp-format-description', [get_class(), 'fixParamHashFormatting'], 9); + add_filter('avcpdp-format-description', [get_class(), 'fixParamDescriptionHtmlAsCode']); + add_filter('avcpdp-format-description', [get_class(), 'convertListsToMarkup']); - add_filter('devhub-format-hash-param-description', [get_class(), 'autolinkReferences']); - add_filter('devhub-format-hash-param-description', [get_class(), 'fixParamDescriptionParsedownBug']); + add_filter('avcpdp-format-hash-param-description', [get_class(), 'autolinkReferences']); + add_filter('avcpdp-format-hash-param-description', [get_class(), 'fixParamDescriptionParsedownBug']); - add_filter('devhub-function-return-type', [get_class(), 'autolinkReferences'], 10, 2); + add_filter('avcapps-function-return-type', [get_class(), 'autolinkReferences'], 10, 2); add_filter('syntaxhighlighter_htmlresult', [get_class(), 'fixCodeEntityEncoding'], 20); } @@ -167,38 +167,31 @@ public static function linkInternalElement($link) { } elseif (false !== strpos($link, '::$')) { // Nothing to link to currently. } elseif (false !== strpos($link, '::')) { - // Link to class method: {@see WP_Query::query()} - $url = get_post_type_archive_link('wp-parser-class') . - str_replace(['::', '()'], ['/', ''], $link); + // Link to class method: {@see \Namespace\Classname::someMethod()} + $post = self::getPostFromReference($link, 'wp-parser-method'); + if ($post !== null) { + $url = get_permalink($post->ID); + } } elseif (1 === preg_match('/^(?:\'|(?:‘))([\$\w\-&;]+)(?:\'|(?:’))$/', $link, $hook)) { // Link to hook: {@see 'pre_get_search_form'} if (!empty($hook[1])) { - $url = get_post_type_archive_link('wp-parser-hook') . - sanitize_title_with_dashes(html_entity_decode($hook[1])) . '/'; + $post = self::getPostFromReference($hook[1], 'wp-parser-hook'); + if ($post !== null) { + $url = get_permalink($post->ID); + } + } + } elseif (1 === preg_match('/\\\?(?:[A-Z]+[A-Za-z]*)+(?:\\\{1}[A-Z]+[A-Za-z]*)+/', $link)) { + // Link to a PSR-4 class: {@see \Namespace\Classname} + $post = self::getPostFromReference($link, 'wp-parser-class'); + if ($post !== null) { + $url = get_permalink($post->ID); } - } elseif ( - (in_array($link, [ - 'wpdb', - 'wp_atom_server', - 'wp_xmlrpc_server', // Exceptions that start with lowercase letter - 'AtomFeed', - 'AtomEntry', - 'AtomParser', - 'MagpieRSS', - 'Requests', - 'RSSCache', - 'Translations', - 'Walker', // Exceptions that lack an underscore - ])) - || - (1 === preg_match('/^_?[A-Z][a-zA-Z]+_\w+/', $link)) // Otherwise, class names start with (optional underscore, then) uppercase and have underscore - ) { - // Link to class: {@see WP_Query} - $url = get_post_type_archive_link('wp-parser-class') . sanitize_key($link); } else { // Link to function: {@see esc_attr()} - $url = get_post_type_archive_link('wp-parser-function') . - sanitize_title_with_dashes(html_entity_decode($link)); + $post = self::getPostFromReference($link, 'wp-parser-function'); + if ($post !== null) { + $url = get_permalink($post->ID); + } } if ($url) { @@ -221,7 +214,7 @@ public static function generateLink($url, $text) { * @param array $attrs The HTML attributes applied to the link's anchor element. * @param string $url The URL for the link. */ - $attrs = (array)apply_filters('devhub-format-link-attributes', ['href' => $url], $url); + $attrs = (array)apply_filters('avcpdp-format-link-attributes', ['href' => $url], $url); // Make sure the filter didn't completely remove the href attribute. if (empty($attrs['href'])) { @@ -292,11 +285,11 @@ public static function formatParamDescription($text) { // Convert any @link or @see to actual link. $text = self::makeDoclinkClickable($text); - return apply_filters('devhub-format-description', $text); + return apply_filters('avcpdp-format-description', $text); } /** - * Returns the post given a function/method/class raw reference string + * Returns the post given a function/method/class/hook raw reference string * * @author Evan D Shaw * @param string $ref @@ -559,18 +552,20 @@ public static function fixParamHashFormatting($text) { list( $wordtype, $type, $name, $description ) = explode(' ', $part . ' ', 4); // extra spaces ensure we'll always have 4 items. $description = trim($description); + $tclass = 'ref-arg-type'; $type = apply_filters('avcpdp_filter_param_hash_type', $type, $text); if (strpos($type, '\\') !== false) { $type = ltrim($type, '\\'); + $tclass .= ' ref-arg-type--class'; } - $description = apply_filters('devhub-format-hash-param-description', $description); + $description = apply_filters('avcpdp-format-hash-param-description', $description); $skip_closing_li = false; // Handle nested hashes. if (($description && '{' === $description[0]) || '{' === $name) { - $description = ltrim($description, '{') . '
      '; + $description = ltrim($description, '{') . '
        '; $skip_closing_li = true; } elseif ('}' === substr($description, -1)) { $description = substr($description, 0, -1) . "
      \n"; @@ -587,7 +582,7 @@ public static function fixParamHashFormatting($text) { if ($in_list) { $new_text .= '
    • '; } else { - $new_text .= '
      • '; + $new_text .= '
        • '; $in_list = true; } @@ -602,7 +597,7 @@ public static function fixParamHashFormatting($text) { if ($name) { $new_text .= "'{$name}'
          "; } - $new_text .= "({$type}){$description}"; + $new_text .= "({$type}){$description}"; if (!$skip_closing_li) { $new_text .= '
        • '; } From 191e883d05158ed0960fb5a2beb33643dec31ba9 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 27 Oct 2021 10:29:58 +0900 Subject: [PATCH 48/66] chore: add bundle script --- .gitignore | 1 + bundle | 30 ++++++++++++++ composer.json | 3 +- composer.lock | 113 +++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 144 insertions(+), 3 deletions(-) create mode 100755 bundle diff --git a/.gitignore b/.gitignore index f0fc90f..b68fb03 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ vendor node_modules dist +*.zip diff --git a/bundle b/bundle new file mode 100755 index 0000000..4aea713 --- /dev/null +++ b/bundle @@ -0,0 +1,30 @@ +#!/usr/bin/env php +setFoldersToInclude(['dist', 'languages', 'src', 'vendor']) + ->setFilesToInclude(['plugin.php']) + ->setTargetsToCleanBeforeBuild(['dist', 'node_modules', 'vendor']) + ->setBuildCallback(function () { + passthru('npm run build:prod'); + passthru('composer build'); + }) + ->setTargetsToCleanAfterBuild([ + 'vendor/aivec', + 'vendor/nikic', + 'vendor/bin', + ]) + ->setCleanupCallback(function () { + passthru('composer dump-autoload'); + }) + ->setArchiveTargetsToClean([ + 'dist/**/*.map', + 'src/**/*.tsx', + ]) + ->createZipArchive(); diff --git a/composer.json b/composer.json index 03153a8..a4407d1 100644 --- a/composer.json +++ b/composer.json @@ -50,7 +50,8 @@ "require-dev": { "wp-cli/i18n-command": "^2.2", "aivec/phpcs-wp": "^2.0", - "coenjacobs/mozart": "^0.7.1" + "coenjacobs/mozart": "^0.7.1", + "aivec/pt-bundler": "^1.1" }, "autoload": { "files": [ diff --git a/composer.lock b/composer.lock index cfd398d..f55db11 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f522ec19be9b5b2d536898d75568ed62", + "content-hash": "4405fb731bddee0911f9543cc8c75755", "packages": [ { "name": "aivec/core-css", @@ -1137,6 +1137,52 @@ }, "time": "2021-09-13T13:58:46+00:00" }, + { + "name": "aivec/pt-bundler", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/aivec/pt-bundler.git", + "reference": "2de06683d6f4b7c1f238c20d4393f609f2a092d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aivec/pt-bundler/zipball/2de06683d6f4b7c1f238c20d4393f609f2a092d9", + "reference": "2de06683d6f4b7c1f238c20d4393f609f2a092d9", + "shasum": "" + }, + "require": { + "ext-zip": "*", + "php": ">=7.2", + "symfony/filesystem": "^5.2" + }, + "require-dev": { + "aivec/phpcs-wp": "^2.0", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Aivec\\PtBundler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "authors": [ + { + "name": "Evan Shaw", + "email": "evandanielshaw@gmail.com" + } + ], + "description": "WordPress plugin/theme ZIP bundler library", + "support": { + "issues": "https://github.com/aivec/pt-bundler/issues", + "source": "https://github.com/aivec/pt-bundler/tree/v1.1.0" + }, + "time": "2021-05-24T09:33:33+00:00" + }, { "name": "coenjacobs/mozart", "version": "0.7.1", @@ -2061,6 +2107,69 @@ ], "time": "2021-03-23T23:28:01+00:00" }, + { + "name": "symfony/filesystem", + "version": "v5.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-21T12:40:44+00:00" + }, { "name": "symfony/polyfill-ctype", "version": "v1.23.0", @@ -2754,5 +2863,5 @@ "php": ">=5.4" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } From 89e46c7927dc550ddff3b5b3984e2e06a8b4e812 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 27 Oct 2021 11:34:05 +0900 Subject: [PATCH 49/66] fix: install missing cross-env package --- package-lock.json | 1 + package.json | 1 + 2 files changed, 2 insertions(+) diff --git a/package-lock.json b/package-lock.json index 4201edd..91002cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "@typescript-eslint/eslint-plugin": "^4.31.2", "@typescript-eslint/parser": "^4.31.2", "@wordpress/scripts": "^18.0.1", + "cross-env": "^7.0.3", "eslint": "^7.32.0", "eslint-config-airbnb-typescript": "^14.0.0", "eslint-config-prettier": "^8.3.0", diff --git a/package.json b/package.json index 18520c5..ca0a7dc 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@typescript-eslint/eslint-plugin": "^4.31.2", "@typescript-eslint/parser": "^4.31.2", "@wordpress/scripts": "^18.0.1", + "cross-env": "^7.0.3", "eslint": "^7.32.0", "eslint-config-airbnb-typescript": "^14.0.0", "eslint-config-prettier": "^8.3.0", From bff3226cbf5a88f9bcfcd1c6f715033c357c7517 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Wed, 27 Oct 2021 11:38:06 +0900 Subject: [PATCH 50/66] chore: fix bundle script --- bundle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bundle b/bundle index 4aea713..b697008 100755 --- a/bundle +++ b/bundle @@ -4,13 +4,14 @@ use Aivec\PtBundler\Bundler; passthru('composer install'); +passthru('npm install'); require_once(__DIR__ . '/vendor/autoload.php'); (new Bundler('wp-phpdoc-parser')) ->setFoldersToInclude(['dist', 'languages', 'src', 'vendor']) ->setFilesToInclude(['plugin.php']) - ->setTargetsToCleanBeforeBuild(['dist', 'node_modules', 'vendor']) + ->setTargetsToCleanBeforeBuild(['dist', 'vendor']) ->setBuildCallback(function () { passthru('npm run build:prod'); passthru('composer build'); From 94620436a752352267f2f7312854f64b50b2a651 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Fri, 29 Oct 2021 12:18:28 +0900 Subject: [PATCH 51/66] feat: save @important tag as post meta data. Add meta box field to post edit page --- composer.json | 5 +- composer.lock | 108 +++--- languages/messages.pot | 310 +++++++++++------- ...r-en-89e3a54d76b08785eadd9f81bcccf6b1.json | 42 +++ languages/wp-parser-en.mo | Bin 2601 -> 2636 bytes languages/wp-parser-en.po | 269 +++++++++------ ...r-ja-89e3a54d76b08785eadd9f81bcccf6b1.json | 42 +++ languages/wp-parser-ja.mo | Bin 7190 -> 8039 bytes languages/wp-parser-ja.po | 268 +++++++++------ src/Importer/Importer.php | 13 + src/ParsedContent.php | 117 ++++++- src/Views/ImporterPage/Import.tsx | 4 +- src/Views/ImporterPage/ImporterPage.php | 6 +- src/Views/ImporterPage/Settings.tsx | 2 +- 14 files changed, 797 insertions(+), 389 deletions(-) create mode 100644 languages/wp-parser-en-89e3a54d76b08785eadd9f81bcccf6b1.json create mode 100644 languages/wp-parser-ja-89e3a54d76b08785eadd9f81bcccf6b1.json diff --git a/composer.json b/composer.json index a4407d1..14fc771 100644 --- a/composer.json +++ b/composer.json @@ -44,8 +44,8 @@ "psr/log": "~1.0", "aivec/wordpress-router": "^7.0", "aivec/response-handler": "^5.0", - "aivec/core-css": "^2.0", - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.5", + "aivec/core-css": "^3.1" }, "require-dev": { "wp-cli/i18n-command": "^2.2", @@ -69,6 +69,7 @@ "i18n:create-pot": "./vendor/bin/wp i18n make-pot . languages/messages.pot", "i18n:update-pos": "@composer i18n:create-pot && find ./languages -name \"*.po\" | xargs -I % msgmerge -o % % languages/messages.pot", "i18n:make-mo": "./vendor/bin/wp i18n make-mo languages", + "i18n:make-json": "./vendor/bin/wp i18n make-json languages --no-purge --pretty-print", "build": [ "composer install", "mozart compose", diff --git a/composer.lock b/composer.lock index f55db11..28ad235 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4405fb731bddee0911f9543cc8c75755", + "content-hash": "7b1fc8db0873ae25058fdf3646ac765a", "packages": [ { "name": "aivec/core-css", - "version": "v2.0.1", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/aivec/core-css.git", - "reference": "3f5991de5c4ee28e97dd206eb43851387117516c" + "reference": "c20eaeb8c1bb7d0fa754cf89a4a53fe420eff21a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aivec/core-css/zipball/3f5991de5c4ee28e97dd206eb43851387117516c", - "reference": "3f5991de5c4ee28e97dd206eb43851387117516c", + "url": "https://api.github.com/repos/aivec/core-css/zipball/c20eaeb8c1bb7d0fa754cf89a4a53fe420eff21a", + "reference": "c20eaeb8c1bb7d0fa754cf89a4a53fe420eff21a", "shasum": "" }, "type": "library", @@ -39,9 +39,9 @@ "description": "Aivec core CSS styles", "support": { "issues": "https://github.com/aivec/core-css/issues", - "source": "https://github.com/aivec/core-css/tree/v2.0.1" + "source": "https://github.com/aivec/core-css/tree/v3.1.1" }, - "time": "2021-09-15T03:55:48+00:00" + "time": "2021-10-13T08:54:09+00:00" }, { "name": "aivec/response-handler", @@ -139,16 +139,16 @@ }, { "name": "composer/installers", - "version": "v1.9.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/composer/installers.git", - "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca" + "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/installers/zipball/b93bcf0fa1fccb0b7d176b0967d969691cd74cca", - "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca", + "url": "https://api.github.com/repos/composer/installers/zipball/d20a64ed3c94748397ff5973488761b22f6d3f19", + "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19", "shasum": "" }, "require": { @@ -159,17 +159,18 @@ "shama/baton": "*" }, "require-dev": { - "composer/composer": "1.6.* || 2.0.*@dev", - "composer/semver": "1.0.* || 2.0.*@dev", - "phpunit/phpunit": "^4.8.36", - "sebastian/comparator": "^1.2.4", + "composer/composer": "1.6.* || ^2.0", + "composer/semver": "^1 || ^3", + "phpstan/phpstan": "^0.12.55", + "phpstan/phpstan-phpunit": "^0.12.16", + "symfony/phpunit-bridge": "^4.2 || ^5", "symfony/process": "^2.3" }, "type": "composer-plugin", "extra": { "class": "Composer\\Installers\\Plugin", "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "1.x-dev" } }, "autoload": { @@ -207,6 +208,7 @@ "Porto", "RadPHP", "SMF", + "Starbug", "Thelia", "Whmcs", "WolfCMS", @@ -240,13 +242,16 @@ "majima", "mako", "mediawiki", + "miaoxing", "modulework", "modx", "moodle", "osclass", + "pantheon", "phpbb", "piwik", "ppi", + "processwire", "puppet", "pxcms", "reindex", @@ -256,6 +261,7 @@ "sydes", "sylius", "symfony", + "tastyigniter", "typo3", "wordpress", "yawik", @@ -264,19 +270,23 @@ ], "support": { "issues": "https://github.com/composer/installers/issues", - "source": "https://github.com/composer/installers/tree/v1.9.0" + "source": "https://github.com/composer/installers/tree/v1.12.0" }, "funding": [ { "url": "https://packagist.com", "type": "custom" }, + { + "url": "https://github.com/composer", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "time": "2020-04-07T06:57:05+00:00" + "time": "2021-09-13T08:19:44+00:00" }, { "name": "erusev/parsedown", @@ -590,16 +600,16 @@ }, { "name": "psr/log", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { @@ -623,7 +633,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -634,9 +644,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { "name": "rmccue/requests", @@ -1313,16 +1323,16 @@ }, { "name": "gettext/gettext", - "version": "v4.8.5", + "version": "v4.8.6", "source": { "type": "git", "url": "https://github.com/php-gettext/Gettext.git", - "reference": "ef2e312dff383fc0e4cd62dd39042e1157f137d4" + "reference": "bbeb8f4d3077663739aecb4551b22e720c0e9efe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/ef2e312dff383fc0e4cd62dd39042e1157f137d4", - "reference": "ef2e312dff383fc0e4cd62dd39042e1157f137d4", + "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/bbeb8f4d3077663739aecb4551b22e720c0e9efe", + "reference": "bbeb8f4d3077663739aecb4551b22e720c0e9efe", "shasum": "" }, "require": { @@ -1374,7 +1384,7 @@ "support": { "email": "oom@oscarotero.com", "issues": "https://github.com/oscarotero/Gettext/issues", - "source": "https://github.com/php-gettext/Gettext/tree/v4.8.5" + "source": "https://github.com/php-gettext/Gettext/tree/v4.8.6" }, "funding": [ { @@ -1390,7 +1400,7 @@ "type": "patreon" } ], - "time": "2021-07-13T16:45:53+00:00" + "time": "2021-10-19T10:44:53+00:00" }, { "name": "gettext/languages", @@ -1562,16 +1572,16 @@ }, { "name": "league/mime-type-detection", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3" + "reference": "b38b25d7b372e9fddb00335400467b223349fd7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", - "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b38b25d7b372e9fddb00335400467b223349fd7e", + "reference": "b38b25d7b372e9fddb00335400467b223349fd7e", "shasum": "" }, "require": { @@ -1602,7 +1612,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.7.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.8.0" }, "funding": [ { @@ -1614,20 +1624,20 @@ "type": "tidelift" } ], - "time": "2021-01-18T20:58:21+00:00" + "time": "2021-09-25T08:23:19+00:00" }, { "name": "mck89/peast", - "version": "v1.13.6", + "version": "v1.13.8", "source": { "type": "git", "url": "https://github.com/mck89/peast.git", - "reference": "67566e6d594ffb70057fee7adceac9300998cc95" + "reference": "4f0423441ec557f3935b056d10987f2e1c7a3e76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mck89/peast/zipball/67566e6d594ffb70057fee7adceac9300998cc95", - "reference": "67566e6d594ffb70057fee7adceac9300998cc95", + "url": "https://api.github.com/repos/mck89/peast/zipball/4f0423441ec557f3935b056d10987f2e1c7a3e76", + "reference": "4f0423441ec557f3935b056d10987f2e1c7a3e76", "shasum": "" }, "require": { @@ -1639,7 +1649,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13.6-dev" + "dev-master": "1.13.8-dev" } }, "autoload": { @@ -1661,9 +1671,9 @@ "description": "Peast is PHP library that generates AST for JavaScript code", "support": { "issues": "https://github.com/mck89/peast/issues", - "source": "https://github.com/mck89/peast/tree/v1.13.6" + "source": "https://github.com/mck89/peast/tree/v1.13.8" }, - "time": "2021-08-23T10:30:32+00:00" + "time": "2021-09-11T10:28:18+00:00" }, { "name": "phpcompatibility/php-compatibility", @@ -1887,16 +1897,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.6.0", + "version": "3.6.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e", + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e", "shasum": "" }, "require": { @@ -1939,7 +1949,7 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2021-04-09T00:54:41+00:00" + "time": "2021-10-11T04:00:11+00:00" }, { "name": "symfony/console", diff --git a/languages/messages.pot b/languages/messages.pot index 8d49ebe..6074b8e 100644 --- a/languages/messages.pot +++ b/languages/messages.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2021-09-15T10:16:52+09:00\n" +"POT-Creation-Date: 2021-10-29T12:06:34+09:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.5.0\n" "X-Domain: wp-parser\n" @@ -34,38 +34,48 @@ msgstr "" msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" msgstr "" -#: src/api-functions.php:21 -#: src/Registrations.php:191 -#: src/Registrations.php:193 -#: src/Registrations.php:195 -#: src/Registrations.php:205 +#: src/api-functions.php:23 +#: src/Registrations.php:190 +#: src/Registrations.php:192 +#: src/Registrations.php:194 +#: src/Registrations.php:204 msgid "Classes" msgstr "" -#: src/api-functions.php:22 -#: src/Registrations.php:131 -#: src/Registrations.php:133 -#: src/Registrations.php:135 -#: src/Registrations.php:145 +#: src/api-functions.php:24 +#: src/Registrations.php:130 +#: src/Registrations.php:132 +#: src/Registrations.php:134 +#: src/Registrations.php:144 msgid "Functions" msgstr "" -#: src/api-functions.php:23 -#: src/Registrations.php:221 -#: src/Registrations.php:223 -#: src/Registrations.php:225 -#: src/Registrations.php:235 +#: src/api-functions.php:25 +#: src/Registrations.php:220 +#: src/Registrations.php:222 +#: src/Registrations.php:224 +#: src/Registrations.php:234 msgid "Hooks" msgstr "" -#: src/api-functions.php:24 -#: src/Registrations.php:161 -#: src/Registrations.php:163 -#: src/Registrations.php:165 -#: src/Registrations.php:175 +#: src/api-functions.php:26 +#: src/Registrations.php:160 +#: src/Registrations.php:162 +#: src/Registrations.php:164 +#: src/Registrations.php:174 msgid "Methods" msgstr "" +#. translators: name of the missing field +#: src/ErrorStore.php:30 +msgid "\"%s\" is required" +msgstr "" + +#. translators: name of the plugin/theme/composer-package +#: src/ErrorStore.php:39 +msgid "\"%s\" does not exist" +msgstr "" + #: src/Explanations/Explanations.php:93 #: src/Explanations/Explanations.php:95 msgid "Explanations" @@ -174,11 +184,11 @@ msgstr "" msgid "Post has an explanation." msgstr "" -#: src/Importer/Importer.php:339 +#: src/Importer/Importer.php:336 msgid "Functions Reference" msgstr "" -#: src/Importer/Importer.php:343 +#: src/Importer/Importer.php:340 msgid "Hooks Reference" msgstr "" @@ -209,348 +219,406 @@ msgstr "" msgid "Used by Methods" msgstr "" -#: src/ParsedContent.php:83 +#: src/ParsedContent.php:111 msgid "Parsed Content" msgstr "" -#: src/ParsedContent.php:112 +#: src/ParsedContent.php:119 +msgid "Item Importance" +msgstr "" + +#: src/ParsedContent.php:142 +msgid "Not Important" +msgstr "" + +#: src/ParsedContent.php:155 +msgid "Important" +msgstr "" + +#: src/ParsedContent.php:191 msgid "Parsed Summary:" msgstr "" -#: src/ParsedContent.php:121 +#: src/ParsedContent.php:200 msgid "Translated Summary:" msgstr "" -#: src/ParsedContent.php:139 +#: src/ParsedContent.php:218 msgid "Parsed Description:" msgstr "" -#: src/ParsedContent.php:148 +#: src/ParsedContent.php:227 msgid "Translated Description:" msgstr "" -#: src/ParsedContent.php:166 +#: src/ParsedContent.php:245 msgid "Tags (args, return)" msgstr "" #. translators: the type -#: src/ParsedContent.php:178 -#: src/ParsedContent.php:224 +#: src/ParsedContent.php:257 +#: src/ParsedContent.php:303 msgid "(%s)" msgstr "" #. translators: the arg name -#: src/ParsedContent.php:198 +#: src/ParsedContent.php:277 msgid "%s (Translated)" msgstr "" -#: src/ParsedContent.php:221 +#: src/ParsedContent.php:300 msgid "Parsed Return:" msgstr "" -#: src/ParsedContent.php:237 +#: src/ParsedContent.php:316 msgid "Translated Return:" msgstr "" -#: src/Registrations.php:134 +#: src/PostsPluginFilter.php:40 +msgid "All Plugins" +msgstr "" + +#: src/Registrations.php:133 msgid "Function" msgstr "" -#: src/Registrations.php:136 +#: src/Registrations.php:135 msgid "New Function" msgstr "" -#: src/Registrations.php:137 -#: src/Registrations.php:167 -#: src/Registrations.php:197 -#: src/Registrations.php:227 -#: src/Registrations.php:260 +#: src/Registrations.php:136 +#: src/Registrations.php:166 +#: src/Registrations.php:196 +#: src/Registrations.php:226 +#: src/Registrations.php:259 msgid "Add New" msgstr "" -#: src/Registrations.php:138 +#: src/Registrations.php:137 msgid "Add New Function" msgstr "" -#: src/Registrations.php:139 +#: src/Registrations.php:138 msgid "Edit Function" msgstr "" -#: src/Registrations.php:140 +#: src/Registrations.php:139 msgid "View Function" msgstr "" -#: src/Registrations.php:141 +#: src/Registrations.php:140 msgid "Search Functions" msgstr "" -#: src/Registrations.php:142 +#: src/Registrations.php:141 msgid "No Functions found" msgstr "" -#: src/Registrations.php:143 +#: src/Registrations.php:142 msgid "No Functions found in trash" msgstr "" -#: src/Registrations.php:144 +#: src/Registrations.php:143 msgid "Parent Function" msgstr "" -#: src/Registrations.php:164 +#: src/Registrations.php:163 msgid "Method" msgstr "" -#: src/Registrations.php:166 +#: src/Registrations.php:165 msgid "New Method" msgstr "" -#: src/Registrations.php:168 +#: src/Registrations.php:167 msgid "Add New Method" msgstr "" -#: src/Registrations.php:169 +#: src/Registrations.php:168 msgid "Edit Method" msgstr "" -#: src/Registrations.php:170 +#: src/Registrations.php:169 msgid "View Method" msgstr "" -#: src/Registrations.php:171 +#: src/Registrations.php:170 msgid "Search Methods" msgstr "" -#: src/Registrations.php:172 +#: src/Registrations.php:171 msgid "No Methods found" msgstr "" -#: src/Registrations.php:173 +#: src/Registrations.php:172 msgid "No Methods found in trash" msgstr "" -#: src/Registrations.php:174 +#: src/Registrations.php:173 msgid "Parent Method" msgstr "" -#: src/Registrations.php:194 +#: src/Registrations.php:193 msgid "Class" msgstr "" -#: src/Registrations.php:196 +#: src/Registrations.php:195 msgid "New Class" msgstr "" -#: src/Registrations.php:198 +#: src/Registrations.php:197 msgid "Add New Class" msgstr "" -#: src/Registrations.php:199 +#: src/Registrations.php:198 msgid "Edit Class" msgstr "" -#: src/Registrations.php:200 +#: src/Registrations.php:199 msgid "View Class" msgstr "" -#: src/Registrations.php:201 +#: src/Registrations.php:200 msgid "Search Classes" msgstr "" -#: src/Registrations.php:202 +#: src/Registrations.php:201 msgid "No Classes found" msgstr "" -#: src/Registrations.php:203 +#: src/Registrations.php:202 msgid "No Classes found in trash" msgstr "" -#: src/Registrations.php:204 +#: src/Registrations.php:203 msgid "Parent Class" msgstr "" -#: src/Registrations.php:224 +#: src/Registrations.php:223 msgid "Hook" msgstr "" -#: src/Registrations.php:226 +#: src/Registrations.php:225 msgid "New Hook" msgstr "" -#: src/Registrations.php:228 +#: src/Registrations.php:227 msgid "Add New Hook" msgstr "" -#: src/Registrations.php:229 +#: src/Registrations.php:228 msgid "Edit Hook" msgstr "" -#: src/Registrations.php:230 +#: src/Registrations.php:229 msgid "View Hook" msgstr "" -#: src/Registrations.php:231 +#: src/Registrations.php:230 msgid "Search Hooks" msgstr "" -#: src/Registrations.php:232 +#: src/Registrations.php:231 msgid "No Hooks found" msgstr "" -#: src/Registrations.php:233 +#: src/Registrations.php:232 msgid "No Hooks found in trash" msgstr "" -#: src/Registrations.php:234 +#: src/Registrations.php:233 msgid "Parent Hook" msgstr "" -#: src/Registrations.php:254 -#: src/Registrations.php:256 -#: src/Registrations.php:258 -#: src/Registrations.php:267 +#: src/Registrations.php:253 +#: src/Registrations.php:255 +#: src/Registrations.php:257 +#: src/Registrations.php:266 msgid "Reference Landing Pages" msgstr "" -#: src/Registrations.php:257 +#: src/Registrations.php:256 msgid "Reference Landing Page" msgstr "" -#: src/Registrations.php:259 +#: src/Registrations.php:258 msgid "New Reference Landing Page" msgstr "" -#: src/Registrations.php:261 +#: src/Registrations.php:260 msgid "Add New Reference Landing Page" msgstr "" -#: src/Registrations.php:262 +#: src/Registrations.php:261 msgid "Edit Reference Landing Page" msgstr "" -#: src/Registrations.php:263 +#: src/Registrations.php:262 msgid "View Reference Landing Page" msgstr "" -#: src/Registrations.php:264 +#: src/Registrations.php:263 msgid "Search Reference Landing Pages" msgstr "" -#: src/Registrations.php:265 +#: src/Registrations.php:264 msgid "No Pages found" msgstr "" -#: src/Registrations.php:266 +#: src/Registrations.php:265 msgid "No Pages found in trash" msgstr "" -#: src/Registrations.php:302 -#: src/Registrations.php:304 -#: src/Registrations.php:318 +#: src/Registrations.php:301 +#: src/Registrations.php:303 +#: src/Registrations.php:317 msgid "Files" msgstr "" -#: src/Registrations.php:305 +#: src/Registrations.php:304 msgctxt "taxonomy general name" msgid "File" msgstr "" -#: src/Registrations.php:306 +#: src/Registrations.php:305 msgid "Search Files" msgstr "" -#: src/Registrations.php:308 +#: src/Registrations.php:307 msgid "All Files" msgstr "" -#: src/Registrations.php:309 +#: src/Registrations.php:308 msgid "Parent File" msgstr "" -#: src/Registrations.php:310 +#: src/Registrations.php:309 msgid "Parent File:" msgstr "" -#: src/Registrations.php:311 +#: src/Registrations.php:310 msgid "Edit File" msgstr "" -#: src/Registrations.php:312 +#: src/Registrations.php:311 msgid "Update File" msgstr "" +#: src/Registrations.php:312 #: src/Registrations.php:313 -#: src/Registrations.php:314 msgid "New File" msgstr "" -#: src/Registrations.php:315 +#: src/Registrations.php:314 msgid "Files separated by comma" msgstr "" -#: src/Registrations.php:316 +#: src/Registrations.php:315 msgid "Add or remove Files" msgstr "" -#: src/Registrations.php:317 +#: src/Registrations.php:316 msgid "Choose from the most used Files" msgstr "" -#: src/Registrations.php:358 +#: src/Registrations.php:357 msgid "@since" msgstr "" -#: src/Registrations.php:376 +#: src/Registrations.php:375 msgid "Namespaces" msgstr "" -#: src/Registrations.php:390 -msgid "Source Version" -msgstr "" - -#: src/Registrations.php:404 +#: src/Registrations.php:389 msgid "Source Type" msgstr "" -#: src/Registrations.php:420 -#: src/Registrations.php:515 +#: src/Registrations.php:405 +#: src/Registrations.php:500 msgid "Plugin" msgstr "" -#: src/Registrations.php:428 -#: src/Registrations.php:519 +#: src/Registrations.php:413 +#: src/Registrations.php:504 msgid "Theme" msgstr "" -#: src/Registrations.php:436 -#: src/Registrations.php:523 +#: src/Registrations.php:421 +#: src/Registrations.php:508 msgid "Composer Package" msgstr "" -#: src/Registrations.php:448 +#: src/Registrations.php:433 msgid "Role" msgstr "" -#: src/Registrations.php:462 +#: src/Registrations.php:447 msgid "Display" msgstr "" -#: src/Registrations.php:463 +#: src/Registrations.php:448 msgid "Condition" msgstr "" -#: src/Registrations.php:464 +#: src/Registrations.php:449 msgid "Utility" msgstr "" -#: src/Registrations.php:465 +#: src/Registrations.php:450 msgid "Setter" msgstr "" -#: src/Registrations.php:466 +#: src/Registrations.php:451 msgid "Getter" msgstr "" -#: src/Registrations.php:672 +#: src/Registrations.php:657 msgctxt "separator" msgid " or " msgstr "" + +#: src/SourceTypeTerm.php:53 +msgid "Item Image" +msgstr "" + +#: src/SourceTypeTerm.php:56 +msgid "Pick a item image to make an association.(svg Only)" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10297 +#: dist/js/Views/ImporterPage/App.js:10311 +#: dist/js/Views/ImporterPage/App.js:10318 +msgid "Import" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10299 +msgid "Enter the folder name of the plugin/theme/composer-package" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10308 +msgid "Trash old references" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10314 +msgid "Importing..." +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10448 +msgid "Updated" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10462 +msgid "Source folders parent path" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10464 +msgid "Enter the absolute path to the location of the source folders" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10471 +msgid "Updating..." +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10475 +msgid "Update" +msgstr "" diff --git a/languages/wp-parser-en-89e3a54d76b08785eadd9f81bcccf6b1.json b/languages/wp-parser-en-89e3a54d76b08785eadd9f81bcccf6b1.json new file mode 100644 index 0000000..b6e29f0 --- /dev/null +++ b/languages/wp-parser-en-89e3a54d76b08785eadd9f81bcccf6b1.json @@ -0,0 +1,42 @@ +{ + "translation-revision-date": "YEAR-MO-DA HO:MI+ZONE", + "generator": "WP-CLI\/2.5.0", + "source": "dist\/js\/Views\/ImporterPage\/App.js", + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "lang": "en", + "plural-forms": "nplurals=2; plural=(n != 1);" + }, + "Import": [ + "" + ], + "Enter the folder name of the plugin\/theme\/composer-package": [ + "" + ], + "Trash old references": [ + "" + ], + "Importing...": [ + "" + ], + "Updated": [ + "" + ], + "Source folders parent path": [ + "" + ], + "Enter the absolute path to the location of the source folders": [ + "" + ], + "Updating...": [ + "" + ], + "Update": [ + "" + ] + } + } +} \ No newline at end of file diff --git a/languages/wp-parser-en.mo b/languages/wp-parser-en.mo index ee88231081253634f75806bdd77c1975ada74640..0ac0e95138f2c3d5d3f60aca5e8cc6e6a53d57f7 100644 GIT binary patch delta 857 zcmYMxKS*0q6vy$aiN+*GO$>-)!L}e26=Dp9zDhw*PzWVL5M0_W)r!GCh!Amj;1Y0C z$xtYyQ%j*kK>|*t8jwOe=+-~bA+%5&912cd`u#Nr3^(`l&OPtmd+xh$lAn|Qk3_KS z_@(&w^MBE#i08nyF&=Laci|95aU5H48bkQd@^cs_Uc^~kw|ot?&L`CTub6etcfWXO zV;~)DOuUcX#8cRc^GI_~=(OQe?8IeMej8Q54n}YnRX`crv4UFvt>vqzgM7dQ`@3@+ z_=#Hh3RP(fyJ>@N?7%+M#5)#ymY+eI%hAPg4z}sFU8bco=CeL#O!7W+tZC5!h^`RAw&ULwuCqElh-EIvZzPi*|7c@`dMO!#60bsXfy3)B_FBL|Vd vt>{FdFpw*3E-tNX91aC~f*qr&k@UU%XxdBN^~N#>xzK8BBY*flwA}m;ltoTq delta 822 zcmYMxKPbdu9LMp8JI)X1?`1&5pcHXJ`C(!p|5BKgMFw;>WzY>bN~vQo-N1DjE`u(U zj7P4NiAAz87}@0g;ajfXJ+I&Q`96QX&+{up&LZ*Wy5N!H*TcV=|6!3L=PCpLhItJW z*I*NtU>An4&-#7zh^KHK7cHMb%|FKqyuxX`#WLsOt|9n0u@&n{bYdxvB99xV(T0;) zjdQ5{3aWrLEXNqCfE}#F1hRoUu>3LV0H;`ox!*YM+zl^U_z6|%8)}0utio^9#4uGT zZb9X{QHAx>)S{1CXBstb8CBQ@s-SID!3oqpdsxB#?wFSjOrwtlOz{~)?4p4gX6a-( z)B@LL9#z;qD*uAI`ghBZaD4TTBVBG5b@fZue}Zuh$nv7AzeJtv4ynOCn2)HFJ);)- zFh5Zz{I=L*F|Aiiqxns!@oi=&^0=tQ!yeyX9b?upgDPOr;$`Gt2;v-Z(W&LS0Yx$hT*B\n" "Language-Team: LANGUAGE \n" @@ -42,26 +42,36 @@ msgstr "" msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" msgstr "https://github.com/aivec/phpdoc-parser/graphs/contributors" -#: src/api-functions.php:21 src/Registrations.php:191 src/Registrations.php:193 -#: src/Registrations.php:195 src/Registrations.php:205 +#: src/api-functions.php:23 src/Registrations.php:190 src/Registrations.php:192 +#: src/Registrations.php:194 src/Registrations.php:204 msgid "Classes" msgstr "Classes" -#: src/api-functions.php:22 src/Registrations.php:131 src/Registrations.php:133 -#: src/Registrations.php:135 src/Registrations.php:145 +#: src/api-functions.php:24 src/Registrations.php:130 src/Registrations.php:132 +#: src/Registrations.php:134 src/Registrations.php:144 msgid "Functions" msgstr "Functions" -#: src/api-functions.php:23 src/Registrations.php:221 src/Registrations.php:223 -#: src/Registrations.php:225 src/Registrations.php:235 +#: src/api-functions.php:25 src/Registrations.php:220 src/Registrations.php:222 +#: src/Registrations.php:224 src/Registrations.php:234 msgid "Hooks" msgstr "Hooks" -#: src/api-functions.php:24 src/Registrations.php:161 src/Registrations.php:163 -#: src/Registrations.php:165 src/Registrations.php:175 +#: src/api-functions.php:26 src/Registrations.php:160 src/Registrations.php:162 +#: src/Registrations.php:164 src/Registrations.php:174 msgid "Methods" msgstr "Methods" +#. translators: name of the missing field +#: src/ErrorStore.php:30 +msgid "\"%s\" is required" +msgstr "" + +#. translators: name of the plugin/theme/composer-package +#: src/ErrorStore.php:39 +msgid "\"%s\" does not exist" +msgstr "" + #: src/Explanations/Explanations.php:93 src/Explanations/Explanations.php:95 msgid "Explanations" msgstr "" @@ -161,11 +171,11 @@ msgstr "" msgid "Post has an explanation." msgstr "" -#: src/Importer/Importer.php:339 +#: src/Importer/Importer.php:336 msgid "Functions Reference" msgstr "Functions Reference" -#: src/Importer/Importer.php:343 +#: src/Importer/Importer.php:340 msgid "Hooks Reference" msgstr "Hooks Reference" @@ -196,359 +206,418 @@ msgstr "Hooks" msgid "Used by Methods" msgstr "Methods" -#: src/ParsedContent.php:83 +#: src/ParsedContent.php:111 msgid "Parsed Content" msgstr "" -#: src/ParsedContent.php:112 +#: src/ParsedContent.php:119 +msgid "Item Importance" +msgstr "" + +#: src/ParsedContent.php:142 +msgid "Not Important" +msgstr "" + +#: src/ParsedContent.php:155 +msgid "Important" +msgstr "" + +#: src/ParsedContent.php:191 msgid "Parsed Summary:" msgstr "" -#: src/ParsedContent.php:121 +#: src/ParsedContent.php:200 msgid "Translated Summary:" msgstr "" -#: src/ParsedContent.php:139 +#: src/ParsedContent.php:218 msgid "Parsed Description:" msgstr "" -#: src/ParsedContent.php:148 +#: src/ParsedContent.php:227 msgid "Translated Description:" msgstr "" -#: src/ParsedContent.php:166 +#: src/ParsedContent.php:245 msgid "Tags (args, return)" msgstr "" #. translators: the type -#: src/ParsedContent.php:178 src/ParsedContent.php:224 +#: src/ParsedContent.php:257 src/ParsedContent.php:303 msgid "(%s)" msgstr "" #. translators: the arg name -#: src/ParsedContent.php:198 +#: src/ParsedContent.php:277 msgid "%s (Translated)" msgstr "" -#: src/ParsedContent.php:221 +#: src/ParsedContent.php:300 msgid "Parsed Return:" msgstr "" -#: src/ParsedContent.php:237 +#: src/ParsedContent.php:316 msgid "Translated Return:" msgstr "" -#: src/Registrations.php:134 +#: src/PostsPluginFilter.php:40 +#, fuzzy +msgid "All Plugins" +msgstr "Plugin" + +#: src/Registrations.php:133 #, fuzzy msgid "Function" msgstr "Functions" -#: src/Registrations.php:136 +#: src/Registrations.php:135 #, fuzzy msgid "New Function" msgstr "Functions" -#: src/Registrations.php:137 src/Registrations.php:167 -#: src/Registrations.php:197 src/Registrations.php:227 -#: src/Registrations.php:260 +#: src/Registrations.php:136 src/Registrations.php:166 +#: src/Registrations.php:196 src/Registrations.php:226 +#: src/Registrations.php:259 msgid "Add New" msgstr "" -#: src/Registrations.php:138 +#: src/Registrations.php:137 #, fuzzy msgid "Add New Function" msgstr "Functions" -#: src/Registrations.php:139 +#: src/Registrations.php:138 #, fuzzy msgid "Edit Function" msgstr "Functions" -#: src/Registrations.php:140 +#: src/Registrations.php:139 #, fuzzy msgid "View Function" msgstr "Functions" -#: src/Registrations.php:141 +#: src/Registrations.php:140 #, fuzzy msgid "Search Functions" msgstr "Functions" -#: src/Registrations.php:142 +#: src/Registrations.php:141 #, fuzzy msgid "No Functions found" msgstr "Functions" -#: src/Registrations.php:143 +#: src/Registrations.php:142 msgid "No Functions found in trash" msgstr "" -#: src/Registrations.php:144 +#: src/Registrations.php:143 #, fuzzy msgid "Parent Function" msgstr "Functions" -#: src/Registrations.php:164 +#: src/Registrations.php:163 #, fuzzy msgid "Method" msgstr "Methods" -#: src/Registrations.php:166 +#: src/Registrations.php:165 #, fuzzy msgid "New Method" msgstr "Methods" -#: src/Registrations.php:168 +#: src/Registrations.php:167 msgid "Add New Method" msgstr "" -#: src/Registrations.php:169 +#: src/Registrations.php:168 #, fuzzy msgid "Edit Method" msgstr "Methods" -#: src/Registrations.php:170 +#: src/Registrations.php:169 #, fuzzy msgid "View Method" msgstr "Methods" -#: src/Registrations.php:171 +#: src/Registrations.php:170 #, fuzzy msgid "Search Methods" msgstr "Methods" -#: src/Registrations.php:172 +#: src/Registrations.php:171 #, fuzzy msgid "No Methods found" msgstr "Methods" -#: src/Registrations.php:173 +#: src/Registrations.php:172 msgid "No Methods found in trash" msgstr "" -#: src/Registrations.php:174 +#: src/Registrations.php:173 #, fuzzy msgid "Parent Method" msgstr "Methods" -#: src/Registrations.php:194 +#: src/Registrations.php:193 #, fuzzy msgid "Class" msgstr "Classes" -#: src/Registrations.php:196 +#: src/Registrations.php:195 #, fuzzy msgid "New Class" msgstr "Classes" -#: src/Registrations.php:198 +#: src/Registrations.php:197 msgid "Add New Class" msgstr "" -#: src/Registrations.php:199 +#: src/Registrations.php:198 msgid "Edit Class" msgstr "" -#: src/Registrations.php:200 +#: src/Registrations.php:199 msgid "View Class" msgstr "" -#: src/Registrations.php:201 +#: src/Registrations.php:200 #, fuzzy msgid "Search Classes" msgstr "Classes" -#: src/Registrations.php:202 +#: src/Registrations.php:201 #, fuzzy msgid "No Classes found" msgstr "Classes" -#: src/Registrations.php:203 +#: src/Registrations.php:202 msgid "No Classes found in trash" msgstr "" -#: src/Registrations.php:204 +#: src/Registrations.php:203 msgid "Parent Class" msgstr "" -#: src/Registrations.php:224 +#: src/Registrations.php:223 #, fuzzy msgid "Hook" msgstr "Hooks" -#: src/Registrations.php:226 +#: src/Registrations.php:225 #, fuzzy msgid "New Hook" msgstr "Hooks" -#: src/Registrations.php:228 +#: src/Registrations.php:227 msgid "Add New Hook" msgstr "" -#: src/Registrations.php:229 +#: src/Registrations.php:228 msgid "Edit Hook" msgstr "" -#: src/Registrations.php:230 +#: src/Registrations.php:229 msgid "View Hook" msgstr "" -#: src/Registrations.php:231 +#: src/Registrations.php:230 msgid "Search Hooks" msgstr "" -#: src/Registrations.php:232 +#: src/Registrations.php:231 msgid "No Hooks found" msgstr "" -#: src/Registrations.php:233 +#: src/Registrations.php:232 msgid "No Hooks found in trash" msgstr "" -#: src/Registrations.php:234 +#: src/Registrations.php:233 msgid "Parent Hook" msgstr "" -#: src/Registrations.php:254 src/Registrations.php:256 -#: src/Registrations.php:258 src/Registrations.php:267 +#: src/Registrations.php:253 src/Registrations.php:255 +#: src/Registrations.php:257 src/Registrations.php:266 msgid "Reference Landing Pages" msgstr "" -#: src/Registrations.php:257 +#: src/Registrations.php:256 msgid "Reference Landing Page" msgstr "" -#: src/Registrations.php:259 +#: src/Registrations.php:258 msgid "New Reference Landing Page" msgstr "" -#: src/Registrations.php:261 +#: src/Registrations.php:260 msgid "Add New Reference Landing Page" msgstr "" -#: src/Registrations.php:262 +#: src/Registrations.php:261 msgid "Edit Reference Landing Page" msgstr "" -#: src/Registrations.php:263 +#: src/Registrations.php:262 msgid "View Reference Landing Page" msgstr "" -#: src/Registrations.php:264 +#: src/Registrations.php:263 msgid "Search Reference Landing Pages" msgstr "" -#: src/Registrations.php:265 +#: src/Registrations.php:264 msgid "No Pages found" msgstr "" -#: src/Registrations.php:266 +#: src/Registrations.php:265 msgid "No Pages found in trash" msgstr "" -#: src/Registrations.php:302 src/Registrations.php:304 -#: src/Registrations.php:318 +#: src/Registrations.php:301 src/Registrations.php:303 +#: src/Registrations.php:317 msgid "Files" msgstr "" -#: src/Registrations.php:305 +#: src/Registrations.php:304 msgctxt "taxonomy general name" msgid "File" msgstr "" -#: src/Registrations.php:306 +#: src/Registrations.php:305 msgid "Search Files" msgstr "" -#: src/Registrations.php:308 +#: src/Registrations.php:307 msgid "All Files" msgstr "" -#: src/Registrations.php:309 +#: src/Registrations.php:308 msgid "Parent File" msgstr "" -#: src/Registrations.php:310 +#: src/Registrations.php:309 msgid "Parent File:" msgstr "" -#: src/Registrations.php:311 +#: src/Registrations.php:310 msgid "Edit File" msgstr "" -#: src/Registrations.php:312 +#: src/Registrations.php:311 msgid "Update File" msgstr "" -#: src/Registrations.php:313 src/Registrations.php:314 +#: src/Registrations.php:312 src/Registrations.php:313 msgid "New File" msgstr "" -#: src/Registrations.php:315 +#: src/Registrations.php:314 msgid "Files separated by comma" msgstr "" -#: src/Registrations.php:316 +#: src/Registrations.php:315 msgid "Add or remove Files" msgstr "" -#: src/Registrations.php:317 +#: src/Registrations.php:316 msgid "Choose from the most used Files" msgstr "" -#: src/Registrations.php:358 +#: src/Registrations.php:357 msgid "@since" msgstr "" -#: src/Registrations.php:376 +#: src/Registrations.php:375 msgid "Namespaces" msgstr "Namespaces" -#: src/Registrations.php:390 -msgid "Source Version" -msgstr "" - -#: src/Registrations.php:404 +#: src/Registrations.php:389 msgid "Source Type" msgstr "" -#: src/Registrations.php:420 src/Registrations.php:515 +#: src/Registrations.php:405 src/Registrations.php:500 msgid "Plugin" msgstr "Plugin" -#: src/Registrations.php:428 src/Registrations.php:519 +#: src/Registrations.php:413 src/Registrations.php:504 msgid "Theme" msgstr "Theme" -#: src/Registrations.php:436 src/Registrations.php:523 +#: src/Registrations.php:421 src/Registrations.php:508 msgid "Composer Package" msgstr "Composer Package" -#: src/Registrations.php:448 +#: src/Registrations.php:433 msgid "Role" msgstr "" -#: src/Registrations.php:462 +#: src/Registrations.php:447 msgid "Display" msgstr "Display" -#: src/Registrations.php:463 +#: src/Registrations.php:448 msgid "Condition" msgstr "Condition" -#: src/Registrations.php:464 +#: src/Registrations.php:449 msgid "Utility" msgstr "Utility" -#: src/Registrations.php:465 +#: src/Registrations.php:450 msgid "Setter" msgstr "Setter" -#: src/Registrations.php:466 +#: src/Registrations.php:451 msgid "Getter" msgstr "Getter" -#: src/Registrations.php:672 +#: src/Registrations.php:657 msgctxt "separator" msgid " or " msgstr "" + +#: src/SourceTypeTerm.php:53 +msgid "Item Image" +msgstr "" + +#: src/SourceTypeTerm.php:56 +msgid "Pick a item image to make an association.(svg Only)" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10297 +#: dist/js/Views/ImporterPage/App.js:10311 +#: dist/js/Views/ImporterPage/App.js:10318 +msgid "Import" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10299 +msgid "Enter the folder name of the plugin/theme/composer-package" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10308 +msgid "Trash old references" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10314 +msgid "Importing..." +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10448 +msgid "Updated" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10462 +msgid "Source folders parent path" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10464 +msgid "Enter the absolute path to the location of the source folders" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10471 +msgid "Updating..." +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10475 +msgid "Update" +msgstr "" diff --git a/languages/wp-parser-ja-89e3a54d76b08785eadd9f81bcccf6b1.json b/languages/wp-parser-ja-89e3a54d76b08785eadd9f81bcccf6b1.json new file mode 100644 index 0000000..869c133 --- /dev/null +++ b/languages/wp-parser-ja-89e3a54d76b08785eadd9f81bcccf6b1.json @@ -0,0 +1,42 @@ +{ + "translation-revision-date": "YEAR-MO-DA HO:MI+ZONE", + "generator": "WP-CLI\/2.5.0", + "source": "dist\/js\/Views\/ImporterPage\/App.js", + "domain": "messages", + "locale_data": { + "messages": { + "": { + "domain": "messages", + "lang": "ja", + "plural-forms": "nplurals=2; plural=(n != 1);" + }, + "Import": [ + "\u30a4\u30f3\u30dd\u30fc\u30c8" + ], + "Enter the folder name of the plugin\/theme\/composer-package": [ + "\u30d7\u30e9\u30b0\u30a4\u30f3\u30fb\u30c6\u30fc\u30de\u30fbComposer\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30d5\u30a9\u30eb\u30c0\u30fc\u540d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002" + ], + "Trash old references": [ + "\u904e\u53bb\u306e\u30ec\u30d5\u30a1\u30ec\u30f3\u30b9\u3092\u30b4\u30df\u7bb1\u306b\u79fb\u52d5" + ], + "Importing...": [ + "\u30a4\u30f3\u30dd\u30fc\u30c8\u4e2d..." + ], + "Updated": [ + "\u66f4\u65b0\u3057\u307e\u3057\u305f\u3002" + ], + "Source folders parent path": [ + "\u30bd\u30fc\u30b9\u306e\u89aa\u30d5\u30a9\u30eb\u30c0\u30fc" + ], + "Enter the absolute path to the location of the source folders": [ + "\u30bd\u30fc\u30b9\u30d5\u30a9\u30eb\u30c0\u30fc\u304c\u5165\u3063\u3066\u3044\u308b\u89aa\u30d5\u30a9\u30eb\u30c0\u30fc\u306e\u7d76\u5bfe\u30d1\u30b9" + ], + "Updating...": [ + "\u66f4\u65b0\u4e2d..." + ], + "Update": [ + "\u30d1\u30b9\u3092\u66f4\u65b0\u3059\u308b" + ] + } + } +} \ No newline at end of file diff --git a/languages/wp-parser-ja.mo b/languages/wp-parser-ja.mo index a2c96bd20693f3875e63d9d23b0cb844f240849b..bfaf37d36c1cd9b695be7721a4c3fc998e9d5a7c 100644 GIT binary patch delta 2828 zcmZYAe@xVM9LMp`Wd=}b2_3@t0zNH;V4Vf0HawOpu2u<(xV4s)(L@4k^0 zs3oB?C-lQG74gTZ=`7mPw%XckR_l)%TAvVItyb&Trp=zOyAQRgJMQuM{dvFN-|x*$ zxAos1>&?5m)$s3m{>Jc^eYJYVT+I02T$=yT*HliXG1p)o=3oJ8eiCZSt!{h<4yS(~ zX5$hZhEHJ;uEu<0Vy2Bo76W^5D87dy@HiIZS2!5|KwWSFb?_iIY2Qe`9>gNld_4}q zRj73y@-eUTrGVRAzYB+Qzd1}}G!q|T1@>Y&j^UKK_y{Vn?U;xAP#GOZW&SxTz%zI~ zo<(9bmyn}OCY#CBp%st6Se<<>wkz^_X!r_7Z_8Cex^}?m+)FFV3(fJji`((Q5C8}1@Ih>!e-R| z?Wp~S-26#5-;2uhPgLnIARm)OhpWtWIn-YR;~7u|ZgdkfkdL{SFI~70Rl*wAe-^dA z2~~-$sLbEO>#z$I;Biy{-=NMpgF5FI)V+g-QGaDHoLLQwLoJ-bmnu+!y5KQX#LG~n z3!zH?3hKa(sCS?fb#WJ}awpvU*Eo{?kElQuz0MsHqoIRGpbi}C`Zu6{1yhlanZ*}- z&BLf?xD*xe3e>*UZajfXXdRNIX-8eyg}Uc3re1cONI%v~LvQ1pF zqEHDlNJkN8qYlnTz3t;rft0)c9GpP^3D<8#y;JQt0}tY4{5?G$GsV=87|e83hO@C0 z=b<8RbZ$VEwheXRe$?;2$ITC?zMN?aoh7J?XQCeE0yo}(y6+_{)9-%^je8k5g*8~j zuDQ4t6~LFMOnY7bFVrLO@un$|Y%IY7WXjBOK90&Xg1WFBbzZmg2o~x0|B+kp9je5? zq7M4oIgGSb@(HN-1t7!x=&G$;Ix}BW>ZX&-$6qg!l?dc z)Fb#9%kWP(U&@bM^Yd{WdZ-NFK~?Z`oQGq0kre3Ds7JC2RjDRaCAJ{1mwC64`g689 z>K2?rmFP6;nVm-+lu23|&qehMPzU)@2bZD(u5boX>pD;YbUKfsD)AZW{O?Coe=YFw zU!M*fiDfteHNM38G-|^OsL0>Ov3L*_*eTThZ&CYxa{WuFz;aovbu&=`+~a&A<{B$e znKYwH+J*#aPT(Xw#J{l|hZGm5FJ4sK zQl8P1RafVKpswM`+Flt(QzbGh)3jW)mM+?|qv%YQ0vQ*lE4p)?1^I zcynLlJ2w8djd$Ak3pUYou5;HFYr6Xn9q!xPW4+fn!CZEM^^RHZMV;lf)1DQga*;q- zi#^XK_G@N(;)soRUv_TatLtoHBiHx6vem{nry|&3<8Rn_t3p|m;6YR-AIi`1%}A$W zy=|#$UNYy`t~=KmH(NN+io`~nIB30&{_g!YzPo?NvA(8ObADTU yUt`z#O-VZ+K56%)lJ6j4lO9dyk(^U_()TZYh&t5( delta 2007 zcmYM!e{79c9LMqVXs@fcRaz^(w=HWT#t`>PwAvU$w%k-@(X?2DTBB&HC0aic;Yr+J zm>@U0h$uE2;S$O72cc^gzhlz~|Bxo)uEg(O*-TcEcz?Q+Xl|d^bDneV_k6$K^Ry2q zw@!5LW~c5k{H)|RpWj4^M#fC?e{=x1UocL^nb;RAus?o_nqPu^%o_XL#es}>U{ z`~h?DS5&LpQ3Z8j9=<>&5TIIj2sc4)6d-~MFb%a}9%{Y;RY?q$$oI&{?6KoRsLD>- z=N+h)Uqi*Yjq1!pJAQ{+AIPBpYE_7+s<;pb<7m{z(@+~%qXN~S0yQBYvyqDu-)YAO zQR_}%Z{?`?UC5s1FFXGN)$#Wk^j`seq^mOuqBb6eYFROAz6_P%0#u--sF$?`Rmo=5 z#;r(q%`eCv<`in9-|X{CsDy7IACq*sD)38G;Qvr({b^s*#z3ckh9v6%AoycXHZti>>HK_z^~ zdLGrWKT#Xq$65FqwQf3XR3~Rz7oy@eBS++#t#;xls+H%k1pmNt^wEC>sz6mV&yH82 zTJ54X-iBlGN7M$FtX-&rUZdjYfAW94F}-sBMcn9R`4ZK-8dNJAtu3g4>re^oMjg>H zR4Xsr=TA}VQn{#;A=G>|DlylNPuTHI46}dlE3b+py!!e=1L_OAun;>?72Lxam`=Yd zaSkfc1gZlbs>0uqQ#3bF2`BA*52}-X9;)ChbQK`XjV6jwf$sI#xLwxZTu zK~BkZT9Zgo<{#7s0sfh2eiSO+Bvhg0_W9-@=dT5O?Scd<^L8x2>!`$@+W9xA^*;U- z6fhSxKN7X^cvPpNs3U5|&v2(5pGI;sx2(@XQ5%re3Y?3|e6$^xp*EV2CD@1~@CcS- zC#pkf`SBiqhj+1Go)e!Nc;&55-{g2{{Tm(s?7EfB^~;;$TQh5Os+v};s$Ev!ywp^! zSoB>>-KSsIFRSyy0~Ytm43~_JOsI^6OCv?46UKXovvxb)SA%vq-jTxn-ySiiT-5bwz$BuNzy!cP~P5%9D4>lzpx5gI~\n" "Language-Team: LANGUAGE \n" @@ -42,26 +42,36 @@ msgstr "" msgid "https://github.com/aivec/phpdoc-parser/graphs/contributors" msgstr "https://github.com/aivec/phpdoc-parser/graphs/contributors" -#: src/api-functions.php:21 src/Registrations.php:191 src/Registrations.php:193 -#: src/Registrations.php:195 src/Registrations.php:205 +#: src/api-functions.php:23 src/Registrations.php:190 src/Registrations.php:192 +#: src/Registrations.php:194 src/Registrations.php:204 msgid "Classes" msgstr "クラス" -#: src/api-functions.php:22 src/Registrations.php:131 src/Registrations.php:133 -#: src/Registrations.php:135 src/Registrations.php:145 +#: src/api-functions.php:24 src/Registrations.php:130 src/Registrations.php:132 +#: src/Registrations.php:134 src/Registrations.php:144 msgid "Functions" msgstr "ファンクション" -#: src/api-functions.php:23 src/Registrations.php:221 src/Registrations.php:223 -#: src/Registrations.php:225 src/Registrations.php:235 +#: src/api-functions.php:25 src/Registrations.php:220 src/Registrations.php:222 +#: src/Registrations.php:224 src/Registrations.php:234 msgid "Hooks" msgstr "フック" -#: src/api-functions.php:24 src/Registrations.php:161 src/Registrations.php:163 -#: src/Registrations.php:165 src/Registrations.php:175 +#: src/api-functions.php:26 src/Registrations.php:160 src/Registrations.php:162 +#: src/Registrations.php:164 src/Registrations.php:174 msgid "Methods" msgstr "関数" +#. translators: name of the missing field +#: src/ErrorStore.php:30 +msgid "\"%s\" is required" +msgstr "" + +#. translators: name of the plugin/theme/composer-package +#: src/ErrorStore.php:39 +msgid "\"%s\" does not exist" +msgstr "" + #: src/Explanations/Explanations.php:93 src/Explanations/Explanations.php:95 msgid "Explanations" msgstr "説明文" @@ -161,11 +171,11 @@ msgstr "" msgid "Post has an explanation." msgstr "" -#: src/Importer/Importer.php:339 +#: src/Importer/Importer.php:336 msgid "Functions Reference" msgstr "ファンクション・レファレンス" -#: src/Importer/Importer.php:343 +#: src/Importer/Importer.php:340 msgid "Hooks Reference" msgstr "フック・レファレンス" @@ -191,338 +201,396 @@ msgstr "利用しているフック" msgid "Used by Methods" msgstr "利用されている関数" -#: src/ParsedContent.php:83 +#: src/ParsedContent.php:111 msgid "Parsed Content" msgstr "パースしたコンテンツ" -#: src/ParsedContent.php:112 +#: src/ParsedContent.php:119 +msgid "Item Importance" +msgstr "重要ステータス" + +#: src/ParsedContent.php:142 +msgid "Not Important" +msgstr "重要ではない" + +#: src/ParsedContent.php:155 +msgid "Important" +msgstr "重要" + +#: src/ParsedContent.php:191 msgid "Parsed Summary:" msgstr "概要" -#: src/ParsedContent.php:121 +#: src/ParsedContent.php:200 msgid "Translated Summary:" msgstr "概要 (翻訳)" -#: src/ParsedContent.php:139 +#: src/ParsedContent.php:218 msgid "Parsed Description:" msgstr "説明" -#: src/ParsedContent.php:148 +#: src/ParsedContent.php:227 msgid "Translated Description:" msgstr "説明 (翻訳)" -#: src/ParsedContent.php:166 +#: src/ParsedContent.php:245 msgid "Tags (args, return)" msgstr "(パラメータ、戻り値)" #. translators: the type -#: src/ParsedContent.php:178 src/ParsedContent.php:224 +#: src/ParsedContent.php:257 src/ParsedContent.php:303 msgid "(%s)" msgstr "(%s)" #. translators: the arg name -#: src/ParsedContent.php:198 +#: src/ParsedContent.php:277 msgid "%s (Translated)" msgstr "%s (翻訳)" -#: src/ParsedContent.php:221 +#: src/ParsedContent.php:300 msgid "Parsed Return:" msgstr "戻り値" -#: src/ParsedContent.php:237 +#: src/ParsedContent.php:316 msgid "Translated Return:" msgstr "戻り値 (翻訳)" -#: src/Registrations.php:134 +#: src/PostsPluginFilter.php:40 +msgid "All Plugins" +msgstr "プラグイン" + +#: src/Registrations.php:133 msgid "Function" msgstr "ファンクション" -#: src/Registrations.php:136 +#: src/Registrations.php:135 msgid "New Function" msgstr "ファンクションを新規追加" -#: src/Registrations.php:137 src/Registrations.php:167 -#: src/Registrations.php:197 src/Registrations.php:227 -#: src/Registrations.php:260 +#: src/Registrations.php:136 src/Registrations.php:166 +#: src/Registrations.php:196 src/Registrations.php:226 +#: src/Registrations.php:259 msgid "Add New" msgstr "新規追加" -#: src/Registrations.php:138 +#: src/Registrations.php:137 msgid "Add New Function" msgstr "ファンクションを新規追加" -#: src/Registrations.php:139 +#: src/Registrations.php:138 msgid "Edit Function" msgstr "ファンクションを編集" -#: src/Registrations.php:140 +#: src/Registrations.php:139 msgid "View Function" msgstr "ファンクションを見る" -#: src/Registrations.php:141 +#: src/Registrations.php:140 msgid "Search Functions" msgstr "ファンクションを検索" -#: src/Registrations.php:142 +#: src/Registrations.php:141 msgid "No Functions found" msgstr "ファンクションの結果がありません" -#: src/Registrations.php:143 +#: src/Registrations.php:142 msgid "No Functions found in trash" msgstr "ゴミ箱の中にファンクションがありません" -#: src/Registrations.php:144 +#: src/Registrations.php:143 msgid "Parent Function" msgstr "親ファンクション" -#: src/Registrations.php:164 +#: src/Registrations.php:163 msgid "Method" msgstr "関数" -#: src/Registrations.php:166 +#: src/Registrations.php:165 msgid "New Method" msgstr "関数を新規追加" -#: src/Registrations.php:168 +#: src/Registrations.php:167 msgid "Add New Method" msgstr "関数を新規追加" -#: src/Registrations.php:169 +#: src/Registrations.php:168 msgid "Edit Method" msgstr "関数を編集" -#: src/Registrations.php:170 +#: src/Registrations.php:169 msgid "View Method" msgstr "関数を見る" -#: src/Registrations.php:171 +#: src/Registrations.php:170 msgid "Search Methods" msgstr "関数を検索" -#: src/Registrations.php:172 +#: src/Registrations.php:171 msgid "No Methods found" msgstr "関数の結果がありません" -#: src/Registrations.php:173 +#: src/Registrations.php:172 msgid "No Methods found in trash" msgstr "ゴミ箱の中に関数がありません" -#: src/Registrations.php:174 +#: src/Registrations.php:173 msgid "Parent Method" msgstr "親関数" -#: src/Registrations.php:194 +#: src/Registrations.php:193 msgid "Class" msgstr "クラス" -#: src/Registrations.php:196 +#: src/Registrations.php:195 msgid "New Class" msgstr "クラスを新規追加" -#: src/Registrations.php:198 +#: src/Registrations.php:197 msgid "Add New Class" msgstr "クラスを新規追加" -#: src/Registrations.php:199 +#: src/Registrations.php:198 msgid "Edit Class" msgstr "クラスを編集" -#: src/Registrations.php:200 +#: src/Registrations.php:199 msgid "View Class" msgstr "クラスを見る" -#: src/Registrations.php:201 +#: src/Registrations.php:200 msgid "Search Classes" msgstr "クラスを検索" -#: src/Registrations.php:202 +#: src/Registrations.php:201 msgid "No Classes found" msgstr "クラスの結果がありません" -#: src/Registrations.php:203 +#: src/Registrations.php:202 msgid "No Classes found in trash" msgstr "ゴミ箱の中にクラスがありません" -#: src/Registrations.php:204 +#: src/Registrations.php:203 msgid "Parent Class" msgstr "親クラス" -#: src/Registrations.php:224 +#: src/Registrations.php:223 msgid "Hook" msgstr "フック" -#: src/Registrations.php:226 +#: src/Registrations.php:225 msgid "New Hook" msgstr "フックを新規追加" -#: src/Registrations.php:228 +#: src/Registrations.php:227 msgid "Add New Hook" msgstr "フックを新規追加" -#: src/Registrations.php:229 +#: src/Registrations.php:228 msgid "Edit Hook" msgstr "フックを編集" -#: src/Registrations.php:230 +#: src/Registrations.php:229 msgid "View Hook" msgstr "フックを見る" -#: src/Registrations.php:231 +#: src/Registrations.php:230 msgid "Search Hooks" msgstr "フックを検索" -#: src/Registrations.php:232 +#: src/Registrations.php:231 msgid "No Hooks found" msgstr "フックの結果がありません" -#: src/Registrations.php:233 +#: src/Registrations.php:232 msgid "No Hooks found in trash" msgstr "ゴミ箱の中にフックがありません" -#: src/Registrations.php:234 +#: src/Registrations.php:233 msgid "Parent Hook" msgstr "親フック" -#: src/Registrations.php:254 src/Registrations.php:256 -#: src/Registrations.php:258 src/Registrations.php:267 +#: src/Registrations.php:253 src/Registrations.php:255 +#: src/Registrations.php:257 src/Registrations.php:266 msgid "Reference Landing Pages" msgstr "レファレンスのランディングページ" -#: src/Registrations.php:257 +#: src/Registrations.php:256 msgid "Reference Landing Page" msgstr "レファレンスのランディングページ" -#: src/Registrations.php:259 +#: src/Registrations.php:258 msgid "New Reference Landing Page" msgstr "レファレンスのランディングページを新規追加" -#: src/Registrations.php:261 +#: src/Registrations.php:260 msgid "Add New Reference Landing Page" msgstr "レファレンスのランディングページを新規追加" -#: src/Registrations.php:262 +#: src/Registrations.php:261 msgid "Edit Reference Landing Page" msgstr "レファレンスのランディングページを編集" -#: src/Registrations.php:263 +#: src/Registrations.php:262 msgid "View Reference Landing Page" msgstr "レファレンスのランディングページを見る" -#: src/Registrations.php:264 +#: src/Registrations.php:263 msgid "Search Reference Landing Pages" msgstr "レファレンスのランディングページを検索" -#: src/Registrations.php:265 +#: src/Registrations.php:264 msgid "No Pages found" msgstr "レファレンスのランディングページの結果がありません" -#: src/Registrations.php:266 +#: src/Registrations.php:265 msgid "No Pages found in trash" msgstr "ゴミ箱の中にレファレンスのランディングページがありません" -#: src/Registrations.php:302 src/Registrations.php:304 -#: src/Registrations.php:318 +#: src/Registrations.php:301 src/Registrations.php:303 +#: src/Registrations.php:317 msgid "Files" msgstr "ファイル" -#: src/Registrations.php:305 +#: src/Registrations.php:304 msgctxt "taxonomy general name" msgid "File" msgstr "ファイル" -#: src/Registrations.php:306 +#: src/Registrations.php:305 msgid "Search Files" msgstr "ファイルを検索" -#: src/Registrations.php:308 +#: src/Registrations.php:307 msgid "All Files" msgstr "全てのファイル" -#: src/Registrations.php:309 +#: src/Registrations.php:308 msgid "Parent File" msgstr "親ファイル" -#: src/Registrations.php:310 +#: src/Registrations.php:309 msgid "Parent File:" msgstr "親ファイル:" -#: src/Registrations.php:311 +#: src/Registrations.php:310 msgid "Edit File" msgstr "ファイルを編集" -#: src/Registrations.php:312 +#: src/Registrations.php:311 msgid "Update File" msgstr "ファイルを更新" -#: src/Registrations.php:313 src/Registrations.php:314 +#: src/Registrations.php:312 src/Registrations.php:313 msgid "New File" msgstr "ファイルを新規追加" -#: src/Registrations.php:315 +#: src/Registrations.php:314 msgid "Files separated by comma" msgstr "コンマで区切られているファイル" -#: src/Registrations.php:316 +#: src/Registrations.php:315 msgid "Add or remove Files" msgstr "ファイルを新規追加・削除する" -#: src/Registrations.php:317 +#: src/Registrations.php:316 msgid "Choose from the most used Files" msgstr "よく使われているファイルから選択" -#: src/Registrations.php:358 +#: src/Registrations.php:357 msgid "@since" msgstr "@since" -#: src/Registrations.php:376 +#: src/Registrations.php:375 msgid "Namespaces" msgstr "ネームスペース" -#: src/Registrations.php:390 -msgid "Source Version" -msgstr "バージョン" - -#: src/Registrations.php:404 +#: src/Registrations.php:389 msgid "Source Type" msgstr "ソースタイプ" -#: src/Registrations.php:420 src/Registrations.php:515 +#: src/Registrations.php:405 src/Registrations.php:500 msgid "Plugin" msgstr "プラグイン" -#: src/Registrations.php:428 src/Registrations.php:519 +#: src/Registrations.php:413 src/Registrations.php:504 msgid "Theme" msgstr "テーマ" -#: src/Registrations.php:436 src/Registrations.php:523 +#: src/Registrations.php:421 src/Registrations.php:508 msgid "Composer Package" msgstr "Composerパッケージ" -#: src/Registrations.php:448 +#: src/Registrations.php:433 msgid "Role" msgstr "区分" -#: src/Registrations.php:462 +#: src/Registrations.php:447 msgid "Display" msgstr "表示系" -#: src/Registrations.php:463 +#: src/Registrations.php:448 msgid "Condition" msgstr "条件判断" -#: src/Registrations.php:464 +#: src/Registrations.php:449 msgid "Utility" msgstr "ユーティリティー" -#: src/Registrations.php:465 +#: src/Registrations.php:450 msgid "Setter" msgstr "データセット" -#: src/Registrations.php:466 +#: src/Registrations.php:451 msgid "Getter" msgstr "データ取得" -#: src/Registrations.php:672 +#: src/Registrations.php:657 msgctxt "separator" msgid " or " msgstr "" + +#: src/SourceTypeTerm.php:53 +msgid "Item Image" +msgstr "" + +#: src/SourceTypeTerm.php:56 +msgid "Pick a item image to make an association.(svg Only)" +msgstr "" + +#: dist/js/Views/ImporterPage/App.js:10297 +#: dist/js/Views/ImporterPage/App.js:10311 +#: dist/js/Views/ImporterPage/App.js:10318 +msgid "Import" +msgstr "インポート" + +#: dist/js/Views/ImporterPage/App.js:10299 +msgid "Enter the folder name of the plugin/theme/composer-package" +msgstr "プラグイン・テーマ・Composerパッケージのフォルダー名を入力してください。" + +#: dist/js/Views/ImporterPage/App.js:10308 +msgid "Trash old references" +msgstr "過去のレファレンスをゴミ箱に移動" + +#: dist/js/Views/ImporterPage/App.js:10314 +msgid "Importing..." +msgstr "インポート中..." + +#: dist/js/Views/ImporterPage/App.js:10448 +msgid "Updated" +msgstr "更新しました。" + +#: dist/js/Views/ImporterPage/App.js:10462 +msgid "Source folders parent path" +msgstr "ソースの親フォルダー" + +#: dist/js/Views/ImporterPage/App.js:10464 +msgid "Enter the absolute path to the location of the source folders" +msgstr "ソースフォルダーが入っている親フォルダーの絶対パス" + +#: dist/js/Views/ImporterPage/App.js:10471 +msgid "Updating..." +msgstr "更新中..." + +#: dist/js/Views/ImporterPage/App.js:10475 +msgid "Update" +msgstr "パスを更新する" diff --git a/src/Importer/Importer.php b/src/Importer/Importer.php index 6fa594a..3a82172 100644 --- a/src/Importer/Importer.php +++ b/src/Importer/Importer.php @@ -177,6 +177,7 @@ public function __construct(ImportConfig $source_type_meta, $trash_old_refs = fa * @param array $data * @param bool $skip_sleep Optional; defaults to false. If true, the sleep() calls are skipped. * @param bool $import_ignored_functions Optional; defaults to false. If true, functions marked `@ignore` will be imported. + * @throws CliErrorException Thrown when an error occurs. * @return void */ public function import(array $data, $skip_sleep = false, $import_ignored_functions = false) { @@ -970,6 +971,18 @@ public function importItem(array $data, $parent_post_id = 0, $import_ignored = f $anything_updated[] = update_post_meta($post_id, '_wp_parser_namespace', (string)addslashes($data['namespace'])); } + $important = wp_list_filter($data['doc']['tags'], ['name' => 'important']); + $pimportant = get_post_meta($post_id, '_wp-parser_important', true); + // only set important if it doesn't already exist so that updates + // to this value from the admin console aren't overridden + if ($pimportant === '') { + if (!empty($important)) { + $anything_updated[] = update_post_meta($post_id, '_wp-parser_important', true); + } else { + $anything_updated[] = update_post_meta($post_id, '_wp-parser_important', false); + } + } + // We have to add slashes so that namespace slashes aren't stripped by update_post_meta // Without the slashes it's impossible to create reference links for class/method references with PSR-4 namespaces $anything_updated[] = update_post_meta($post_id, '_wp-parser_tags', wp_slash($data['doc']['tags'])); diff --git a/src/ParsedContent.php b/src/ParsedContent.php index 373309c..2d3fcd3 100644 --- a/src/ParsedContent.php +++ b/src/ParsedContent.php @@ -2,6 +2,8 @@ namespace Aivec\Plugins\DocParser; +use AVCPDP\Aivec\Core\CSS\Loader; + /** * Class to handle editing parsed content for the Function-, Class-, Hook-, * and Method-editing screens. @@ -50,10 +52,12 @@ public function __construct() { public function init() { // Data. add_action('add_meta_boxes', [$this, 'addMetaBoxes']); - add_action('save_post', [$this, 'savePost']); + add_action('save_post', [$this, 'saveParsedContent']); + add_action('save_post', [$this, 'saveItemImportance']); + add_action('admin_enqueue_scripts', [get_class(), 'loadAssets'], 10, 1); // Register meta fields. - register_meta('post', 'wporg_parsed_content', 'wp_kses_post', '__return_false'); + register_meta('post', 'phpdoc_parsed_content', 'wp_kses_post', '__return_false'); foreach ($this->post_types as $ptype) { foreach ($this->meta_fields as $key) { register_post_meta( @@ -68,6 +72,30 @@ public function init() { } } + /** + * Loads admin edit page assets + * + * @author Evan D Shaw + * @param string $screenid + * @return void + */ + public static function loadAssets($screenid) { + if ($screenid !== 'post.php') { + return; + } + + $post_id = isset($_REQUEST['post']) ? (int)$_REQUEST['post'] : 0; + if ($post_id < 1) { + return; + } + + if (!in_array(get_post_type($post_id), avcpdp_get_parsed_post_types(), true)) { + return; + } + + Loader::loadCoreCss(); + } + /** * Adds parsed content meta box and removes `postexcerpt` meta box * @@ -79,16 +107,66 @@ public function addMetaBoxes() { if (in_array($screen, $this->post_types, true)) { remove_meta_box('postexcerpt', $screen, 'normal'); add_meta_box( - 'wporg_parsed_content', + 'phpdoc_parsed_content', __('Parsed Content', 'wp-parser'), [$this, 'addParsedMetaBox'], $screen, 'normal', 'high' ); + add_meta_box( + 'phpdoc_item_importance', + __('Item Importance', 'wp-parser'), + [$this, 'addItemImportanceMetaBox'], + $screen, + 'side', + 'high' + ); } } + /** + * Shows item importance meta box on post edit page for `wp-parser-*` post types + * + * @author Evan D Shaw + * @param \WP_Post $post Current post object. + * @return void + */ + public function addItemImportanceMetaBox($post) { + wp_nonce_field('phpdoc-item-importance', 'phpdoc-item-importance-nonce'); + $important = (int)get_post_meta($post->ID, '_wp-parser_important', true); + ?> +
          +
          + + + /> +
          +
          + + + /> +
          +
          + ID, 'translated_description', true); $translated_return = (string)get_post_meta($post->ID, 'translated_return', true); - wp_nonce_field('wporg-parsed-content', 'wporg-parsed-content-nonce'); + wp_nonce_field('phpdoc-parsed-content', 'phpdoc-parsed-content-nonce'); ?> @@ -137,7 +215,7 @@ public function addParsedMetaBox($post) { ID, $translated_key, true); + $clean_name = str_replace('$', '', $name); + $translated_key = "translated_{$clean_name}"; + $translated_key_val = (string)get_post_meta($post->ID, $translated_key, true); ?> + + + + + + + + + + + + + $since) : ?> + + + + + + + +
          - +
          @@ -172,7 +250,7 @@ public function addParsedMetaBox($post) {
          - +
          @@ -219,7 +297,7 @@ public function addParsedMetaBox($post) {
          - +
          @@ -347,19 +425,18 @@ private function getParamMetaKeys($post_id) { } /** - * Handle saving parsed content. + * Handles saving parsed content. * * Excerpt (short description) saving is handled by core. * * @param int $post_id Post ID. * @return void */ - public function savePost($post_id) { - if (empty($_POST['wporg-parsed-content-nonce']) || !wp_verify_nonce($_POST['wporg-parsed-content-nonce'], 'wporg-parsed-content')) { + public function saveParsedContent($post_id) { + if (empty($_POST['phpdoc-parsed-content-nonce']) || !wp_verify_nonce($_POST['phpdoc-parsed-content-nonce'], 'phpdoc-parsed-content')) { return; } - // No cheaters! if (!current_user_can('manage_options')) { return; } @@ -370,4 +447,22 @@ public function savePost($post_id) { empty($_POST[$key]) ? delete_post_meta($post_id, $key) : update_post_meta($post_id, $key, $_POST[$key]); } } + + /** + * Handles saving item importance + * + * @param int $post_id Post ID. + * @return void + */ + public function saveItemImportance($post_id) { + if (empty($_POST['phpdoc-item-importance-nonce']) || !wp_verify_nonce($_POST['phpdoc-item-importance-nonce'], 'phpdoc-item-importance')) { + return; + } + + if (!current_user_can('manage_options')) { + return; + } + + update_post_meta($post_id, '_wp-parser_important', (bool)(int)$_POST['item_importance']); + } } diff --git a/src/Views/ImporterPage/Import.tsx b/src/Views/ImporterPage/Import.tsx index 7ff9ca6..ff76079 100644 --- a/src/Views/ImporterPage/Import.tsx +++ b/src/Views/ImporterPage/Import.tsx @@ -51,7 +51,7 @@ const Import = ({ return (

          {__('Import', 'wp-parser')}

          -
          +
          {__('Enter the folder name of the plugin/theme/composer-package', 'wp-parser')}
          @@ -59,7 +59,7 @@ const Import = ({

          {__('Source folders parent path', 'wp-parser')}

          -
          +
          {__('Enter the absolute path to the location of the source folders', 'wp-parser')}
          From 9708fbed9cc59499c3557fe8019e003a9f926b37 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Fri, 29 Oct 2021 12:38:25 +0900 Subject: [PATCH 52/66] fix: fix bundle script erroneously removing nikic/php-parser package --- bundle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bundle b/bundle index b697008..18e8a49 100755 --- a/bundle +++ b/bundle @@ -11,14 +11,14 @@ require_once(__DIR__ . '/vendor/autoload.php'); (new Bundler('wp-phpdoc-parser')) ->setFoldersToInclude(['dist', 'languages', 'src', 'vendor']) ->setFilesToInclude(['plugin.php']) - ->setTargetsToCleanBeforeBuild(['dist', 'vendor']) + ->setTargetsToCleanBeforeBuild(['dist']) ->setBuildCallback(function () { passthru('npm run build:prod'); passthru('composer build'); }) ->setTargetsToCleanAfterBuild([ 'vendor/aivec', - 'vendor/nikic', + 'vendor/nikic/fast-route', 'vendor/bin', ]) ->setCleanupCallback(function () { From b5e7d47a63a4b2b30cbaae40d550b12dcbe08b3c Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Fri, 29 Oct 2021 15:58:41 +0900 Subject: [PATCH 53/66] feat: on admin posts list page, add abilty to order by item importance --- src/Master.php | 1 + .../ItemImportance/ItemImportance.php | 156 ++++++++++++++++++ .../ItemImportance/item-importance.css | 7 + src/Queries.php | 4 + 4 files changed, 168 insertions(+) create mode 100644 src/PostAddons/ItemImportance/ItemImportance.php create mode 100644 src/PostAddons/ItemImportance/item-importance.css diff --git a/src/Master.php b/src/Master.php index 57681cd..8f90f26 100644 --- a/src/Master.php +++ b/src/Master.php @@ -46,6 +46,7 @@ public function init() { (new Registrations())->init(); (new Explanations\Explanations())->init(); (new ParsedContent())->init(); + PostAddons\ItemImportance\ItemImportance::init(); Queries::init(); Formatting::init(); SourceTypeTerm::init(); diff --git a/src/PostAddons/ItemImportance/ItemImportance.php b/src/PostAddons/ItemImportance/ItemImportance.php new file mode 100644 index 0000000..25ec8eb --- /dev/null +++ b/src/PostAddons/ItemImportance/ItemImportance.php @@ -0,0 +1,156 @@ + + * @return void + */ + public static function init() { + add_action('pre_get_posts', [get_class(), 'preGetPosts'], 10, 1); + // Add admin post listing column for item importance indicator. + add_filter('manage_posts_columns', [get_class(), 'addPostColumns']); + // Output checkmark in item importance column if post is important. + add_action('manage_posts_custom_column', [get_class(), 'handleColumnData'], 10, 2); + foreach (avcpdp_get_parsed_post_types() as $ptype) { + add_filter("manage_edit-{$ptype}_sortable_columns", [get_class(), 'filterSortableCols'], 10, 1); + } + add_action('admin_enqueue_scripts', [get_class(), 'loadAssets'], 10, 1); + } + + /** + * Handles various custom query vars + * + * @param \WP_Query $query + * @return void + */ + public static function preGetPosts($query) { + if (!is_admin()) { + return; + } + + $post_type = isset($_REQUEST['post_type']) ? (string)$_REQUEST['post_type'] : ''; + if (empty($post_type)) { + return; + } + + if (!avcpdp_is_parsed_post_type($post_type)) { + return; + } + + $mquery = $query->get('meta_query', []); + $mquery[] = ['key' => '_wp-parser_important']; + $query->set('meta_query', $mquery); + } + + /** + * Loads admin post list page assets + * + * @author Evan D Shaw + * @param string $screenid + * @return void + */ + public static function loadAssets($screenid) { + if ($screenid !== 'edit.php') { + return; + } + + $post_type = isset($_REQUEST['post_type']) ? (string)$_REQUEST['post_type'] : ''; + if (empty($post_type)) { + return; + } + + if (!avcpdp_is_parsed_post_type($post_type)) { + return; + } + + Loader::loadCoreCss(); + wp_enqueue_style( + 'avcpdp-postaddons-item-importance', + AVCPDP_PLUGIN_URL . '/src/PostAddons/ItemImportance/item-importance.css', + [], + AVCPDP_VERSION + ); + } + + /** + * Makes custom columns sortable + * + * @author Evan D Shaw + * @param array $sortable_columns + * @return array + */ + public static function filterSortableCols($sortable_columns) { + $sortable_columns['item_importance'] = 'meta_value'; + return $sortable_columns; + } + + /** + * Adds custom columns in the admin listing of posts for parsed post types + * + * Custom columns include: + * - Item Importance + * + * Also removes the comment column since comments aren't supported + * + * @param array $columns Associative array of post column ids and labels. + * @return array + */ + public static function addPostColumns($columns) { + if (empty($_GET['post_type'])) { + return $columns; + } + + if (!avcpdp_is_parsed_post_type($_GET['post_type'])) { + return $columns; + } + + $index = array_search('title', array_keys($columns)); + $pos = false === $index ? count($columns) : $index + 1; + + $col_data = [ + 'item_importance' => sprintf( + '%s', + esc_attr__('Important?', 'wp-parser'), + esc_html__('Important?', 'wp-parser') + ), + ]; + $columns = array_merge(array_slice($columns, 0, $pos), $col_data, array_slice($columns, $pos)); + + // remove comments col + unset($columns['comments']); + + return $columns; + } + + /** + * Outputs an indicator for the explanations column if post has an explanation. + * + * @param string $column_name The name of the column. + * @param int $post_id The ID of the post. + * @return void + */ + public static function handleColumnData($column_name, $post_id) { + if ('item_importance' === $column_name) { + $importance = (bool)(int)get_post_meta($post_id, '_wp-parser_important', true); + if ($importance == true) { + ?> +
          + + + +
          + query['post_type']) ? $query->query['post_type'] : ''; From eca26a6fd657eb0538159f64c7d5d867b47da988 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Mon, 1 Nov 2021 17:57:58 +0900 Subject: [PATCH 54/66] feat: add method for retrieving a hierarchical array for a param hash array return type --- src/Formatting.php | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/Formatting.php b/src/Formatting.php index 494f8ef..07361d8 100644 --- a/src/Formatting.php +++ b/src/Formatting.php @@ -522,6 +522,76 @@ public static function convertListsToMarkup($text) { return $text; } + /** + * Returns hierarchical array for a param hash array type + * + * @author Evan D Shaw + * @param string $text + * @param array $pieces + * @return (int|array)[] + */ + public static function getParamHashArrayRecursive($text, $pieces = []) { + if (!$text || '{' != $text[0]) { + return [ + 'numparsed' => 0, + 'pieces' => [], + ]; + } + + $index = 0; + $noprocessrange = 0; + $text = trim(substr($text, 1, -1)); + $text = str_replace('@type', "\n@type", $text); + $parts = explode("\n", $text); + + foreach ($parts as $part) { + if ($index < $noprocessrange) { + $index++; + continue; + } + + $part = preg_replace('/\s+/', ' ', $part); + list( $wordtype, $type, $name, $rawdescription ) = explode(' ', $part . ' ', 4); // extra spaces ensure we'll always have 4 items. + $description = trim($rawdescription); + + $piece = []; + if ('@type' != $wordtype) { + $pieces['description'] = $part; + } else { + $piece['name'] = $name; + $piece['type'] = $type; + $piece['wordtype'] = $wordtype; + $piece['description'] = $description; + } + + // Handle nested hashes. + if (($description && '{' === $description[0]) || '{' === $name) { + $deschashpieces = explode('{', $rawdescription); + $nestedtext = join(' ', array_slice($parts, $index + 1)); + $nestedtext = '{' . $deschashpieces[1] . ' ' . $nestedtext; + $results = self::getParamHashArrayRecursive($nestedtext, $piece); + $noprocessrange = $index + $results['numparsed']; + $piece['pieces'] = $results['pieces']; + $pieces['pieces'][] = $piece['pieces']; + } elseif ('}' === substr($description, -1)) { + $pieces['pieces'][] = $piece; + return [ + 'numparsed' => $index + 1, + 'pieces' => $pieces, + ]; + } elseif (!empty($piece)) { + $pieces['pieces'][] = $piece; + } + + $index++; + } + + return [ + 'numparsed' => $index, + 'pieces' => $pieces, + ]; + } + /** * Formats the output of params defined using hash notation. * From 9c0ff9a5197a18266de684cc31f90a5c2cf9cf0d Mon Sep 17 00:00:00 2001 From: Seiyu Inoue Date: Tue, 2 Nov 2021 12:25:49 +0900 Subject: [PATCH 55/66] add-post-edit-items --- src/ParsedContent.php | 121 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 118 insertions(+), 3 deletions(-) diff --git a/src/ParsedContent.php b/src/ParsedContent.php index 2d3fcd3..c72f5c3 100644 --- a/src/ParsedContent.php +++ b/src/ParsedContent.php @@ -31,6 +31,8 @@ class ParsedContent 'translated_summary', 'translated_description', 'translated_return', + 'translated_deprecated', + 'translated_sinces', ]; /** @@ -178,9 +180,13 @@ public function addParsedMetaBox($post) { $excerpt = $post->post_excerpt; $params = self::getParams($post->ID); $return = self::getReturn($post->ID); + $deprecated = self::getDeprecated($post->ID); + $sinces = self::getSinces($post->ID); $translated_summary = (string)get_post_meta($post->ID, 'translated_summary', true); $translated_description = (string)get_post_meta($post->ID, 'translated_description', true); $translated_return = (string)get_post_meta($post->ID, 'translated_return', true); + $translated_deprecated = (string)get_post_meta($post->ID, 'translated_deprecated', true); + $translated_sinces = (array)get_post_meta($post->ID, 'translated_sinces', true); wp_nonce_field('phpdoc-parsed-content', 'phpdoc-parsed-content-nonce'); ?> @@ -266,9 +272,9 @@ public function addParsedMetaBox($post) {
          @@ -330,6 +336,58 @@ public function addParsedMetaBox($post) {
          + + +
          + false, + 'tinymce' => false, + 'quicktags' => false, + 'textarea_rows' => 2, + ]); + ?> +
          +
          + +
          + + +
          + false, + 'tinymce' => false, + 'quicktags' => false, + 'textarea_rows' => 2, + ]); + ?> +
          +
          'deprecated']); + + // If there is no explicit or non-"void" return value, don't display one. + if (empty($deprecated)) { + return ''; + } + + $deprecated = array_shift($deprecated); + return htmlspecialchars($deprecated['content']); + } + + /** + * Retrieve sinces as a key value array + * + * @param int $post_id + * @return array + */ + public static function getSinces($post_id = null) { + if (empty($post_id)) { + $post_id = get_the_ID(); + } + + $sinces = []; + $tags = get_post_meta($post_id, '_wp-parser_tags', true); + + if (!$tags) { + return $sinces; + } + foreach ($tags as $tag) { + if (!empty($tag['name']) && 'since' == $tag['name']) { + $sinces[] = htmlspecialchars($tag['content']); + } + } + return $sinces; + } + /** * Returns indexed array of parameter post meta keys * From c9821ae607ee5ba1f5305505c994543f2456e35c Mon Sep 17 00:00:00 2001 From: Seiyu Inoue Date: Tue, 2 Nov 2021 16:35:27 +0900 Subject: [PATCH 56/66] Review content reflected --- src/ParsedContent.php | 77 +++++++++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 17 deletions(-) diff --git a/src/ParsedContent.php b/src/ParsedContent.php index c72f5c3..a431bb5 100644 --- a/src/ParsedContent.php +++ b/src/ParsedContent.php @@ -336,11 +336,30 @@ public function addParsedMetaBox($post) { - + + + +

          + + + + + +
          + +
          + + +
          + + + -
        $2', $text ); $text = preg_replace('~(
      • )(\s*)~smU', '$1
      $2', $text); - // Closethe list if it hasn't been closed and it's the end of the description. + // Close the list if it hasn't been closed and it's the end of the description. if ('
    • ' === substr(trim($text), -5)) { $text .= '
    '; } @@ -591,6 +595,7 @@ public static function getParamHashMapRecursive($text, $pieces = [], $key = '') // need to make sure that if the last character is a closing brace it // isn't for a link } elseif ('}' === substr($description, -1) && !$islinkbrace) { + $pieces[$name]['value'] = trim(substr($description, 0, -1)); return $pieces; } diff --git a/src/ParsedContent.php b/src/ParsedContent.php index 7259e31..94892b3 100644 --- a/src/ParsedContent.php +++ b/src/ParsedContent.php @@ -30,6 +30,7 @@ class ParsedContent public $meta_fields = [ 'translated_summary', 'translated_description', + 'translated_params', 'translated_return', 'translated_deprecated', 'translated_sinces', @@ -184,9 +185,10 @@ public function addParsedMetaBox($post) { $sinces = self::getSinces($post->ID); $translated_summary = (string)get_post_meta($post->ID, 'translated_summary', true); $translated_description = (string)get_post_meta($post->ID, 'translated_description', true); + $translated_params = (array)get_post_meta($post->ID, 'translated_params', true); + $translated_return = get_post_meta($post->ID, 'translated_return', true); $translated_deprecated = (string)get_post_meta($post->ID, 'translated_deprecated', true); $translated_sinces = (array)get_post_meta($post->ID, 'translated_sinces', true); - $translated_return = get_post_meta($post->ID, 'translated_return', true); wp_nonce_field('phpdoc-parsed-content', 'phpdoc-parsed-content-nonce'); ?> @@ -252,50 +254,58 @@ public function addParsedMetaBox($post) { $data) : ?> - - - -
    - -
    - - - - + + + + +
    + +
    + + + + +
    -
    - - -
    - + + +
    + + - - + + + + + + + +
    + false, + 'tinymce' => false, + 'quicktags' => false, + 'textarea_rows' => 2, + ] + ); + ?> +
    + + + + ID, $translated_key, true); + $hasha = $data['hierarchical']; + $hasha = [$name => $hasha]; + self::hashParamRowsRecursive('translated_params', $hasha, $translated_params); ?> - - - - - -
    - false, - 'tinymce' => false, - 'quicktags' => false, - 'textarea_rows' => 10, - ]); - ?> -
    - - @@ -359,7 +369,7 @@ public function addParsedMetaBox($post) { @@ -462,19 +472,21 @@ public function addParsedMetaBox($post) { * Recursively displays table rows for a hash type parameter * * @author Evan D Shaw + * @param string $namekey * @param array $pieces - * @param array $treturn + * @param array $tpieces * @param string $namespace * @param int $level Recursion level * @return void */ - public static function hashParamRowsRecursive($pieces, $treturn, $namespace = '', $level = 0) { + public static function hashParamRowsRecursive($namekey, $pieces, $tpieces, $namespace = '', $level = 0) { $index = 0; foreach ($pieces as $key => $piece) : if (!isset($piece['value']) || is_array($piece['value'])) { self::hashParamRowsRecursive( + $namekey, $piece, - isset($treturn[$key]) ? $treturn[$key] : [], + isset($tpieces[$key]) ? $tpieces[$key] : [], "{$namespace}[{$key}]", $level + 1 ); @@ -482,8 +494,8 @@ public static function hashParamRowsRecursive($pieces, $treturn, $namespace = '' } $value = $piece['value']; $tvalue = ''; - if (!empty($value) && !is_array($value)) { - $tvalue = isset($treturn[$key]) ? $treturn[$key] : ''; + if (!is_array($value)) { + $tvalue = isset($tpieces[$key]) ? $tpieces[$key] : ''; } $padding = $level; if ($level > 0 && $key === 'description') { @@ -522,7 +534,7 @@ public static function hashParamRowsRecursive($pieces, $treturn, $namespace = ''
    false, 'tinymce' => false, 'quicktags' => false, @@ -562,8 +574,19 @@ public static function getParams($post_id = null) { $types[$i] = sprintf('%s', $v, $v); } + $content = htmlspecialchars((string)$params[$tag['variable']]['content']); $params[$tag['variable']]['types'] = implode('|', $types); - $params[$tag['variable']]['content'] = htmlspecialchars($params[$tag['variable']]['content']); + $params[$tag['variable']]['content'] = $content; + $params[$tag['variable']]['ishash'] = false; + $params[$tag['variable']]['hierarchical'] = null; + if ('{' == $content[0]) { + $params[$tag['variable']]['ishash'] = true; + $params[$tag['variable']]['hierarchical'] = Formatting::getParamHashMapRecursive( + $content, + [], + $params[$tag['variable']]['variable'] + ); + } } } } @@ -595,7 +618,6 @@ public static function getReturn($post_id = null) { 'type' => '', 'ishash' => false, 'content' => '', - 'parts' => null, 'hierarchical' => null, ]; } @@ -604,13 +626,9 @@ public static function getReturn($post_id = null) { $types = $return['types']; $type = empty($types) ? '' : esc_html(implode('|', $types)); $content = htmlspecialchars($return['content']); - $parts = null; $hierarchical = null; $ishash = '{' == $content[0]; if ($ishash) { - $text = trim(substr($content, 1, -1)); - $text = str_replace('@type', "\n@type", $text); - $parts = explode("\n", $text); $hierarchical = Formatting::getParamHashMapRecursive($content); } @@ -618,7 +636,6 @@ public static function getReturn($post_id = null) { 'type' => $type, 'ishash' => $ishash, 'content' => $content, - 'parts' => $parts, 'hierarchical' => $hierarchical, ]; } From 638aa2cd0a6a0d3b687bf574ad534517018db214 Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Fri, 5 Nov 2021 16:54:18 +0900 Subject: [PATCH 62/66] feat: finish making ALL post content translatable --- src/Formatting.php | 156 ++++--------- src/Master.php | 2 +- .../ParsedContent}/ParsedContent.php | 194 ++++------------ .../ParsedContent/parsed-content.css | 4 + src/api-functions.php | 208 ++++++++++++++++++ 5 files changed, 303 insertions(+), 261 deletions(-) rename src/{ => PostAddons/ParsedContent}/ParsedContent.php (79%) create mode 100644 src/PostAddons/ParsedContent/parsed-content.css diff --git a/src/Formatting.php b/src/Formatting.php index 49d6884..9b931b1 100644 --- a/src/Formatting.php +++ b/src/Formatting.php @@ -36,11 +36,6 @@ public static function doInit() { add_filter('avcapps-parameter-type', [get_class(), 'autolinkReferences']); - add_filter('avcpdp-format-description', [get_class(), 'autolinkReferences']); - add_filter('avcpdp-format-description', [get_class(), 'fixParamHashFormatting'], 9); - add_filter('avcpdp-format-description', [get_class(), 'fixParamDescriptionHtmlAsCode']); - add_filter('avcpdp-format-description', [get_class(), 'convertListsToMarkup']); - add_filter('avcpdp-format-hash-param-description', [get_class(), 'autolinkReferences']); add_filter('avcpdp-format-hash-param-description', [get_class(), 'fixParamDescriptionParsedownBug']); @@ -285,7 +280,6 @@ public static function formatParamDescription($text) { // Convert any @link or @see to actual link. $text = self::makeDoclinkClickable($text); $text = self::autolinkReferences($text); - // $text = self::fixParamHashFormatting($text); $text = self::fixParamDescriptionHtmlAsCode($text); $text = self::convertListsToMarkup($text); @@ -531,11 +525,12 @@ public static function convertListsToMarkup($text) { * * @author Evan D Shaw * @param string $text + * @param array $tpieces Translated pieces * @param array $pieces * @param string $key * @return array */ - public static function getParamHashMapRecursive($text, $pieces = [], $key = '') { + public static function getParamHashMapRecursive($text, $tpieces = [], $pieces = [], $key = '') { if (!$text || '{' != $text[0]) { return []; } @@ -558,19 +553,44 @@ public static function getParamHashMapRecursive($text, $pieces = [], $key = '') $description = trim($rawdescription); if ('@type' != $wordtype) { - $pieces['description'] = [ - 'name' => $key, - 'type' => 'array', - 'wordtype' => null, - 'value' => $part, - ]; + $tvalue = isset($tpieces['description']) ? $tpieces['description'] : ''; + $value = $part; + if (is_string($tvalue) && !empty($tvalue)) { + $value = $tvalue; + } + $value = rtrim(trim(self::formatParamDescription($value)), '}'); + $types = avcpdp_build_param_types(['array']); + $pieces['description'] = array_merge( + [ + 'name' => $key, + 'cleanname' => str_replace('$', '', $key), + 'wordtype' => null, + 'raw_value' => $part, + 'raw_translated_value' => $tvalue, + 'value' => $value, + ], + $types + ); } else { - $pieces[$name] = [ - 'name' => $name, - 'type' => $type, - 'wordtype' => $wordtype, - 'value' => $description, - ]; + $tvalue = isset($tpieces[$name]) ? $tpieces[$name] : ''; + $value = $description; + if (is_string($tvalue) && !empty($tvalue)) { + $value = $tvalue; + } + $value = rtrim(trim(self::formatParamDescription($value)), '}'); + $types = explode('|', $type); + $types = avcpdp_build_param_types($types); + $pieces[$name] = array_merge( + [ + 'name' => $name, + 'cleanname' => str_replace('$', '', $name), + 'wordtype' => $wordtype, + 'raw_value' => $description, + 'raw_translated_value' => $tvalue, + 'value' => $value, + ], + $types + ); } $islinkbrace = false; @@ -588,14 +608,18 @@ public static function getParamHashMapRecursive($text, $pieces = [], $key = '') $deschashpieces = explode('{', $rawdescription, 2); $nestedtext = join(' ', array_slice($parts, $index + 1)); $nestedtext = '{' . $deschashpieces[1] . ' ' . $nestedtext; - $pieces[$name] = self::getParamHashMapRecursive($nestedtext, [], $name); + $pieces[$name] = self::getParamHashMapRecursive( + $nestedtext, + isset($tpieces[$name]) ? (array)$tpieces[$name] : [], + [], + $name + ); $numprocessed = self::countNestedHashParamLeafNodes($pieces[$name]); $noprocessrange = $index + $numprocessed; // Sometimes nested hashes contain links (eg. {@see 'hook_name'}) so we // need to make sure that if the last character is a closing brace it // isn't for a link } elseif ('}' === substr($description, -1) && !$islinkbrace) { - $pieces[$name]['value'] = trim(substr($description, 0, -1)); return $pieces; } @@ -625,96 +649,6 @@ public static function countNestedHashParamLeafNodes($na) { return $num; } - /** - * Formats the output of params defined using hash notation. - * - * This is a temporary measure until the parser parses the hash notation - * into component elements that the theme could then handle and style - * properly. - * - * Also, as a stopgap this is going to begin as a barebones hack to simply - * keep the text looking like one big jumble. - * - * @param string $text The content for the param. - * @return string - */ - public static function fixParamHashFormatting($text) { - // Don't do anything if this isn't a hash notation string. - if (!$text || '{' != $text[0]) { - return $text; - } - - $new_text = ''; - $text = trim(substr($text, 1, -1)); - $text = str_replace('@type', "\n@type", $text); - - $in_list = false; - $parts = explode("\n", $text); - foreach ($parts as $part) { - $part = preg_replace('/\s+/', ' ', $part); - list( $wordtype, $type, $name, $description ) = explode(' ', $part . ' ', 4); // extra spaces ensure we'll always have 4 items. - $description = trim($description); - - $tclass = 'ref-arg-type'; - $type = apply_filters('avcpdp_filter_param_hash_type', $type, $text); - if (strpos($type, '\\') !== false) { - $type = ltrim($type, '\\'); - $tclass .= ' ref-arg-type--class'; - } - - $description = apply_filters('avcpdp-format-hash-param-description', $description); - - $skip_closing_li = false; - - // Handle nested hashes. - if (($description && '{' === $description[0]) || '{' === $name) { - $description = ltrim($description, '{') . '
      '; - $skip_closing_li = true; - } elseif ('}' === substr($description, -1)) { - $description = substr($description, 0, -1) . "
    \n"; - } - - if ('@type' != $wordtype) { - if ($in_list) { - $in_list = false; - $new_text .= "\n"; - } - - $new_text .= $part; - } else { - if ($in_list) { - $new_text .= '
  • '; - } else { - $new_text .= '
    • '; - $in_list = true; - } - - // Normalize argument name. - if ($name === '{') { - // No name is specified, generally indicating an array of arrays. - $name = ''; - } else { - // The name is defined as a variable, so remove the leading '$'. - $name = ltrim($name, '$'); - } - if ($name) { - $new_text .= "'{$name}'
      "; - } - $new_text .= "({$type}){$description}"; - if (!$skip_closing_li) { - $new_text .= '
    • '; - } - $new_text .= "\n"; - } - } - - if ($in_list) { - $new_text .= "
    \n"; - } - - return $new_text; - } - /** * Fix Parsedown bug that introduces unbalanced 'code' tags. * diff --git a/src/Master.php b/src/Master.php index 8f90f26..8ec1b3c 100644 --- a/src/Master.php +++ b/src/Master.php @@ -45,7 +45,7 @@ public function init() { (new Importer\Relationships())->init(); (new Registrations())->init(); (new Explanations\Explanations())->init(); - (new ParsedContent())->init(); + (new PostAddons\ParsedContent\ParsedContent())->init(); PostAddons\ItemImportance\ItemImportance::init(); Queries::init(); Formatting::init(); diff --git a/src/ParsedContent.php b/src/PostAddons/ParsedContent/ParsedContent.php similarity index 79% rename from src/ParsedContent.php rename to src/PostAddons/ParsedContent/ParsedContent.php index 94892b3..86f0607 100644 --- a/src/ParsedContent.php +++ b/src/PostAddons/ParsedContent/ParsedContent.php @@ -1,7 +1,8 @@ post_content; $excerpt = $post->post_excerpt; - $params = self::getParams($post->ID); - $return = self::getReturn($post->ID); - $deprecated = self::getDeprecated($post->ID); - $sinces = self::getSinces($post->ID); $translated_summary = (string)get_post_meta($post->ID, 'translated_summary', true); $translated_description = (string)get_post_meta($post->ID, 'translated_description', true); - $translated_params = (array)get_post_meta($post->ID, 'translated_params', true); - $translated_return = get_post_meta($post->ID, 'translated_return', true); - $translated_deprecated = (string)get_post_meta($post->ID, 'translated_deprecated', true); - $translated_sinces = (array)get_post_meta($post->ID, 'translated_sinces', true); + $params = avcpdp_get_params($post->ID); + $return = avcpdp_get_return($post->ID); + $deprecated = avcpdp_get_deprecated($post->ID); + $sinces = avcpdp_get_sinces($post->ID); wp_nonce_field('phpdoc-parsed-content', 'phpdoc-parsed-content-nonce'); ?> @@ -263,13 +266,13 @@ public function addParsedMetaBox($post) {
    - +
  • -
    +
    @@ -285,8 +288,12 @@ public function addParsedMetaBox($post) {
    false, @@ -303,8 +310,8 @@ public function addParsedMetaBox($post) { $hasha]; - self::hashParamRowsRecursive('translated_params', $hasha, $translated_params); + $hasha['description']['name'] = $name; + self::hashParamRowsRecursive('translated_params', [$name => $hasha]); ?> @@ -329,7 +336,7 @@ public function addParsedMetaBox($post) {
    - +
    @@ -351,10 +358,10 @@ public function addParsedMetaBox($post) {
    false, 'tinymce' => false, 'quicktags' => false, @@ -369,11 +376,11 @@ public function addParsedMetaBox($post) { - +

    @@ -383,26 +390,28 @@ public function addParsedMetaBox($post) {
    - +
    -
    +
    + +
    -