separator)
+ $parts = explode("\u{1D}", $input);
+
+ //The first field is the format identifier, which we do not need
+ array_shift($parts);
+
+ //Split the fields into key-value pairs
+ $results = [];
+
+ foreach($parts as $part) {
+ //^ 0* ([1-9]? \d* [A-Z])
+ //Start of the string Leading zeros are discarded Not a zero Any number of digits single uppercase Letter
+ // 00 1 4 K
+
+ if(!preg_match('/^0*([1-9]?\d*[A-Z])/', $part, $matches)) {
+ throw new \LogicException("Could not parse field: $part");
+ }
+ //Extract the key
+ $key = $matches[0];
+ //Extract the field value
+ $fieldValue = substr($part, strlen($matches[0]));
+
+ $results[$key] = $fieldValue;
+ }
+
+ return new self($results);
+ }
+
+ public function getDecodedForInfoMode(): array
+ {
+ $tmp = [
+ 'Barcode type' => 'EIGP114',
+ 'Guessed vendor from barcode' => $this->guessBarcodeVendor() ?? 'Unknown',
+ ];
+
+ //Iterate over all fields of this object and add them to the array if they are not null
+ foreach((array) $this as $key => $value) {
+ //Skip data key
+ if ($key === 'data') {
+ continue;
+ }
+ if($value !== null) {
+ $tmp[$key] = $value;
+ }
+ }
+
+ return $tmp;
+ }
+}
\ No newline at end of file
diff --git a/src/Services/LabelSystem/Barcodes/BarcodeScanResult.php b/src/Services/LabelSystem/BarcodeScanner/LocalBarcodeScanResult.php
similarity index 66%
rename from src/Services/LabelSystem/Barcodes/BarcodeScanResult.php
rename to src/Services/LabelSystem/BarcodeScanner/LocalBarcodeScanResult.php
index 7f1315b3..050aff6f 100644
--- a/src/Services/LabelSystem/Barcodes/BarcodeScanResult.php
+++ b/src/Services/LabelSystem/BarcodeScanner/LocalBarcodeScanResult.php
@@ -21,14 +21,15 @@
declare(strict_types=1);
-namespace App\Services\LabelSystem\Barcodes;
+namespace App\Services\LabelSystem\BarcodeScanner;
use App\Entity\LabelSystem\LabelSupportedElement;
/**
- * This class represents the result of a barcode scan, with the target type and the ID of the element
+ * This class represents the result of a barcode scan of a barcode that uniquely identifies a local entity,
+ * like an internally generated barcode or a barcode that was added manually to the system by a user
*/
-class BarcodeScanResult
+class LocalBarcodeScanResult implements BarcodeScanResultInterface
{
public function __construct(
public readonly LabelSupportedElement $target_type,
@@ -36,4 +37,13 @@ class BarcodeScanResult
public readonly BarcodeSourceType $source_type,
) {
}
+
+ public function getDecodedForInfoMode(): array
+ {
+ return [
+ 'Barcode type' => $this->source_type->name,
+ 'Target type' => $this->target_type->name,
+ 'Target ID' => $this->target_id,
+ ];
+ }
}
\ No newline at end of file
diff --git a/src/Services/LabelSystem/Barcodes/BarcodeRedirector.php b/src/Services/LabelSystem/Barcodes/BarcodeRedirector.php
deleted file mode 100644
index bc21b787..00000000
--- a/src/Services/LabelSystem/Barcodes/BarcodeRedirector.php
+++ /dev/null
@@ -1,89 +0,0 @@
-.
- */
-
-declare(strict_types=1);
-
-/**
- * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
- *
- * Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-namespace App\Services\LabelSystem\Barcodes;
-
-use App\Entity\LabelSystem\LabelSupportedElement;
-use App\Entity\Parts\PartLot;
-use Doctrine\ORM\EntityManagerInterface;
-use Doctrine\ORM\EntityNotFoundException;
-use InvalidArgumentException;
-use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
-
-/**
- * @see \App\Tests\Services\LabelSystem\Barcodes\BarcodeRedirectorTest
- */
-final class BarcodeRedirector
-{
- public function __construct(private readonly UrlGeneratorInterface $urlGenerator, private readonly EntityManagerInterface $em)
- {
- }
-
- /**
- * Determines the URL to which the user should be redirected, when scanning a QR code.
- *
- * @param BarcodeScanResult $barcodeScan The result of the barcode scan
- * @return string the URL to which should be redirected
- *
- * @throws EntityNotFoundException
- */
- public function getRedirectURL(BarcodeScanResult $barcodeScan): string
- {
- switch ($barcodeScan->target_type) {
- case LabelSupportedElement::PART:
- return $this->urlGenerator->generate('app_part_show', ['id' => $barcodeScan->target_id]);
- case LabelSupportedElement::PART_LOT:
- //Try to determine the part to the given lot
- $lot = $this->em->find(PartLot::class, $barcodeScan->target_id);
- if (!$lot instanceof PartLot) {
- throw new EntityNotFoundException();
- }
-
- return $this->urlGenerator->generate('app_part_show', ['id' => $lot->getPart()->getID()]);
-
- case LabelSupportedElement::STORELOCATION:
- return $this->urlGenerator->generate('part_list_store_location', ['id' => $barcodeScan->target_id]);
-
- default:
- throw new InvalidArgumentException('Unknown $type: '.$barcodeScan->target_type->name);
- }
- }
-}
diff --git a/symfony.lock b/symfony.lock
index ac622cb0..c7471b73 100644
--- a/symfony.lock
+++ b/symfony.lock
@@ -408,15 +408,15 @@
"version": "v4.2.3"
},
"symfony/console": {
- "version": "5.3",
+ "version": "6.4",
"recipe": {
"repo": "github.com/symfony/recipes",
- "branch": "master",
+ "branch": "main",
"version": "5.3",
- "ref": "da0c8be8157600ad34f10ff0c9cc91232522e047"
+ "ref": "1781ff40d8a17d87cf53f8d4cf0c8346ed2bb461"
},
"files": [
- "./bin/console"
+ "bin/console"
]
},
"symfony/css-selector": {
@@ -468,15 +468,16 @@
"version": "v4.2.3"
},
"symfony/flex": {
- "version": "1.19",
+ "version": "2.4",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
- "version": "1.0",
- "ref": "146251ae39e06a95be0fe3d13c807bcf3938b172"
+ "version": "2.4",
+ "ref": "52e9754527a15e2b79d9a610f98185a1fe46622a"
},
"files": [
- ".env"
+ ".env",
+ ".env.dev"
]
},
"symfony/form": {
diff --git a/templates/label_system/dialog.html.twig b/templates/label_system/dialog.html.twig
index a845d12e..50db99e7 100644
--- a/templates/label_system/dialog.html.twig
+++ b/templates/label_system/dialog.html.twig
@@ -59,7 +59,7 @@
{{ profile.name ?? '-' }}
- {% if profile %}
+ {% if profile and is_granted("edit", profile) %}
{% endif %}
@@ -91,6 +91,25 @@
+
+ {% if is_granted("@labels.read_profiles") %}
+
+ {% endif %}
+
+
+
diff --git a/templates/label_system/scanner/scanner.html.twig b/templates/label_system/scanner/scanner.html.twig
index 39f4e140..1f978a9b 100644
--- a/templates/label_system/scanner/scanner.html.twig
+++ b/templates/label_system/scanner/scanner.html.twig
@@ -23,4 +23,22 @@
{{ form_end(form) }}
+
+ {% if infoModeData %}
+
+ {% trans %}label_scanner.decoded_info.title{% endtrans %}
+
+
+
+ {% for key, value in infoModeData %}
+
+ | {{ key }} |
+ {{ value }} |
+
+ {% endfor %}
+
+
+
+ {% endif %}
+
{% endblock %}
diff --git a/templates/parts/edit/edit_form_styles.html.twig b/templates/parts/edit/edit_form_styles.html.twig
index 6658fa80..cf9a40b9 100644
--- a/templates/parts/edit/edit_form_styles.html.twig
+++ b/templates/parts/edit/edit_form_styles.html.twig
@@ -108,7 +108,7 @@
{{ form_row(form.comment) }}
{{ form_row(form.owner) }}
- {{ form_row(form.vendor_barcode) }}
+ {{ form_row(form.user_barcode) }}
diff --git a/tests/Controller/RedirectControllerTest.php b/tests/Controller/RedirectControllerTest.php
index 029c93f5..f62c05c3 100644
--- a/tests/Controller/RedirectControllerTest.php
+++ b/tests/Controller/RedirectControllerTest.php
@@ -115,6 +115,62 @@ class RedirectControllerTest extends WebTestCase
$this->client->followRedirects(false);
$this->client->request('GET', $input_path);
- $this->assertResponseRedirects($redirect_path);
+ self::assertResponseRedirects($redirect_path);
}
+
+ /**
+ * Test if the user is redirected to the localized version of a page, based on his settings.
+ * We simulate the situation of a reverse proxy here, by adding a prefix to the path.
+ *
+ * @dataProvider urlAddLocaleDataProvider
+ * @group slow
+ */
+ public function testAddLocaleReverseProxy(?string $user_locale, string $input_path, string $redirect_path): void
+ {
+ //Input path remains unchanged, as this is what the server receives from the proxy
+
+ //Redirect path must contain the proxy prefix
+ $redirect_path = 'http://localhost'. '/proxy' . $redirect_path;
+
+ /** @var User $user */
+ $user = $this->userRepo->findOneBy(['name' => 'user']);
+ //Set user locale
+ $user->setLanguage($user_locale);
+ $this->em->flush();
+
+ $this->client->followRedirects(false);
+ $this->client->request('GET', $input_path, [], [], ['HTTP_X_FORWARDED_PREFIX' => '/proxy']);
+ self::assertResponseRedirects($redirect_path);
+ }
+
+
+ /**
+ * Test if the user is redirected to the localized version of a page, based on his settings.
+ * We simulate the situation of serving Part-DB in a subfolder here.
+ *
+ * @dataProvider urlAddLocaleDataProvider
+ * @group slow
+ */
+ public function testAddLocaleSubfolder(?string $user_locale, string $input_path, string $redirect_path): void
+ {
+ //Prefix our path with the proxy prefix
+ $input_path = '/folder'.$input_path;
+
+ //Redirect path is absolute
+ $redirect_path = 'http://localhost'. '/folder' . $redirect_path;
+
+ /** @var User $user */
+ $user = $this->userRepo->findOneBy(['name' => 'user']);
+ //Set user locale
+ $user->setLanguage($user_locale);
+ $this->em->flush();
+
+ $this->client->followRedirects(false);
+ $this->client->request('GET', $input_path, [], [], [
+ 'SCRIPT_FILENAME' => '/var/www/html/folder/public/index.php',
+ 'PHP_SELF' => '/folder/index.php',
+ ]);
+ self::assertResponseRedirects($redirect_path);
+ }
+
}
diff --git a/tests/Serializer/PartNormalizerTest.php b/tests/Serializer/PartNormalizerTest.php
index cd93d93c..9baff750 100644
--- a/tests/Serializer/PartNormalizerTest.php
+++ b/tests/Serializer/PartNormalizerTest.php
@@ -80,7 +80,10 @@ class PartNormalizerTest extends WebTestCase
$this->assertFalse($this->service->supportsDenormalization(new \stdClass(), Part::class));
$this->assertFalse($this->service->supportsDenormalization('string', Part::class));
$this->assertFalse($this->service->supportsDenormalization(['a' => 'b'], \stdClass::class));
- $this->assertTrue($this->service->supportsDenormalization(['a' => 'b'], Part::class));
+
+ //Only support denormalization, if CSV import
+ $this->assertFalse($this->service->supportsDenormalization(['a' => 'b'], Part::class));
+ $this->assertTrue($this->service->supportsDenormalization(['a' => 'b'], Part::class, null, ['partdb_import' => true]));
}
public function testDenormalize(): void
diff --git a/tests/Services/EntityMergers/Mergers/PartMergerTest.php b/tests/Services/EntityMergers/Mergers/PartMergerTest.php
index fc60ca23..bf02744a 100644
--- a/tests/Services/EntityMergers/Mergers/PartMergerTest.php
+++ b/tests/Services/EntityMergers/Mergers/PartMergerTest.php
@@ -148,7 +148,7 @@ class PartMergerTest extends KernelTestCase
public function testMergeOfPartLots(): void
{
$lot1 = (new PartLot())->setAmount(2)->setNeedsRefill(true);
- $lot2 = (new PartLot())->setInstockUnknown(true)->setVendorBarcode('test');
+ $lot2 = (new PartLot())->setInstockUnknown(true)->setUserBarcode('test');
$lot3 = (new PartLot())->setDescription('lot3')->setAmount(3);
$lot4 = (new PartLot())->setDescription('lot4')->setComment('comment');
diff --git a/tests/Services/LabelSystem/Barcodes/BarcodeRedirectorTest.php b/tests/Services/LabelSystem/BarcodeScanner/BarcodeRedirectorTest.php
similarity index 76%
rename from tests/Services/LabelSystem/Barcodes/BarcodeRedirectorTest.php
rename to tests/Services/LabelSystem/BarcodeScanner/BarcodeRedirectorTest.php
index b2b94bab..58030f93 100644
--- a/tests/Services/LabelSystem/Barcodes/BarcodeRedirectorTest.php
+++ b/tests/Services/LabelSystem/BarcodeScanner/BarcodeRedirectorTest.php
@@ -39,12 +39,12 @@ declare(strict_types=1);
* along with this program. If not, see .
*/
-namespace App\Tests\Services\LabelSystem\Barcodes;
+namespace App\Tests\Services\LabelSystem\BarcodeScanner;
use App\Entity\LabelSystem\LabelSupportedElement;
-use App\Services\LabelSystem\Barcodes\BarcodeRedirector;
-use App\Services\LabelSystem\Barcodes\BarcodeScanResult;
-use App\Services\LabelSystem\Barcodes\BarcodeSourceType;
+use App\Services\LabelSystem\BarcodeScanner\BarcodeRedirector;
+use App\Services\LabelSystem\BarcodeScanner\BarcodeSourceType;
+use App\Services\LabelSystem\BarcodeScanner\LocalBarcodeScanResult;
use Doctrine\ORM\EntityNotFoundException;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
@@ -60,17 +60,17 @@ final class BarcodeRedirectorTest extends KernelTestCase
public static function urlDataProvider(): \Iterator
{
- yield [new BarcodeScanResult(LabelSupportedElement::PART, 1, BarcodeSourceType::INTERNAL), '/en/part/1'];
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART, 1, BarcodeSourceType::INTERNAL), '/en/part/1'];
//Part lot redirects to Part info page (Part lot 1 is associated with part 3)
- yield [new BarcodeScanResult(LabelSupportedElement::PART_LOT, 1, BarcodeSourceType::INTERNAL), '/en/part/3'];
- yield [new BarcodeScanResult(LabelSupportedElement::STORELOCATION, 1, BarcodeSourceType::INTERNAL), '/en/store_location/1/parts'];
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 1, BarcodeSourceType::INTERNAL), '/en/part/3'];
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::STORELOCATION, 1, BarcodeSourceType::INTERNAL), '/en/store_location/1/parts'];
}
/**
* @dataProvider urlDataProvider
* @group DB
*/
- public function testGetRedirectURL(BarcodeScanResult $scanResult, string $url): void
+ public function testGetRedirectURL(LocalBarcodeScanResult $scanResult, string $url): void
{
$this->assertSame($url, $this->service->getRedirectURL($scanResult));
}
@@ -79,7 +79,7 @@ final class BarcodeRedirectorTest extends KernelTestCase
{
$this->expectException(EntityNotFoundException::class);
//If we encounter an invalid lot, we must throw an exception
- $this->service->getRedirectURL(new BarcodeScanResult(LabelSupportedElement::PART_LOT,
+ $this->service->getRedirectURL(new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT,
12_345_678, BarcodeSourceType::INTERNAL));
}
}
diff --git a/tests/Services/LabelSystem/Barcodes/BarcodeScanHelperTest.php b/tests/Services/LabelSystem/BarcodeScanner/BarcodeScanHelperTest.php
similarity index 56%
rename from tests/Services/LabelSystem/Barcodes/BarcodeScanHelperTest.php
rename to tests/Services/LabelSystem/BarcodeScanner/BarcodeScanHelperTest.php
index 65cb02d4..74ae068a 100644
--- a/tests/Services/LabelSystem/Barcodes/BarcodeScanHelperTest.php
+++ b/tests/Services/LabelSystem/BarcodeScanner/BarcodeScanHelperTest.php
@@ -39,13 +39,14 @@ declare(strict_types=1);
* along with this program. If not, see .
*/
-namespace App\Tests\Services\LabelSystem\Barcodes;
+namespace App\Tests\Services\LabelSystem\BarcodeScanner;
use App\Entity\LabelSystem\LabelSupportedElement;
-use App\Services\LabelSystem\Barcodes\BarcodeScanHelper;
-use App\Services\LabelSystem\Barcodes\BarcodeScanResult;
-use App\Services\LabelSystem\Barcodes\BarcodeSourceType;
-use Com\Tecnick\Barcode\Barcode;
+use App\Services\LabelSystem\BarcodeScanner\BarcodeScanHelper;
+use App\Services\LabelSystem\BarcodeScanner\BarcodeScanResultInterface;
+use App\Services\LabelSystem\BarcodeScanner\BarcodeSourceType;
+use App\Services\LabelSystem\BarcodeScanner\EIGP114BarcodeScanResult;
+use App\Services\LabelSystem\BarcodeScanner\LocalBarcodeScanResult;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class BarcodeScanHelperTest extends WebTestCase
@@ -61,56 +62,67 @@ class BarcodeScanHelperTest extends WebTestCase
public static function dataProvider(): \Iterator
{
//QR URL content:
- yield [new BarcodeScanResult(LabelSupportedElement::PART_LOT, 1, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 1, BarcodeSourceType::INTERNAL),
'https://localhost:8000/scan/lot/1'];
- yield [new BarcodeScanResult(LabelSupportedElement::PART, 123, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART, 123, BarcodeSourceType::INTERNAL),
'https://localhost:8000/scan/part/123'];
- yield [new BarcodeScanResult(LabelSupportedElement::STORELOCATION, 4, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::STORELOCATION, 4, BarcodeSourceType::INTERNAL),
'http://foo.bar/part-db/scan/location/4'];
//Current Code39 format:
- yield [new BarcodeScanResult(LabelSupportedElement::PART_LOT, 10, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 10, BarcodeSourceType::INTERNAL),
'L0010'];
- yield [new BarcodeScanResult(LabelSupportedElement::PART_LOT, 123, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 123, BarcodeSourceType::INTERNAL),
'L0123'];
- yield [new BarcodeScanResult(LabelSupportedElement::PART_LOT, 123456, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 123456, BarcodeSourceType::INTERNAL),
'L123456'];
- yield [new BarcodeScanResult(LabelSupportedElement::PART, 2, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART, 2, BarcodeSourceType::INTERNAL),
'P0002'];
//Development phase Code39 barcodes:
- yield [new BarcodeScanResult(LabelSupportedElement::PART_LOT, 10, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 10, BarcodeSourceType::INTERNAL),
'L-000010'];
- yield [new BarcodeScanResult(LabelSupportedElement::PART_LOT, 10, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 10, BarcodeSourceType::INTERNAL),
'Lß000010'];
- yield [new BarcodeScanResult(LabelSupportedElement::PART, 123, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART, 123, BarcodeSourceType::INTERNAL),
'P-000123'];
- yield [new BarcodeScanResult(LabelSupportedElement::STORELOCATION, 123, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::STORELOCATION, 123, BarcodeSourceType::INTERNAL),
'S-000123'];
- yield [new BarcodeScanResult(LabelSupportedElement::PART_LOT, 12_345_678, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 12_345_678, BarcodeSourceType::INTERNAL),
'L-12345678'];
//Legacy storelocation format
- yield [new BarcodeScanResult(LabelSupportedElement::STORELOCATION, 336, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::STORELOCATION, 336, BarcodeSourceType::INTERNAL),
'$L00336'];
- yield [new BarcodeScanResult(LabelSupportedElement::STORELOCATION, 12_345_678, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::STORELOCATION, 12_345_678, BarcodeSourceType::INTERNAL),
'$L12345678'];
//Legacy Part format
- yield [new BarcodeScanResult(LabelSupportedElement::PART, 123, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART, 123, BarcodeSourceType::INTERNAL),
'0000123'];
- yield [new BarcodeScanResult(LabelSupportedElement::PART, 123, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART, 123, BarcodeSourceType::INTERNAL),
'00001236'];
- yield [new BarcodeScanResult(LabelSupportedElement::PART, 1_234_567, BarcodeSourceType::INTERNAL),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART, 1_234_567, BarcodeSourceType::INTERNAL),
'12345678'];
//Test IPN barcode
- yield [new BarcodeScanResult(LabelSupportedElement::PART, 2, BarcodeSourceType::IPN),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART, 2, BarcodeSourceType::IPN),
'IPN123'];
//Test vendor barcode
- yield [new BarcodeScanResult(LabelSupportedElement::PART_LOT, 2,BarcodeSourceType::VENDOR),
+ yield [new LocalBarcodeScanResult(LabelSupportedElement::PART_LOT, 2,BarcodeSourceType::USER_DEFINED),
'lot2_vendor_barcode'];
+
+ $eigp114Result = new EIGP114BarcodeScanResult([
+ 'P' => '596-777A1-ND',
+ '1P' => 'XAF4444',
+ 'Q' => '3',
+ '10D' => '1452',
+ '1T' => 'BF1103',
+ '4L' => 'US',
+ ]);
+
+ yield [$eigp114Result, "[)>\x1E06\x1DP596-777A1-ND\x1D1PXAF4444\x1DQ3\x1D10D1452\x1D1TBF1103\x1D4LUS\x1E\x04"];
}
public static function invalidDataProvider(): \Iterator
@@ -131,7 +143,7 @@ class BarcodeScanHelperTest extends WebTestCase
/**
* @dataProvider dataProvider
*/
- public function testNormalizeBarcodeContent(BarcodeScanResult $expected, string $input): void
+ public function testNormalizeBarcodeContent(BarcodeScanResultInterface $expected, string $input): void
{
$this->assertEquals($expected, $this->service->scanBarcodeContent($input));
}
diff --git a/tests/Services/LabelSystem/BarcodeScanner/EIGP114BarcodeScanResultTest.php b/tests/Services/LabelSystem/BarcodeScanner/EIGP114BarcodeScanResultTest.php
new file mode 100644
index 00000000..aa5e4fbc
--- /dev/null
+++ b/tests/Services/LabelSystem/BarcodeScanner/EIGP114BarcodeScanResultTest.php
@@ -0,0 +1,154 @@
+.
+ */
+
+namespace App\Tests\Services\LabelSystem\BarcodeScanner;
+
+use App\Services\LabelSystem\BarcodeScanner\EIGP114BarcodeScanResult;
+use PHPUnit\Framework\TestCase;
+
+class EIGP114BarcodeScanResultTest extends TestCase
+{
+
+ public function testGuessBarcodeVendor(): void
+ {
+ //Generic barcode:
+
+ $barcode = new EIGP114BarcodeScanResult([
+ 'P' => '596-777A1-ND',
+ '1P' => 'XAF4444',
+ 'Q' => '3',
+ '10D' => '1452',
+ '1T' => 'BF1103',
+ '4L' => 'US',
+ ]);
+
+ $this->assertNull($barcode->guessBarcodeVendor());
+
+ //Digikey barcode:
+ $barcode = new EIGP114BarcodeScanResult([
+ 'P' => '596-777A1-ND',
+ '1P' => 'XAF4444',
+ 'Q' => '3',
+ '10D' => '1452',
+ '1T' => 'BF1103',
+ '4L' => 'US',
+ '13Z' => 'Digi-Key',
+ ]);
+ $this->assertEquals('digikey', $barcode->guessBarcodeVendor());
+
+ //Mouser barcode:
+ $barcode = new EIGP114BarcodeScanResult([
+ 'P' => '596-777A1-ND',
+ '1P' => 'XAF4444',
+ 'Q' => '3',
+ '10D' => '1452',
+ '1T' => 'BF1103',
+ '4L' => 'US',
+ '1V' => 'Mouser',
+ ]);
+
+ $this->assertEquals('mouser', $barcode->guessBarcodeVendor());
+
+ //Farnell barcode:
+ $barcode = new EIGP114BarcodeScanResult([
+ 'P' => '596-777A1-ND',
+ '1P' => 'XAF4444',
+ 'Q' => '3',
+ '10D' => '1452',
+ '1T' => 'BF1103',
+ '4L' => 'US',
+ '3P' => 'Farnell',
+ ]);
+
+ $this->assertEquals('element14', $barcode->guessBarcodeVendor());
+ }
+
+ public function testIsFormat06Code(): void
+ {
+ $this->assertFalse(EIGP114BarcodeScanResult::isFormat06Code(''));
+ $this->assertFalse(EIGP114BarcodeScanResult::isFormat06Code('test'));
+ $this->assertFalse(EIGP114BarcodeScanResult::isFormat06Code('12232435ew4rf'));
+
+ //Valid code (with trailer)
+ $this->assertTrue(EIGP114BarcodeScanResult::isFormat06Code("[)>\x1E06\x1DP596-777A1-ND\x1D1PXAF4444\x1DQ3\x1D10D1452\x1D1TBF1103\x1D4LUS\x1E\x04"));
+
+ //Valid code (digikey, without trailer)
+ $this->assertTrue(EIGP114BarcodeScanResult::isFormat06Code("[)>\x1e06\x1dPQ1045-ND\x1d1P364019-01\x1d30PQ1045-ND\x1dK12432 TRAVIS FOSS P\x1d1K85732873\x1d10K103332956\x1d9D231013\x1d1TQJ13P\x1d11K1\x1d4LTW\x1dQ3\x1d11ZPICK\x1d12Z7360988\x1d13Z999999\x1d20Z0000000000000000000000000000000000000000000000000000000000000000000000000000000000000"));
+ }
+
+ public function testParseFormat06CodeInvalid(): void
+ {
+ $this->expectException(\InvalidArgumentException::class);
+ EIGP114BarcodeScanResult::parseFormat06Code('');
+ }
+
+ public function testParseFormat06Code(): void
+ {
+ $barcode = EIGP114BarcodeScanResult::parseFormat06Code("[)>\x1E06\x1DP596-777A1-ND\x1D1PXAF4444\x1DQ3\x1D10D1452\x1D1TBF1103\x1D4LUS\x1E\x04");
+ $this->assertEquals([
+ 'P' => '596-777A1-ND',
+ '1P' => 'XAF4444',
+ 'Q' => '3',
+ '10D' => '1452',
+ '1T' => 'BF1103',
+ '4L' => 'US',
+ ], $barcode->data);
+ }
+
+ public function testDataParsing(): void
+ {
+ $barcode = new EIGP114BarcodeScanResult([
+ 'P' => '596-777A1-ND',
+ '1P' => 'XAF4444',
+ 'Q' => '3',
+ '10D' => '1452',
+ '1T' => 'BF1103',
+ '4L' => 'US',
+ ]);
+
+ $this->assertEquals('596-777A1-ND', $barcode->customerPartNumber);
+ $this->assertEquals('XAF4444', $barcode->supplierPartNumber);
+ $this->assertEquals(3, $barcode->quantity);
+ $this->assertEquals('1452', $barcode->alternativeDateCode);
+ $this->assertEquals('BF1103', $barcode->lotCode);
+ $this->assertEquals('US', $barcode->countryOfOrigin);
+ }
+
+ public function testDigikeyParsing(): void
+ {
+ $barcode = EIGP114BarcodeScanResult::parseFormat06Code("[)>\x1e06\x1dPQ1045-ND\x1d1P364019-01\x1d30PQ1045-ND\x1dK12432 TRAVIS FOSS P\x1d1K85732873\x1d10K103332956\x1d9D231013\x1d1TQJ13P\x1d11K1\x1d4LTW\x1dQ3\x1d11ZPICK\x1d12Z7360988\x1d13Z999999\x1d20Z0000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
+
+ $this->assertEquals('digikey', $barcode->guessBarcodeVendor());
+
+ $this->assertEquals('Q1045-ND', $barcode->customerPartNumber);
+ $this->assertEquals('364019-01', $barcode->supplierPartNumber);
+ $this->assertEquals(3, $barcode->quantity);
+ $this->assertEquals('231013', $barcode->dateCode);
+ $this->assertEquals('QJ13P', $barcode->lotCode);
+ $this->assertEquals('TW', $barcode->countryOfOrigin);
+ $this->assertEquals('Q1045-ND', $barcode->digikeyPartNumber);
+ $this->assertEquals('85732873', $barcode->digikeySalesOrderNumber);
+ $this->assertEquals('103332956', $barcode->digikeyInvoiceNumber);
+ $this->assertEquals('PICK', $barcode->digikeyLabelType);
+ $this->assertEquals('7360988', $barcode->digikeyPartID);
+ $this->assertEquals('999999', $barcode->digikeyNA);
+ $this->assertEquals('0000000000000000000000000000000000000000000000000000000000000000000000000000000000000', $barcode->digikeyPadding);
+ }
+}
diff --git a/translations/messages.de.xlf b/translations/messages.de.xlf
index 0386e0b1..6a0ccda9 100644
--- a/translations/messages.de.xlf
+++ b/translations/messages.de.xlf
@@ -12223,5 +12223,101 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
Erzeugter Code
+
+
+ info_providers.search.show_existing_part
+ Bestehendes Bauteil anzeigen
+
+
+
+
+ info_providers.search.edit_existing_part
+ Bestehendes Bauteil bearbeiten
+
+
+
+
+ info_providers.search.existing_part_found.short
+ Bauteil existiert bereits
+
+
+
+
+ info_providers.search.existing_part_found
+ Dieses Bauteil (oder ein sehr ähnliches) existiert bereits in der Datenbank. Bitte überprüfen Sie, ob es das gleiche ist und ob Sie dies erneut erstellen möchten!
+
+
+
+
+ info_providers.search.update_existing_part
+ Bestehendes Bauteil von Informationsquelle aktualisieren
+
+
+
+
+ part.create_from_info_provider.no_category_yet
+ Die Kategorie konnte nicht automatisch von der Informationsquelle ermittelt werden. Überprüfen Sie die Daten und wählen Sie die Kategorie händisch aus.
+
+
+
+
+ part_lot.edit.user_barcode
+ Benutzer-Barcode
+
+
+
+
+ scan_dialog.mode.user
+ Benutzer definierter Barcode (in Bauteilebestand konfiguriert)
+
+
+
+
+ scan_dialog.mode.eigp
+ EIGP 114 Barcode (z. B. der Datamatrix code auf Digikey und Mouser Bauteilen)
+
+
+
+
+ scan_dialog.info_mode
+ Info Modus (Barcode dekodieren und Inhalte anzeigen, aber nicht zum Bauteil weiterleiten)
+
+
+
+
+ label_scanner.decoded_info.title
+ Dekodierte Informationen
+
+
+
+
+ label_generator.edit_profiles
+ Profile bearbeiten
+
+
+
+
+ label_generator.profile_name_empty
+ Der Profilname darf nicht leer sein!
+
+
+
+
+ label_generator.save_profile_name
+ Profilname
+
+
+
+
+ label_generator.save_profile
+ Als neues Profil speichern
+
+
+
+
+ label_generator.profile_saved
+ Profil gespeichert!
+
+
diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf
index 9c45b4be..6e4c47cb 100644
--- a/translations/messages.en.xlf
+++ b/translations/messages.en.xlf
@@ -12263,5 +12263,65 @@ Please note, that you can not impersonate a disabled user. If you try you will g
Category could not be automatically determined by the info provider. Review the data and select the category manually.
+
+
+ part_lot.edit.user_barcode
+ User barcode
+
+
+
+
+ scan_dialog.mode.user
+ User defined barcode (configured at part lot)
+
+
+
+
+ scan_dialog.mode.eigp
+ EIGP 114 barcode (e.g. the datamatrix codes on digikey and mouser orders)
+
+
+
+
+ scan_dialog.info_mode
+ Info mode (Decode barcode and show its contents, but do not redirect to part)
+
+
+
+
+ label_scanner.decoded_info.title
+ Decoded information
+
+
+
+
+ label_generator.edit_profiles
+ Edit profiles
+
+
+
+
+ label_generator.profile_name_empty
+ Profile name must not be empty!
+
+
+
+
+ label_generator.save_profile_name
+ Profile name
+
+
+
+
+ label_generator.save_profile
+ Save as new profile
+
+
+
+
+ label_generator.profile_saved
+ Profile saved!
+
+
diff --git a/translations/security.de.xlf b/translations/security.de.xlf
index ef0a6b80..a0498be8 100644
--- a/translations/security.de.xlf
+++ b/translations/security.de.xlf
@@ -1,17 +1,23 @@
-
+
user.login_error.user_disabled
Ihr Account ist deaktiviert! Kontaktiere einen Administrator, wenn Sie denken, dass dies ein Fehler ist.
-
+
saml.error.cannot_login_local_user_per_saml
Sie können sich per SSO nicht als lokaler Nutzer einloggen! Nutzen Sie stattdessen ihr lokales Passwort.
+
+
+ saml.error.cannot_login_saml_user_locally
+ Sie können sich nicht mittels lokaler Authentifizierung als SAML Benutzer einloggen! Benutzen Sie stattdessen den SSO login.
+
+
diff --git a/translations/security.it.xlf b/translations/security.it.xlf
index 9b45cd1e..9200458c 100644
--- a/translations/security.it.xlf
+++ b/translations/security.it.xlf
@@ -1,17 +1,23 @@
-
+
user.login_error.user_disabled
Il tuo account è disabilitato! Contatta un amministratore se ritieni che non sia corretto.
-
+
saml.error.cannot_login_local_user_per_saml
Non è possibile accedere come utente locale tramite SSO! Usare invece la password locale.
+
+
+ saml.error.cannot_login_saml_user_locally
+ Non si può usare l'autenticazione locale per effettuare l'accesso come utente SAML! Usare l'accesso SSO.
+
+
diff --git a/webpack.config.js b/webpack.config.js
index d5243897..43e04997 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -36,8 +36,8 @@ if (!Encore.isRuntimeEnvironmentConfigured()) {
Encore
// directory where compiled assets will be stored
.setOutputPath('public/build/')
- // This value doesn't matter, as the public path is set to auto later down. This is just to prevent a warning
- .setPublicPath('/build')
+ // Do not use a / prefix, here as that would break asset loading when serving Part-DB under a prefix!
+ .setPublicPath('build')
// only needed for CDN's or subdirectory deploy (this should not be needeed, as we use auto public path)
//.setManifestKeyPrefix('build/')
@@ -59,6 +59,12 @@ Encore
.addEntry('app', './assets/js/app.js')
.addEntry('webauthn_tfa', './assets/js/webauthn_tfa.js')
+ //Configure to just output the zxing wasm file, without parsing it
+ .addRule({
+ test: /zxing_reader\.wasm$/,
+ type: "asset/resource"
+ })
+
//.addEntry('page1', './assets/js/page1.js')
//.addEntry('page2', './assets/js/page2.js')
@@ -189,6 +195,10 @@ if (Encore.isDev()) {
module.exports = Encore.getWebpackConfig();
-//Enable webpack auto public path (this only works in combination with WebpackAutoPathSubscriber!!)
+//Enable webassembly support
+module.exports.experiments = module.exports.experiments || {};
+module.exports.experiments.asyncWebAssembly = true;
+
+//Enable webpack auto public path
//We do it here to supress a warning caused by webpack Encore
module.exports.output.publicPath = 'auto';
diff --git a/yarn.lock b/yarn.lock
index fbb935eb..b5adc3e6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,58 +2,58 @@
# yarn lockfile v1
-"@algolia/autocomplete-core@1.17.8":
- version "1.17.8"
- resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.17.8.tgz#769e365d0e24233658eeb15a0a8b4572016c0924"
- integrity sha512-WKQS6+83DYB7bsCN7HUxPGzwR1ZtKy+E8WybnuxnsGzQG/zd4j96R4USqsjz0/tOQVAA4hnlqNn9LtcaOIjCyQ==
+"@algolia/autocomplete-core@1.17.9":
+ version "1.17.9"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz#83374c47dc72482aa45d6b953e89377047f0dcdc"
+ integrity sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==
dependencies:
- "@algolia/autocomplete-plugin-algolia-insights" "1.17.8"
- "@algolia/autocomplete-shared" "1.17.8"
+ "@algolia/autocomplete-plugin-algolia-insights" "1.17.9"
+ "@algolia/autocomplete-shared" "1.17.9"
-"@algolia/autocomplete-js@1.17.8", "@algolia/autocomplete-js@^1.17.0":
- version "1.17.8"
- resolved "https://registry.yarnpkg.com/@algolia/autocomplete-js/-/autocomplete-js-1.17.8.tgz#2d4a5928d12bd51e16d84388e893431526bd542f"
- integrity sha512-WQ5xZ5sY16UH6V0+ACpe2NoKPWs9L/m5uQQn8eNiM7jsHShonEhwV3/kB897k1TovfHqhtH0gPXXMN95taZAqA==
+"@algolia/autocomplete-js@1.17.9", "@algolia/autocomplete-js@^1.17.0":
+ version "1.17.9"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-js/-/autocomplete-js-1.17.9.tgz#2f7e5599fdfe7d6c44b82ac5b64662b487615465"
+ integrity sha512-51xmsIfApj8LEceArnLe3UfS8HSgJJa70FUEYpnLryO6+KZL0pDPQHw1uVw6e5yJiKN0KelDmk2Sa2uJ+gVKJw==
dependencies:
- "@algolia/autocomplete-core" "1.17.8"
- "@algolia/autocomplete-preset-algolia" "1.17.8"
- "@algolia/autocomplete-shared" "1.17.8"
+ "@algolia/autocomplete-core" "1.17.9"
+ "@algolia/autocomplete-preset-algolia" "1.17.9"
+ "@algolia/autocomplete-shared" "1.17.9"
htm "^3.1.1"
preact "^10.13.2"
-"@algolia/autocomplete-plugin-algolia-insights@1.17.8":
- version "1.17.8"
- resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.8.tgz#e16f56e4c023bf3776347b6382b4a19e2c0341a8"
- integrity sha512-aNbLpDONZejsQKdozt0c6mFvUc8yINpv6WgHyJ9oZm4GFkwtbe0KWTlowyNIO/yRaoGC+Y0BkmSLMnGImy01eQ==
+"@algolia/autocomplete-plugin-algolia-insights@1.17.9":
+ version "1.17.9"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz#74c86024d09d09e8bfa3dd90b844b77d9f9947b6"
+ integrity sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==
dependencies:
- "@algolia/autocomplete-shared" "1.17.8"
+ "@algolia/autocomplete-shared" "1.17.9"
"@algolia/autocomplete-plugin-recent-searches@^1.17.0":
- version "1.17.8"
- resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-recent-searches/-/autocomplete-plugin-recent-searches-1.17.8.tgz#1e7c6459cb909e899d9933a8297ba35106e77f82"
- integrity sha512-bwH/fus481LyRMFhM1BTaiWDkHgmJ1ojlRxUSIPEVauszZFd0cLtWUf4FEwkoQS3NOUpj9xMJr5zVFmq4AoXHA==
+ version "1.17.9"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-recent-searches/-/autocomplete-plugin-recent-searches-1.17.9.tgz#607c9317834d1bc2661f2e036dd7eb4e87e180f6"
+ integrity sha512-UWJoCFKprKwDEuzfXWt34+Yf01qlR5P1pWEfWeYTNnmV27P3prw6sZKy7anE8+yXVkmiDss6oMVNyYyYZ7+ZtQ==
dependencies:
- "@algolia/autocomplete-core" "1.17.8"
- "@algolia/autocomplete-js" "1.17.8"
- "@algolia/autocomplete-preset-algolia" "1.17.8"
- "@algolia/autocomplete-shared" "1.17.8"
+ "@algolia/autocomplete-core" "1.17.9"
+ "@algolia/autocomplete-js" "1.17.9"
+ "@algolia/autocomplete-preset-algolia" "1.17.9"
+ "@algolia/autocomplete-shared" "1.17.9"
-"@algolia/autocomplete-preset-algolia@1.17.8":
- version "1.17.8"
- resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.8.tgz#cdcc63993ee69a9e9fb6ed518e8039af33709db1"
- integrity sha512-EHGmvfV9Y6HzDlTSt/AAdOthVTH8zgr6A4h9ehheDsAjqsyXj9uNvMAd4lq5bOJs+MZCWTcxpK+Btr9Tcihr3g==
+"@algolia/autocomplete-preset-algolia@1.17.9":
+ version "1.17.9"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz#911f3250544eb8ea4096fcfb268f156b085321b5"
+ integrity sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==
dependencies:
- "@algolia/autocomplete-shared" "1.17.8"
+ "@algolia/autocomplete-shared" "1.17.9"
-"@algolia/autocomplete-shared@1.17.8":
- version "1.17.8"
- resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.8.tgz#aad70ec1bda2ae75f284c23b52295c2e6ada9493"
- integrity sha512-2w26RGB9zlyrnPpT/TpB0pbtukmUVYrKVt9ydlHnpPU7FgoiblUBpzzQTVzqMqYASGGjURaKLu7FakmaTIkClg==
+"@algolia/autocomplete-shared@1.17.9":
+ version "1.17.9"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz#5f38868f7cb1d54b014b17a10fc4f7e79d427fa8"
+ integrity sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==
"@algolia/autocomplete-theme-classic@^1.17.0":
- version "1.17.8"
- resolved "https://registry.yarnpkg.com/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.17.8.tgz#cd635a6240da44dcd3aec72b0e5bea0382248710"
- integrity sha512-70IJMktChk6mFTqegBYZk5MR0vquX+JEUG7rc4Jo75LTbe3BN4Lh6nUwaBXoLpx4v1zMID1vOsJ0Zv1M/3q3Jw==
+ version "1.17.9"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.17.9.tgz#df73d5f6a3c4674d46df9add3bb751bfb1bcf144"
+ integrity sha512-nCv0uv5J5r9riF1rJLfUY3AAJ11IbFifNocYINWG4cyOctHGoiK5ZDyYdQOLA98TCVR7hUywIYpvVCJBZnjGaw==
"@ampproject/remapping@^2.2.0":
version "2.3.0"
@@ -1664,10 +1664,10 @@
base64-js "1.3.1"
unicode-trie "^2.0.0"
-"@foliojs-fork/pdfkit@^0.15.2":
- version "0.15.2"
- resolved "https://registry.yarnpkg.com/@foliojs-fork/pdfkit/-/pdfkit-0.15.2.tgz#6dbe57ed45f1dc022d0219f3810071b9007e347e"
- integrity sha512-Wpj6BH4DGn+zAWmCk9agdbAw3Zxt+MpemjssLfYdnretWpZ014uR6Zo51E4ftVP75UA8a7mtt4TiCu09lIKsBw==
+"@foliojs-fork/pdfkit@^0.15.3":
+ version "0.15.3"
+ resolved "https://registry.yarnpkg.com/@foliojs-fork/pdfkit/-/pdfkit-0.15.3.tgz#590b31e770a98e2af62ce44f268a0d06b41ff32f"
+ integrity sha512-Obc0Wmy3bm7BINFVvPhcl2rnSSK61DQrlHU8aXnAqDk9LCjWdUOPwhgD8Ywz5VtuFjRxmVOM/kQ/XLIBjDvltw==
dependencies:
"@foliojs-fork/fontkit" "^1.9.2"
"@foliojs-fork/linebreak" "^1.1.1"
@@ -1680,44 +1680,44 @@
resolved "https://registry.yarnpkg.com/@foliojs-fork/restructure/-/restructure-2.0.2.tgz#73759aba2aff1da87b7c4554e6839c70d43c92b4"
integrity sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==
-"@formatjs/ecma402-abstract@2.3.1":
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.1.tgz#cdeb3ffe1aeea9c4284b85b7e37e8e8615314c39"
- integrity sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==
+"@formatjs/ecma402-abstract@2.3.2":
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.2.tgz#0ee291effe7ee2c340742a6c95d92eacb5e6c00a"
+ integrity sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg==
dependencies:
- "@formatjs/fast-memoize" "2.2.5"
- "@formatjs/intl-localematcher" "0.5.9"
+ "@formatjs/fast-memoize" "2.2.6"
+ "@formatjs/intl-localematcher" "0.5.10"
decimal.js "10"
tslib "2"
-"@formatjs/fast-memoize@2.2.5":
- version "2.2.5"
- resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.5.tgz#54a4a1793d773b72c372d3dcab3595149aee7880"
- integrity sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==
+"@formatjs/fast-memoize@2.2.6":
+ version "2.2.6"
+ resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.6.tgz#fac0a84207a1396be1f1aa4ee2805b179e9343d1"
+ integrity sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==
dependencies:
tslib "2"
-"@formatjs/icu-messageformat-parser@2.9.7":
- version "2.9.7"
- resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.7.tgz#84abd5c86ef2ad7cb82da63b3380c33808efb6da"
- integrity sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA==
+"@formatjs/icu-messageformat-parser@2.9.8":
+ version "2.9.8"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.8.tgz#118e7156f8a8db6b27b650f09334db21456c681f"
+ integrity sha512-hZlLNI3+Lev8IAXuwehLoN7QTKqbx3XXwFW1jh0AdIA9XJdzn9Uzr+2LLBspPm/PX0+NLIfykj/8IKxQqHUcUQ==
dependencies:
- "@formatjs/ecma402-abstract" "2.3.1"
- "@formatjs/icu-skeleton-parser" "1.8.11"
+ "@formatjs/ecma402-abstract" "2.3.2"
+ "@formatjs/icu-skeleton-parser" "1.8.12"
tslib "2"
-"@formatjs/icu-skeleton-parser@1.8.11":
- version "1.8.11"
- resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.11.tgz#e7c9918274dfa0c1c2bca1ab6e15ef49b10cf0bb"
- integrity sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw==
+"@formatjs/icu-skeleton-parser@1.8.12":
+ version "1.8.12"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.12.tgz#43076747cdbe0f23bfac2b2a956bd8219716680d"
+ integrity sha512-QRAY2jC1BomFQHYDMcZtClqHR55EEnB96V7Xbk/UiBodsuFc5kujybzt87+qj1KqmJozFhk6n4KiT1HKwAkcfg==
dependencies:
- "@formatjs/ecma402-abstract" "2.3.1"
+ "@formatjs/ecma402-abstract" "2.3.2"
tslib "2"
-"@formatjs/intl-localematcher@0.5.9":
- version "0.5.9"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz#43c6ee22be85b83340bcb09bdfed53657a2720db"
- integrity sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==
+"@formatjs/intl-localematcher@0.5.10":
+ version "0.5.10"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.10.tgz#1e0bd3fc1332c1fe4540cfa28f07e9227b659a58"
+ integrity sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==
dependencies:
tslib "2"
@@ -1874,6 +1874,13 @@
resolved "https://registry.yarnpkg.com/@orchidjs/unicode-variants/-/unicode-variants-1.1.2.tgz#1fd71791a67fdd1591ebe0dcaadd3964537a824e"
integrity sha512-5DobW1CHgnBROOEpFlEXytED5OosEWESFvg/VYmH0143oXcijYTprRYJTs+55HzGM4IqxiLFSuqEzu9mPNwVsA==
+"@part-db/html5-qrcode@^3.1.0":
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@part-db/html5-qrcode/-/html5-qrcode-3.1.1.tgz#96bf5e57796f3ec72ee6191ac7b8604298c98dfa"
+ integrity sha512-6lH77mvu9ClwIfKHWSOW1+jz+SkCJnbm/8XTuzqlcUWUIW8NRHC5x1wU7svV4gtoirqvBlQvaz1MaopVmfOAqQ==
+ dependencies:
+ barcode-detector "^2.3.1"
+
"@polka/url@^1.0.0-next.24":
version "1.0.0-next.28"
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73"
@@ -1932,6 +1939,16 @@
resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
+"@types/dom-webcodecs@0.1.11":
+ version "0.1.11"
+ resolved "https://registry.yarnpkg.com/@types/dom-webcodecs/-/dom-webcodecs-0.1.11.tgz#2e36e5cc71789551f107e2fe15d956845fa19567"
+ integrity sha512-yPEZ3z7EohrmOxbk/QTAa0yonMFkNkjnVXqbGb7D4rMr+F1dGQ8ZUFxXkyLLJuiICPejZ0AZE9Rrk9wUCczx4A==
+
+"@types/emscripten@^1.39.13":
+ version "1.39.13"
+ resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-1.39.13.tgz#afeb1648648dc096efe57983e20387627306e2aa"
+ integrity sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==
+
"@types/eslint-scope@^3.7.7":
version "3.7.7"
resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5"
@@ -1991,9 +2008,9 @@
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
"@types/node@*":
- version "22.10.2"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9"
- integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==
+ version "22.10.5"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b"
+ integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==
dependencies:
undici-types "~6.20.0"
@@ -2401,6 +2418,14 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+barcode-detector@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/barcode-detector/-/barcode-detector-2.3.1.tgz#91d0d4e3b913d87f94bae5d024b6b9b5cedc420c"
+ integrity sha512-D9KEtrquS1tmBZduxBZl8qublIKnRrFqD8TAHDYcLCyrHQBo+vitIxmjMJ61LvXjXyAMalOlO7q0Oh/9Rl2PbQ==
+ dependencies:
+ "@types/dom-webcodecs" "0.1.11"
+ zxing-wasm "1.3.4"
+
base64-js@1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
@@ -3110,11 +3135,11 @@ data-view-byte-offset@^1.0.1:
is-data-view "^1.0.1"
datatables.net-bs5@^2, datatables.net-bs5@^2.0.0:
- version "2.1.8"
- resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-2.1.8.tgz#860717c4ee85ecb84812ba9a73fb1204aa2a68b6"
- integrity sha512-YlGws8eI3iw/1AmKJH18+YMzm/UgGb6o9s14KAC24QT1/8anolm8GnVAgGcwUcvHm3hn1i8A5QXqgbqeMRINeg==
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-2.2.0.tgz#ba80819825b96827d6361f8385b092c2a657a8af"
+ integrity sha512-klqdrghM0BkBWulaWiGdKwdZyPHK+8coBGjhSQAZe/eQBnr7OLC8wl7NqPfQuVXv4J74HgO6K1gIYHKHbHjrtA==
dependencies:
- datatables.net "2.1.8"
+ datatables.net "2.2.0"
jquery ">=1.7"
datatables.net-buttons-bs5@^3.0.0:
@@ -3202,10 +3227,10 @@ datatables.net-select@2.1.0:
datatables.net "^2"
jquery ">=1.7"
-datatables.net@2.1.8, datatables.net@^2, datatables.net@^2.0.0:
- version "2.1.8"
- resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.1.8.tgz#9b020f18e927cc924d72411f62dc595cc688669b"
- integrity sha512-47ULt+U4bcjbuGTpTlT6SnCuSFVRBxxdWa6X3NfvTObBJ2BZU0o+JUIl05wQ6cABNIavjbAV51gpgvFsMHL9zA==
+datatables.net@2.2.0, datatables.net@^2, datatables.net@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.2.0.tgz#d7e92ede9a3bf23ac4c360e475fbe6313f16fd56"
+ integrity sha512-q/G5ylL+AhMLFFHNYQAgvooCZtmbudc7wwzKkCZI4B1HnYec4SqnWtcTFjC7P6EtL1UGyx16FcjQ0U84S86mLg==
dependencies:
jquery ">=1.7"
@@ -3365,9 +3390,9 @@ domutils@^2.5.2, domutils@^2.8.0:
domhandler "^4.2.0"
domutils@^3.0.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.1.tgz#b39f4c390a1ae6f6a2c56a5f5a16d6438b6bce28"
- integrity sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78"
+ integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==
dependencies:
dom-serializer "^2.0.0"
domelementtype "^2.3.0"
@@ -3388,9 +3413,9 @@ duplexer@^0.1.2:
integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
electron-to-chromium@^1.5.73:
- version "1.5.76"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d"
- integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==
+ version "1.5.78"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.78.tgz#223cdc76a5d15ac731136e68430e92cb8d612d13"
+ integrity sha512-UmwIt7HRKN1rsJfddG5UG7rCTCTAKoS9JeOy/R0zSenAyaZ8SU3RuXlwcratxhdxGRNpk03iq8O7BA3W7ibLVw==
emoji-regex@^7.0.1:
version "7.0.3"
@@ -3449,10 +3474,10 @@ error-stack-parser@^2.1.4:
dependencies:
stackframe "^1.3.4"
-es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.6:
- version "1.23.8"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.8.tgz#99754723118355d82fcef9ce4c90ccbcd5d2a285"
- integrity sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ==
+es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9:
+ version "1.23.9"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606"
+ integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==
dependencies:
array-buffer-byte-length "^1.0.2"
arraybuffer.prototype.slice "^1.0.4"
@@ -3465,10 +3490,11 @@ es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.6:
es-define-property "^1.0.1"
es-errors "^1.3.0"
es-object-atoms "^1.0.0"
- es-set-tostringtag "^2.0.3"
+ es-set-tostringtag "^2.1.0"
es-to-primitive "^1.3.0"
function.prototype.name "^1.1.8"
- get-intrinsic "^1.2.6"
+ get-intrinsic "^1.2.7"
+ get-proto "^1.0.0"
get-symbol-description "^1.1.0"
globalthis "^1.0.4"
gopd "^1.2.0"
@@ -3489,11 +3515,12 @@ es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.6:
object-inspect "^1.13.3"
object-keys "^1.1.1"
object.assign "^4.1.7"
- own-keys "^1.0.0"
+ own-keys "^1.0.1"
regexp.prototype.flags "^1.5.3"
safe-array-concat "^1.1.3"
safe-push-apply "^1.0.0"
safe-regex-test "^1.1.0"
+ set-proto "^1.0.0"
string.prototype.trim "^1.2.10"
string.prototype.trimend "^1.0.9"
string.prototype.trimstart "^1.0.8"
@@ -3531,14 +3558,15 @@ es-object-atoms@^1.0.0:
dependencies:
es-errors "^1.3.0"
-es-set-tostringtag@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
- integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
+es-set-tostringtag@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
+ integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
dependencies:
- get-intrinsic "^1.2.4"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
has-tostringtag "^1.0.2"
- hasown "^2.0.1"
+ hasown "^2.0.2"
es-to-primitive@^1.3.0:
version "1.3.0"
@@ -3655,15 +3683,15 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-glob@^3.0.3, fast-glob@^3.2.11:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
- integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
+ integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
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"
+ micromatch "^4.0.8"
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
@@ -3671,9 +3699,9 @@ fast-json-stable-stringify@^2.0.0:
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
fast-uri@^3.0.1:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241"
- integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.5.tgz#19f5f9691d0dab9b85861a7bb5d98fca961da9cd"
+ integrity sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==
fastest-levenshtein@1.0.16, fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.16:
version "1.0.16"
@@ -3811,21 +3839,29 @@ get-caller-file@^2.0.1:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6:
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5"
- integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==
+get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.7.tgz#dcfcb33d3272e15f445d15124bc0a216189b9044"
+ integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==
dependencies:
call-bind-apply-helpers "^1.0.1"
- dunder-proto "^1.0.0"
es-define-property "^1.0.1"
es-errors "^1.3.0"
es-object-atoms "^1.0.0"
function-bind "^1.1.2"
+ get-proto "^1.0.0"
gopd "^1.2.0"
has-symbols "^1.1.0"
hasown "^2.0.2"
- math-intrinsics "^1.0.0"
+ math-intrinsics "^1.1.0"
+
+get-proto@^1.0.0, get-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
+ integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-object-atoms "^1.0.0"
get-symbol-description@^1.1.0:
version "1.1.0"
@@ -3979,14 +4015,14 @@ has-symbols@^1.0.0, has-symbols@^1.0.3, has-symbols@^1.1.0:
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
-has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
+has-tostringtag@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
dependencies:
has-symbols "^1.0.3"
-hasown@^2.0.1, hasown@^2.0.2:
+hasown@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
@@ -4008,11 +4044,6 @@ html-escaper@^2.0.2:
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
-html5-qrcode@^2.2.1:
- version "2.3.8"
- resolved "https://registry.yarnpkg.com/html5-qrcode/-/html5-qrcode-2.3.8.tgz#0b0cdf7a9926cfd4be530e13a51db47592adfa0d"
- integrity sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==
-
htmlparser2@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7"
@@ -4109,13 +4140,13 @@ interpret@^3.1.1:
integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==
intl-messageformat@^10.2.5:
- version "10.7.10"
- resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.10.tgz#fc8fc8c13b0a4104ba08dc2f5f9225f14945bcb7"
- integrity sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw==
+ version "10.7.11"
+ resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.11.tgz#f24893b2a64e7b5ec29f9eceb4f1a58bde1346e0"
+ integrity sha512-IB2N1tmI24k2EFH3PWjU7ivJsnWyLwOWOva0jnXFa29WzB6fb0JZ5EMQGu+XN5lDtjHYFo0/UooP67zBwUg7rQ==
dependencies:
- "@formatjs/ecma402-abstract" "2.3.1"
- "@formatjs/fast-memoize" "2.2.5"
- "@formatjs/icu-messageformat-parser" "2.9.7"
+ "@formatjs/ecma402-abstract" "2.3.2"
+ "@formatjs/fast-memoize" "2.2.6"
+ "@formatjs/icu-messageformat-parser" "2.9.8"
tslib "2"
is-arguments@^1.1.1:
@@ -4141,11 +4172,14 @@ is-arrayish@^0.2.1:
integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
is-async-function@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646"
- integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.0.tgz#1d1080612c493608e93168fc4458c245074c06a6"
+ integrity sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==
dependencies:
- has-tostringtag "^1.0.0"
+ call-bound "^1.0.3"
+ get-proto "^1.0.1"
+ has-tostringtag "^1.0.2"
+ safe-regex-test "^1.1.0"
is-bigint@^1.1.0:
version "1.1.0"
@@ -4231,11 +4265,14 @@ is-fullwidth-code-point@^3.0.0:
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-generator-function@^1.0.10:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
- integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca"
+ integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==
dependencies:
- has-tostringtag "^1.0.0"
+ call-bound "^1.0.3"
+ get-proto "^1.0.0"
+ has-tostringtag "^1.0.2"
+ safe-regex-test "^1.1.0"
is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.3"
@@ -4640,11 +4677,11 @@ marked@4.0.12:
integrity sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==
marked@^15.0.4:
- version "15.0.4"
- resolved "https://registry.yarnpkg.com/marked/-/marked-15.0.4.tgz#864dbf50227b6507646c771c2ef5f0de2924833e"
- integrity sha512-TCHvDqmb3ZJ4PWG7VEGVgtefA5/euFmsIhxtD0XsBxI39gUSKL81mIRFdt0AiNQozUahd4ke98ZdirExd/vSEw==
+ version "15.0.6"
+ resolved "https://registry.yarnpkg.com/marked/-/marked-15.0.6.tgz#8165f16afb6f4b30a35bdcee657c3b8415820a8f"
+ integrity sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==
-math-intrinsics@^1.0.0, math-intrinsics@^1.1.0:
+math-intrinsics@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
@@ -4669,7 +4706,7 @@ merge2@^1.2.3, merge2@^1.3.0:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-micromatch@^4.0.0, micromatch@^4.0.4:
+micromatch@^4.0.0, micromatch@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
@@ -4938,10 +4975,10 @@ opener@^1.5.2:
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
-own-keys@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.0.tgz#4ab4f9758185bd8f2716f95453ea7da72fb56c09"
- integrity sha512-HcuIjzpjrUbqZPGzWHVg95Bc2Y37KoY5n66QQyEGMzrIWVKHsgHcv8/Aq5Cu3qFUQJzMSPVP8MD3oaFoaME1lg==
+own-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358"
+ integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==
dependencies:
get-intrinsic "^1.2.6"
object-keys "^1.1.1"
@@ -5071,12 +5108,12 @@ path-type@^4.0.0:
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
pdfmake@^0.2.2:
- version "0.2.17"
- resolved "https://registry.yarnpkg.com/pdfmake/-/pdfmake-0.2.17.tgz#64beeb0b09c7e0ade39b6d4b379371818cea3da5"
- integrity sha512-ODOp1T232yr/HGjdYCq888paBE7RDCflCOSRDUtR9CyfXneOmnMPZJl8dxP9zEXbKiv9vfk9Z/3eK2V2B/Wx/Q==
+ version "0.2.18"
+ resolved "https://registry.yarnpkg.com/pdfmake/-/pdfmake-0.2.18.tgz#0be32a9274466494a69285193b64f61f3198ea4e"
+ integrity sha512-Fe+GnMS8EVZu5rci/CDaQ+xmUoHvx8P+rvIlrwSYM6A5c7Aik8G6lpJbddhjBE2jXGjv6WcUCFCB06uZbjxkMw==
dependencies:
"@foliojs-fork/linebreak" "^1.1.2"
- "@foliojs-fork/pdfkit" "^0.15.2"
+ "@foliojs-fork/pdfkit" "^0.15.3"
iconv-lite "^0.6.3"
xmldoc "^1.3.0"
@@ -5130,11 +5167,11 @@ possible-typed-array-names@^1.0.0:
integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
postcss-calc@^10.0.2:
- version "10.0.2"
- resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.0.2.tgz#15f01635a27b9d38913a98c4ef2877f5b715b439"
- integrity sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.1.0.tgz#82548b9d52891b87cf6181a445bea4b78e2eedfb"
+ integrity sha512-uQ/LDGsf3mgsSUEXmAt3VsCSHR3aKqtEIkmB+4PhzYwRYOW5MZs/GhCCFpsOtJJkP6EC6uGipbrnaTjqaJZcJw==
dependencies:
- postcss-selector-parser "^6.1.2"
+ postcss-selector-parser "^7.0.0"
postcss-value-parser "^4.2.0"
postcss-calc@^9.0.1:
@@ -5732,17 +5769,17 @@ rechoir@^0.8.0:
resolve "^1.20.0"
reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz#c905f3386008de95a62315f3ea8630404be19e2f"
- integrity sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9"
+ integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==
dependencies:
call-bind "^1.0.8"
define-properties "^1.2.1"
- dunder-proto "^1.0.1"
- es-abstract "^1.23.6"
+ es-abstract "^1.23.9"
es-errors "^1.3.0"
- get-intrinsic "^1.2.6"
- gopd "^1.2.0"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.7"
+ get-proto "^1.0.1"
which-builtin-type "^1.2.1"
regenerate-unicode-properties@^10.2.0:
@@ -5780,13 +5817,15 @@ regex-parser@^2.2.11:
integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==
regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.3:
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42"
- integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19"
+ integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==
dependencies:
- call-bind "^1.0.7"
+ call-bind "^1.0.8"
define-properties "^1.2.1"
es-errors "^1.3.0"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
set-function-name "^2.0.2"
regexpu-core@^6.2.0:
@@ -6036,6 +6075,15 @@ set-function-name@^2.0.2:
functions-have-names "^1.2.3"
has-property-descriptors "^1.0.2"
+set-proto@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e"
+ integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+
setimmediate@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
@@ -6931,3 +6979,10 @@ yocto-queue@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110"
integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==
+
+zxing-wasm@1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/zxing-wasm/-/zxing-wasm-1.3.4.tgz#4bc45b78dc3594278bb0c24233bfb035ca9efab1"
+ integrity sha512-9l0QymyATF19FmI92QHe7Dayb+BUN7P7zFAt5iDgTnUf0dFWokz6GVA/W9EepjW5q8s3e89fIE/7uxpX27yqEQ==
+ dependencies:
+ "@types/emscripten" "^1.39.13"
|