Skip to content
Snippets Groups Projects
Verified Commit 570710ad authored by Lauri Timmanee's avatar Lauri Timmanee
Browse files

Issue #2662330 by Utkarsh_33, lauriii, hooroomoo, bnjmnm, tim.plunkett, Alan...

Issue #2662330 by Utkarsh_33, lauriii, hooroomoo, bnjmnm, tim.plunkett, Alan D., smustgrave, catch, mrweiner: Machine name generation is way too slow
parent b7c4aaf2
No related branches found
No related tags found
44 merge requests!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4594Applying patch for Views Global Text area field to allow extra HTML tags. As video, source and iframe tag is not rendering. Due to which Media embedded video and remote-video not rendering in Views Global Text area field.,!4289Issue #1344552 by marcingy, Niklas Fiekas, Ravi.J, aleevas, Eduardo Morales...,!3878Removed unused condition head title for views,!38582585169-10.1.x,!3818Issue #2140179: $entity->original gets stale between updates,!3742Issue #3328429: Create item list field formatter for displaying ordered and unordered lists,!3731Claro: role=button on status report items,!3668Resolve #3347842 "Deprecate the trusted",!3651Issue #3347736: Create new SDC component for Olivero (header-search),!3546refactored dialog.pcss file,!3531Issue #3336994: StringFormatter always displays links to entity even if the user in context does not have access,!3502Issue #3335308: Confusing behavior with FormState::setFormState and FormState::setMethod,!3452Issue #3332701: Refactor Claro's tablesort-indicator stylesheet,!3451Issue #2410579: Allows setting the current language programmatically.,!3355Issue #3209129: Scrolling problems when adding a block via layout builder,!3228Issue #2920678: Add config validation for the allowed characters of machine names,!3226Issue #2987537: Custom menu link entity type should not declare "bundle" entity key,!3154Fixes #2987987 - CSRF token validation broken on routes with optional parameters.,!3147Issue #3328457: Replace most substr($a, $i) where $i is negative with str_ends_with(),!3146Issue #3328456: Replace substr($a, 0, $i) with str_starts_with(),!3133core/modules/system/css/components/hidden.module.css,!31312878513-10.1.x,!2812Issue #3312049: [Followup] Fix Drupal.Commenting.FunctionComment.MissingReturnType returns for NULL,!2614Issue #2981326: Replace non-test usages of \Drupal::logger() with IoC injection,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2062Issue #3246454: Add weekly granularity to views date sort,!1591Issue #3199697: Add JSON:API Translation experimental module,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!877Issue #2708101: Default value for link text is not saved,!844Resolve #3036010 "Updaters",!673Issue #3214208: FinishResponseSubscriber could create duplicate headers,!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493,!485Sets the autocomplete attribute for username/password input field on login form.,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer,!23Issue #2879087: Use comment access handler instead of hardcoding permissions
Showing
with 490 additions and 38 deletions
......@@ -24,7 +24,8 @@
"Sortable": true,
"once": true,
"CKEditor5": true,
"tabbable": true
"tabbable": true,
"slugify": true
},
"rules": {
"prettier/prettier": "error",
......
source diff could not be displayed: it is too large. Options to address this: view the blob.
This diff is collapsed.
......@@ -626,6 +626,7 @@ drupal.machine-name:
- core/drupal
- core/drupalSettings
- core/drupal.form
- core/transliteration
drupal.message:
version: VERSION
......@@ -874,6 +875,16 @@ tabbable:
js:
assets/vendor/tabbable/index.umd.min.js: { weight: -1, minified: true }
transliteration:
remote: https://github.com/dzcpy/transliteration
version: "2.3.5"
license:
name: MIT
url: https://raw.githubusercontent.com/dzcpy/transliteration/1.6.5/LICENSE.txt
gpl-compatible: true
js:
assets/vendor/transliteration/bundle.umd.min.js: { minified: true }
tabbable.jquery.shim:
version: VERSION
js:
......
......@@ -226,6 +226,7 @@ public static function processMachineName(&$element, FormStateInterface $form_st
$element['#attached']['drupalSettings']['machineName']['#' . $source['#id']] = array_intersect_key($element['#machine_name'], array_flip($options));
$element['#attached']['drupalSettings']['langcode'] = $language->getId();
$element['#attached']['drupalSettings']['transliteration_language_overrides'] = static::getTransliterationLanguageOverrides($language);
return $element;
}
......@@ -278,4 +279,32 @@ public static function validateMachineName(&$element, FormStateInterface $form_s
}
}
/**
* Gets transliteration language overrides for a language.
*
* This is duplicating
* \Drupal\Core\Transliteration\PhpTransliteration::readLanguageOverrides().
*
* @see \Drupal\Core\Transliteration\PhpTransliteration::readLanguageOverrides()
*/
private static function getTransliterationLanguageOverrides(LanguageInterface $language) {
$overrides = &drupal_static(__CLASS__ . '_' . __METHOD__, []);
$langcode = $language->getId();
if (isset($overrides[$langcode])) {
return $overrides[$langcode];
}
$file = dirname(__DIR__, 3) . '/Component/Transliteration/data' . '/' . preg_replace('/[^a-zA-Z\-]/', '', $langcode) . '.php';
$overrides[$langcode] = [];
if (is_file($file)) {
include $file;
}
\Drupal::moduleHandler()->alter('transliteration_overrides', $overrides[$langcode], $langcode);
return [$langcode => $overrides[$langcode]];
}
}
/**
* @file
* Machine name functionality.
*
* @internal
*/
(function ($, Drupal, drupalSettings) {
(function ($, Drupal, drupalSettings, slugify) {
/**
* Attach the machine-readable name form element behavior.
*
......@@ -41,8 +43,6 @@
attach(context, settings) {
const self = this;
const $context = $(context);
let timeout = null;
let xhr = null;
function clickEditHandler(e) {
const data = e.data;
......@@ -68,25 +68,10 @@
.replace(rx, options.replace)
.substr(0, options.maxlength);
// Abort the last pending request because the label has changed and it
// is no longer valid.
if (xhr && xhr.readystate !== 4) {
xhr.abort();
xhr = null;
}
// Wait 300 milliseconds for Ajax request since the last event to update
// the machine name i.e., after the user has stopped typing.
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
if (baseValue.toLowerCase() !== expected) {
timeout = setTimeout(() => {
xhr = self.transliterate(baseValue, options).done((machine) => {
self.showMachineName(machine.substr(0, options.maxlength), data);
});
}, 300);
const needsTransliteration = !/^[A-Za-z0-9_\s]*$/.test(baseValue);
if (needsTransliteration) {
const machineName = self.transliterate(baseValue, options);
self.showMachineName(machineName.substr(0, options.maxlength), data);
} else {
self.showMachineName(expected, data);
}
......@@ -167,12 +152,20 @@
// If no initial value, determine machine name based on the
// human-readable form element value.
if (machine === '' && $source[0].value !== '') {
self.transliterate($source[0].value, options).done((machineName) => {
if (/^[A-Za-z0-9_\s]*$/.test($source[0].value)) {
const rx = new RegExp(options.replace_pattern, 'g');
const expected = $source[0].value
.toLowerCase()
.replace(rx, options.replace)
.substr(0, options.maxlength);
self.showMachineName(expected, eventData);
} else {
self.transliterate($source[0].value, options);
self.showMachineName(
machineName.substr(0, options.maxlength),
machine.substr(0, options.maxlength),
eventData,
);
});
}
}
// If it is editable, append an edit link.
......@@ -225,25 +218,35 @@
* @param {string} settings.replace_pattern
* A regular expression (without modifiers) matching disallowed characters
* in the machine name; e.g., '[^a-z0-9]+'.
* @param {string} settings.replace_token
* A token to validate the regular expression.
* @param {string} settings.replace
* A character to replace disallowed characters with; e.g., '_' or '-'.
* @param {number} settings.maxlength
* The maximum length of the machine name.
*
* @return {jQuery}
* @return {string}
* The transliterated source string.
*/
transliterate(source, settings) {
return $.get(Drupal.url('machine_name/transliterate'), {
text: source,
langcode: drupalSettings.langcode,
replace_pattern: settings.replace_pattern,
replace_token: settings.replace_token,
replace: settings.replace,
lowercase: true,
const languageOverrides =
drupalSettings.transliteration_language_overrides[
drupalSettings.langcode
];
const normalizedLanguageOverrides = {};
if (languageOverrides) {
Object.keys(languageOverrides).forEach((key) => {
// Updates the keys from hexadecimal to strings.
normalizedLanguageOverrides[String.fromCharCode(key)] =
languageOverrides[key];
});
}
slugify.config({
separator: settings.replace,
allowedChars: settings.replace_pattern,
replace: normalizedLanguageOverrides,
});
const transliterated = slugify(source.substr(0, settings.maxlength));
const rx = new RegExp(settings.replace_pattern, 'g');
return transliterated.replace(rx, settings.replace);
},
};
})(jQuery, Drupal, drupalSettings);
})(jQuery, Drupal, drupalSettings, slugify);
......@@ -12,6 +12,11 @@
/**
* Controller routines for machine name transliteration routes.
*
* @deprecated in drupal:10.2.0 and is removed from drupal:11.0.0. There is no
* replacement.
*
* @see https://www.drupal.org/node/2662330
*/
class MachineNameController implements ContainerInjectionInterface {
......@@ -63,6 +68,7 @@ public static function create(ContainerInterface $container) {
* The transliterated string.
*/
public function transliterate(Request $request) {
@trigger_error(__METHOD__ . '() is deprecated in drupal:10.2.0 and is removed from drupal:11.0.0. There is no replacement. See https://www.drupal.org/node/3367037', E_USER_DEPRECATED);
$text = $request->query->get('text');
$langcode = $request->query->get('langcode');
$replace_pattern = $request->query->get('replace_pattern');
......
......@@ -143,6 +143,9 @@ system.admin_compact_page:
requirements:
_permission: 'access administration pages'
# @todo Deprecate this route once
# https://www.drupal.org/i/3159210 is fixed, or remove it in Drupal 11.
# @see https://www.drupal.org/node/3367037
system.machine_name_transliterate:
path: '/machine_name/transliterate'
defaults:
......
......@@ -15,7 +15,7 @@
/**
* Tests that the machine name controller can transliterate strings as expected.
*
* @group system
* @group legacy
*/
class MachineNameControllerTest extends UnitTestCase {
......@@ -125,4 +125,14 @@ public function testMachineNameControllerWithMissingToken() {
$this->machineNameController->transliterate($request);
}
/**
* Tests deprecation of MachineNameController.
*/
public function testMachineNameControllerDeprecation(): void {
$request = Request::create('', 'GET', ['text' => 'Bob', 'langcode' => 'en']);
$this->expectDeprecation('Drupal\system\MachineNameController::transliterate() is deprecated in drupal:10.2.0 and is removed from drupal:11.0.0. There is no replacement. See https://www.drupal.org/node/3367037');
$json = $this->machineNameController->transliterate($request);
$this->assertEquals('"Bob"', $json->getContent());
}
}
......@@ -94,6 +94,7 @@
"tabbable": "^6.1.2",
"terser": "^5.17.7",
"terser-webpack-plugin": "^5.3.9",
"transliteration": "^2.3.5",
"underscore": "~1.13.4",
"webpack": "^5.85.1",
"webpack-cli": "^5.1.3"
......
......@@ -141,6 +141,13 @@ const assetsFolder = `${coreFolder}/assets/vendor`;
pack: 'loadjs',
files: [{ from: 'dist/loadjs.min.js', to: 'loadjs.min.js' }],
},
{
pack: 'transliteration',
files: [
{ from: 'dist/browser/bundle.umd.min.js', to: 'bundle.umd.min.js' },
{ from: 'dist/browser/bundle.umd.min.js.map', to: 'bundle.umd.min.js.map' },
],
},
{
pack: 'jquery-ui',
folder: 'jquery.ui',
......
<?php
namespace Drupal\FunctionalJavascriptTests\MachineName;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\language\Entity\ConfigurableLanguage;
/**
* Tests the machine name transliteration functionality.
*
* @group javascript
*/
class MachineNameTransliterationTest extends WebDriverTestBase {
/**
* Modules to enable.
*
* @var array
*/
protected static $modules = [
'language',
];
/**
* {@inheritdoc}
*/
protected $defaultTheme = 'stark';
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
$admin_user = $this->drupalCreateUser([
'administer site configuration',
'administer languages',
'access administration pages',
'administer permissions',
]);
$this->drupalLogin($admin_user);
}
/**
* Test for machine name transliteration functionality.
*
* @dataProvider machineNameInputOutput
*/
public function testMachineNameTransliterations($langcode, $input, $output) {
$page = $this->getSession()->getPage();
if ($langcode !== 'en') {
ConfigurableLanguage::createFromLangcode($langcode)->save();
}
$this->config('system.site')->set('default_langcode', $langcode)->save();
$this->rebuildContainer();
$this->drupalGet("/admin/people/roles/add");
$page->find('css', '[data-drupal-selector="edit-label"]')->setValue($input);
$this->assertSession()->pageTextContains($output);
}
/**
* Data for the testMachineNameTransliterations.
*
* @return array
*/
public function machineNameInputOutput(): array {
return [
// cSpell:disable
['en', 'Bob', 'bob'],
['en', 'Äwesome', 'awesome'],
['de', 'Äwesome', 'aewesome'],
['da', 'äöüåøhello', 'aouaaoehello'],
['fr', 'ц', 'c'],
// These tests are not working with chromedriver as
// 'ᐑ','𐌰𐌸' chars are not accepted.
// ['fr', 'ᐑ', 'wii'],
// ['en', '𐌰𐌸', '__'],
['en', 'Ä Ö Ü Å Ø äöüåøhello', 'a_o_u_a_o_aouaohello'],
['de', 'Ä Ö Ü Å Ø äöüåøhello', 'ae_oe_ue_a_o_aeoeueaohello'],
['de', ']URY&m_G^;', ' _ury_m_g_'],
['da', 'Ä Ö Ü Å Ø äöüåøhello', 'a_o_u_aa_oe_aouaaoehello'],
['kg', 'ц', 'ts'],
['en', ' Hello Abventor! ', '_hello_abventor_'],
// cSpell:enable
];
}
}
// cSpell:disable
const MachineNameTestArray = [
{
machineName: 'Bob',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'bob',
},
{
machineName: 'Äwesome',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'awesome',
},
{
machineName: 'B?!"@\\/-ob@e',
replacePattern: 'a-zA-Z0-9_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'b_ob_e',
},
{
machineName: 'Bob@e\\0',
replacePattern: 'a-zA-Z0-9_.~@',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'bob@e_0',
},
{
machineName: 'Bobby',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'bobby',
},
{
machineName: 'ǍǎǏ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'aai',
},
// The expected machine name are modified because we don't have
// the removeDiacritics() function present in PhpTranliteration.php.
{
machineName: 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'aaaaaaaeceeeeiiii',
},
{
machineName: 'ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'dnoooooxouuuuuthss',
},
{
machineName: 'àáâãäåæçèéêëìíîï',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'aaaaaaaeceeeeiiii',
},
{
machineName: 'ðñòóôõö÷øùúûüýþÿ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'dnooooo_ouuuuythy',
},
{
machineName: 'ĀāĂ㥹ĆćĈĉĊċČčĎď',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'aaaaaaccccccccdd',
},
{
machineName: 'ĐđĒēĔĕĖėĘęĚěĜĝĞğ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'ddeeeeeeeeeegggg',
},
{
machineName: 'ĠġĢģĤĥĦħĨĩĪīĬĭĮį',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'gggghhhhiiiiiiii',
},
{
machineName: 'İıIJijĴĵĶķĸĹĺĻļĽľĿ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'iiijijjjkkklllllll',
},
{
machineName: 'ŀŁłŃńŅņŇňʼnŊŋŌōŎŏ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'lllnnnnnn_nngngoooo',
},
{
machineName: 'ŐőŒœŔŕŖŗŘřŚśŜŝŞş',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'oooeoerrrrrrssssss',
},
{
machineName: 'ŠšŢţŤťŦŧŨũŪūŬŭŮů',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'ssttttttuuuuuuuu',
},
{
machineName: 'ŰűŲųŴŵŶŷŸŹźŻżŽž',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'uuuuwwyyyzzzzzz',
},
{
machineName: 'ǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'ioouuuuuuuuuu_aa',
},
{
machineName: 'ǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'aaaeaeggggkkoooozhzh',
},
{
machineName: 'ǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'jdzddzgghvwnnaaaeaeoo',
},
{
machineName: 'ȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'aaaaeeeeiiiioooo',
},
{
machineName: 'ȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'rrrruuuussttyyhh',
},
{
machineName: 'ȠȡȢȣȤȥȦȧȨȩȪȫȬȭȮȯ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'ndououzzaaeeoooooo',
},
{
machineName: 'ȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'ooyylntjdbqpacclts',
},
{
machineName: 'ɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏ',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 64,
expectedMachineName: 'z_buveejjqqrryy',
},
// Test for maximum length of machine-name
{
machineName: 'This is the test for max length',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 20,
expectedMachineName: 'this_is_the_test_for',
},
{
machineName: 'Ma@Chi!~',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '_',
maxlength: 5,
expectedMachineName: 'ma_ch',
},
{
machineName: 'Test for custom replace character',
replacePattern: 'a-zA-Z0-9-_.~',
replaceChar: '-',
maxlength: 64,
expectedMachineName: 'test-for-custom-replace-character',
},
// cSpell:enable
];
module.exports = {
before(browser) {
browser.drupalInstall().drupalLoginAsAdmin(() => {
browser
.drupalRelativeURL('/admin/modules')
.setValue('input[type="search"]', 'FormAPI')
.waitForElementVisible('input[name="modules[form_test][enable]"]', 1000)
.click('input[name="modules[form_test][enable]"]')
.click('input[type="submit"]') // Submit module form.
.click('input[type="submit"]'); // Confirm installation of dependencies.
});
},
after(browser) {
browser.drupalUninstall();
},
'Machine name generation test': (browser) => {
browser.drupalRelativeURL('/form-test/machine-name');
MachineNameTestArray.forEach((iteration) => {
browser.execute(
// eslint-disable-next-line func-names, prefer-arrow-callback, no-shadow
function (object) {
return Drupal.behaviors.machineName.transliterate(
object.machineName,
{
replace_pattern: object.replacePattern,
replace: object.replaceChar,
maxlength: object.maxlength,
},
);
},
[iteration],
(result) => {
browser.assert.equal(result.value, iteration.expectedMachineName);
},
);
});
},
};
......@@ -3,6 +3,7 @@
namespace Drupal\Tests\Core\Render\Element;
use Drupal\Core\Access\CsrfTokenGenerator;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\FormState;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Language\LanguageInterface;
......@@ -85,9 +86,12 @@ public function testProcessMachineName() {
$csrf_token = $this->prophesize(CsrfTokenGenerator::class);
$csrf_token->get('[^a-z0-9_]+')->willReturn('tis-a-fine-token');
$moduleHandler = $this->prophesize(ModuleHandlerInterface::class);
$container = $this->prophesize(ContainerInterface::class);
$container->get('language_manager')->willReturn($language_manager->reveal());
$container->get('csrf_token')->willReturn($csrf_token->reveal());
$container->get('module_handler')->willReturn($moduleHandler->reveal());
\Drupal::setContainer($container->reveal());
$element = MachineName::processMachineName($element, $form_state, $complete_form);
......
......@@ -1706,6 +1706,15 @@ cliui@^7.0.2:
strip-ansi "^6.0.0"
wrap-ansi "^7.0.0"
cliui@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
dependencies:
string-width "^4.2.0"
strip-ansi "^6.0.1"
wrap-ansi "^7.0.0"
clone-deep@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
......@@ -5162,6 +5171,13 @@ tr46@~0.0.3:
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
transliteration@^2.3.5:
version "2.3.5"
resolved "https://registry.yarnpkg.com/transliteration/-/transliteration-2.3.5.tgz#8f92309575f69e4a8a525dab4ff705ebcf961c45"
integrity sha512-HAGI4Lq4Q9dZ3Utu2phaWgtm3vB6PkLUFqWAScg/UW+1eZ/Tg6Exo4oC0/3VUol/w4BlefLhUUSVBr/9/ZGQOw==
dependencies:
yargs "^17.5.1"
trim-newlines@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
......@@ -5615,6 +5631,11 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.3:
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
yargs-parser@^21.1.1:
version "21.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
yargs-unparser@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
......@@ -5638,6 +5659,19 @@ yargs@16.2.0:
y18n "^5.0.5"
yargs-parser "^20.2.2"
yargs@^17.5.1:
version "17.7.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967"
integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==
dependencies:
cliui "^8.0.1"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
string-width "^4.2.3"
y18n "^5.0.5"
yargs-parser "^21.1.1"
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment