diff --git a/.stylelintrc.yml b/.stylelintrc.yml index 27156f865..2a3fc8c75 100644 --- a/.stylelintrc.yml +++ b/.stylelintrc.yml @@ -12,6 +12,7 @@ rules: # - https://github.com/stylelint/stylelint-config-recommended/blob/main/index.js # possible errors (these are all on by default) + declaration-block-no-redundant-longhand-properties: null no-descending-specificity: null # limit language features diff --git a/content/_data/site.yaml b/content/_data/site.yaml index 147ac8784..dc6b829ea 100644 --- a/content/_data/site.yaml +++ b/content/_data/site.yaml @@ -12,7 +12,9 @@ styles: facebook_id: 1820980378150914 social: email: birds - twitter: oddbird + mastodon: + user: oddbird + server: front-end.social github: oddbird nav: - url: /work/ @@ -26,5 +28,5 @@ nav: me: - https://www.oddbird.net/ - mailto:birds@oddbird.net - - https://twitter.com/oddbird + - https://front-end.social/@OddBird - https://github.com/oddbird diff --git a/content/_data/webmentions.json b/content/_data/webmentions.json index a25474f49..dc2fec4b1 100644 --- a/content/_data/webmentions.json +++ b/content/_data/webmentions.json @@ -1,5 +1,5 @@ { - "lastFetched": "2023-10-09T08:06:29.347Z", + "lastFetched": "2023-10-23T08:05:56.397Z", "children": [ { "type": "entry", diff --git a/content/_includes/site/footer.njk b/content/_includes/site/footer.njk index d2afd3bad..29087c4e4 100644 --- a/content/_includes/site/footer.njk +++ b/content/_includes/site/footer.njk @@ -6,9 +6,9 @@ {%- set footer_title = "Let's chat about your web project" -%} {%- set footer_content -%} Fill out the form, - [schedule a call](https://calendly.com/oddbird/discovery), - send us an [email](mailto:birds@oddbird.net), - or find us on [Twitter](https://twitter.com/oddbird) or [GitHub](https://github.com/oddbird) + [schedule a call](https://calendly.com/oddbird/discovery), or + send us an [email](mailto:birds@oddbird.net). + {{ contact.social(site.social, 'OddBird', false, rel='me') | safe }} {%- endset -%} {%- if add_cta %} diff --git a/content/_includes/talks.macros.njk b/content/_includes/talks.macros.njk index d512e86fc..dafb65d97 100644 --- a/content/_includes/talks.macros.njk +++ b/content/_includes/talks.macros.njk @@ -136,16 +136,12 @@ params: ) }} {% endh %} - {% if not compact %} - {% if not event.is_future %} - {{ links(event) }} - {% elif event.data.discount %} - <p class="event-discount"> - Use discount code - <code>{{ event.data.discount.code }}</code> - to get <strong>{{ event.data.discount.amount }} off</strong> - </p> - {% endif %} + {% if not event.is_future %} + {{ '' if compact else links(event) }} + {% elif event.data.note %} + <p class="event-note"> + {{ event.data.note | mdInline | safe }} + </p> {% endif %} </li> {%- endfor -%} diff --git a/content/birds/index.njk b/content/birds/index.njk index 8a97185b6..632a63473 100644 --- a/content/birds/index.njk +++ b/content/birds/index.njk @@ -5,7 +5,9 @@ sub: Founded in 2008 by three odd siblings permalink: about/index.html bird: oddbird social: - twitter: oddbird + mastodon: + user: oddbird + server: front-end.social github: oddbird email: birds summary: | diff --git a/content/blog/2023/fastapi-path-operations-for-django-developers.md b/content/blog/2023/fastapi-path-operations-for-django-developers.md new file mode 100644 index 000000000..326dbbccf --- /dev/null +++ b/content/blog/2023/fastapi-path-operations-for-django-developers.md @@ -0,0 +1,264 @@ +--- +title: FastAPI Path Operations for Django Developers +author: ed +date: 2023-10-19 +tags: + - Article + - Python + - Django + - FastAPI +image: + src: blog/2023/fast.jpg +summary: | + FastAPI path operations are the equivalent of Django views. In this article we + explore the differences, advantages, and gotchas of using them from the + perspective of a Django developer. +--- + +If you've heard about [FastAPI], a modern and fast web framework for building +APIs with Python, you might be wondering how it compares to Django, the most +popular and mature web framework for Python. In this series, I will answer this +question by comparing various aspects and features of Django and FastAPI, based +on our recent experience converting an internal project from Django to FastAPI. + +[FastAPI]: https://fastapi.tiangolo.com/ + +1. FastAPI Path Operations for Django Developers (this article) +2. [SQLAlchemy for Django Developers] +3. Testing a FastAPI Application (coming soon) +4. How To Use FastAPI Dependency Injection Everywhere (coming soon) + +[SQLAlchemy for Django Developers]: /2023/10/23/sqlalchemy-for-django-developers/ + +## Why is FastAPI Worth Considering? + +I discovered Django when I wanted to explore web frameworks outside the ASP.NET +and Windows ecosystem. I was impressed by its "batteries included" approach that +provides everything you need to build a web application, from the database layer +to the user interface. I also appreciate its "don't repeat yourself" philosophy +that encourages developers to write less code and focus on the business logic. +For over a decade, Django has been my go-to framework for building web apps that +are secure, performant, and a pleasure to work with. + +In recent years, I have experienced two big shifts in the way I develop web +applications. First, I expect development tools to do more for me when it comes +to authoring software. Modern IDEs and code editors have really spoiled me with +convenient features like go-to-definition, auto-completion, and one-click +refactoring. This also means I expect languages and frameworks themselves to +encourage best practices and help me write better code. Static type checking, +automatic code formatting, and dependency injection are some of the features +that I have a hard time living without. + +Because Django pre-dates Python's type checking system and it (rightly) wants to +remain as backwards compatible as possible, all efforts to leverage static type +checking and deeper text editor integration have been bolted-on, experimental, +and incomplete. The main player in this space seems to be [django-stubs], which +provides type hints for Django as a separate package. After using it for a +while, my conclusion is that Django was not designed with types in mind, and +efforts to add them are mostly futile. The time and effort of adding and +maintaining type hints for a Django app is not worth the limited benefits. + +[django-stubs]: https://github.com/typeddjango/django-stubs + +The second shift has to do with the proliferation of single-page applications +and the need for cohesion and consistency across the API and frontend layers. +Cohesion means that the API should provide a clear and logical way to access and +manipulate the data and services that the backend offers. Consistency means that +the API should follow common standards and conventions for data types, formats, +errors, validations, and documentation. + +Developing APIs with Django means you're probably using the excellent [Django +REST Framework] (DRF for short). This package is a shining example of how Django +gives you complete and robust functionality with very little code (shout out to +you, `ViewSet`). However, it suffers from the same problems as Django itself: it +was not designed with types in mind or to share information about endpoints and +serializers with consumers of its APIs. We tried to bridge this gap with +[drf-spectacular], which produces [OpenAPI] schemas from DRF views and +serializers. Its main limitation is that it relies on developers to manually +annotate their application with additional information, and there's no guarantee +that your schema will be up-to-date with your code. For this reason I wouldn't +consider it a definitive solution. + +[Django REST Framework]: https://www.django-rest-framework.org/ +[drf-spectacular]: https://github.com/tfranzel/drf-spectacular +[OpenAPI]: https://swagger.io/specification/ + +In the middle of all this, I kept hearing about FastAPI and how it was not only +fast, but also leveraged Python's type system to provide a better developer +experience *and* automatic documentation and schemas for API consumers. After +following its excellent [tutorial], I asked the team to consider it for +[OddBooks], our collaborative writing tool. An exploratory branch was created +and after reviewing the resulting code, we decided to go ahead and officially +switch to FastAPI for this project. + +[tutorial]: https://fastapi.tiangolo.com/tutorial/ +[OddBooks]: https://oddbooks.app + +## Django Views + +In OddBooks we have a `Version` model that encapsulates the idea of a snapshot +of a document at a given point in time. Here's a simplified Django model: + +```python +class Version(models.Model): + document = models.ForeignKey(Document, on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True) + title = models.CharField(max_length=255) + text = models.TextField() +``` + +And the corresponding DRF serializer and view set that only allows editing the +document and text during creation, not updates: + +```python +class VersionSerializer(serializers.ModelSerializer): + class Meta: + model = Version + fields = ["id", "document", "created_at", "title", "text"] + read_only_fields = ["id", "document", "created_at", "text"] + +class VersionCreateSerializer(VersionSerializer): + class Meta(VersionSerializer.Meta): + read_only_fields = ["id", "created_at"] + +class VersionViewSet(viewsets.ModelViewSet): + queryset = Version.objects.all() + serializer_class = VersionSerializer + + def get_serializer_class(self): + if self.action == "create": + return VersionCreateSerializer + return super().get_serializer_class() +``` + +Notice a few things: + +- We don't get auto-complete or static type checking for the serializer fields. + We are on our own to fill out `fields` and `read_only_fields`. There's also no + way to know the types of the fields without looking at the model definition + directly. +- We get no documentation or schemas for the API endpoints. We have to manually + write them and keep them up-to-date with the code. + +## FastAPI Path Operations + +Here's an equivalent version written as FastAPI path operations (the equivalent +of Django views): + +```python +from pydantic import BaseModel +from fastapi import FastAPI + +class VersionUpdate(BaseModel): + title: str + +class VersionCreate(BaseModel): + document: int + title: str + text: str + +class VersionRead(BaseModel): + id: int + document: int + created_at: datetime + text: str + +app = FastAPI() + +@app.get("/versions", response_model=list[VersionRead]) +def list_versions(): + return get_versions_from_db() + +@app.post("/versions", response_model=VersionRead, status_code=201) +def create_version(version: VersionCreate): + return write_version_to_db(**version.dict()) + +@app.put("/versions/{version_id}", response_model=VersionRead) +def update_version(version_id: int, version: VersionUpdate): + version = get_version_from_db(id=version_id) + version.title = version.title + version.save() + return version + +@app.get("/versions/{version_id}", response_model=VersionRead) +def get_version(version_id: int): + return get_version_from_db(id=version_id) + +@app.delete("/versions/{version_id}", status_code=204) +def delete_version(version_id: int): + delete_version_from_db(id=version_id) +``` + +*Note: I'm hiding the actual database read and write operations behind +`get_versions_from_db` and similar functions. How you [connect to your database] +is a separate topic and I want to focus on writing and consuming API endpoints +here.* + +[connect to your database]: /2023/10/23/sqlalchemy-for-django-developers/ + +In contrast with the Django version, we get: + +- Auto-complete and static type checking for the model fields thanks to + [Pydantic]. Need to see what fields are available on a version instance? Just + type `version.` and your editor will show you the available fields and their + types. +- [Automatic documentation] and [OpenAPI schema] for the API endpoints. This is + cohesive and consistent enough to be used to autogenerate frontend type + definitions and [API clients]. We are actually doing this in OddBooks and it + has done away with a handful of unit / integration tests and consistently + warns the frontend team when the API has changed. +- Runtime validation of the request body and URL parameters by using type hints. + FastAPI will ensure that something like `def update_version(id: int, version: + VersionUpdate):` will only accept a JSON body with a `title` field and an + integer URL parameter. +- Automatic serialization of the response body by using the `response_model` + parameter. FastAPI will ensure that the response body is a JSON object with + the expected fields and types. The path operation itself can return anything + that can be converted to JSON, including Pydantic models, dictionaries, lists, + and primitives. + +[Pydantic]: https://docs.pydantic.dev/latest/ +[Automatic documentation]: https://fastapi.tiangolo.com/tutorial/path-params/#documentation +[OpenAPI schema]: https://fastapi.tiangolo.com/tutorial/first-steps/#check-the-openapijson +[API clients]: https://fastapi.tiangolo.com/advanced/generate-clients/ + +## Advice for Django Developers + +You will notice that the FastAPI version is considerably more verbose than the +Django version. This is where Django's "batteries included" approach really +shines. However, I would argue that the verbosity is worth it for the benefits +listed above, and by also nudging developers to be explicit in the input and +output types of each individual endpoint, instead of relying on the hooks +provided by DRF to serialize and deserialize data in different ways. You might +even say we have traded one set of "batteries" for another. + +FastAPI itself doesn't have concepts of models or serializers. Instead, it +relies on [Pydantic] models to validate data. These models are not meant to be +used as representations of database tables, but rather as representations of the +data that is sent and received by the API, so they are closer to DRF +serializers. + +I spent a non-trivial amount of time trying to make FastAPI behave like Django +by trying to minimize the amount of Pydantic models. If Django only needs one or +two serializers for all CRUD operations, why can't FastAPI do the same? I +started going down the rabbit hole of adding custom methods and properties, +using inheritance, and in general introducing a lot of complexity to get that +DRY magic back. I eventually realized that I was fighting against the framework +instead of embracing it, and that I was better off writing small, focused +Pydantic models for each endpoint. + +## Conclusion + +So, is FastAPI worth considering? I would say yes, especially if you're +developing an API that needs to be consumed by a frontend application. The +benefits of static type checking, automatic documentation, and automatic schema +generation are too good to pass up. If you're developing a traditional, +multi-page application then the benefits are less clear and you might be better +off sticking with Django because while FastAPI offers Jinja2 support for +[templating] and easily serves [static files] as well, it lacks a [built-in ORM] +and [admin interface]. + +[templating]: https://fastapi.tiangolo.com/advanced/templates/ +[static files]: https://fastapi.tiangolo.com/tutorial/static-files/ +[built-in ORM]: https://docs.djangoproject.com/en/4.2/topics/db/queries/ +[admin interface]: https://docs.djangoproject.com/en/4.2/ref/contrib/admin/ diff --git a/content/blog/2023/sqlalchemy-for-django-developers.md b/content/blog/2023/sqlalchemy-for-django-developers.md new file mode 100644 index 000000000..d47c7314b --- /dev/null +++ b/content/blog/2023/sqlalchemy-for-django-developers.md @@ -0,0 +1,361 @@ +--- +title: SQLAlchemy for Django Developers +author: ed +date: 2023-10-23 +tags: + - Article + - Python + - Django + - FastAPI + - SQLAlchemy +image: + src: blog/2023/library.jpg +summary: | + SQLAlchemy is a Python library for interacting with relational databases. It + is a popular alternative to Django's ORM used by frameworks such as FastAPI. + In this article we will help curious Django developers write their first + queries with SQLAlchemy, and highlight key differences. +--- + +If you've heard about [FastAPI], a modern and fast web framework for building +APIs with Python, you might be wondering how it compares to Django, the most +popular and mature web framework for Python. In this series, I will answer this +question by comparing various aspects and features of Django and FastAPI, based +on our recent experience converting an internal project from Django to FastAPI. + +[FastAPI]: https://fastapi.tiangolo.com/ + +1. [FastAPI Path Operations for Django Developers] +2. SQLAlchemy for Django Developers (this article) +3. Testing a FastAPI Application (coming soon) +4. How To Use FastAPI Dependency Injection Everywhere (coming soon) + +[FastAPI Path Operations for Django Developers]: /2023/10/19/fastapi-path-operations-for-django-developers/ + +## About SQLAlchemy + +Both Django's [ORM] (Object Relational Mapper) and [SQLAlchemy] are libraries +for interacting with relational databases. Django's ORM is tightly coupled with +the Django framework, while SQLAlchemy is a standalone library that can be used +with any Python application. I heard about it many years ago, but never had the +need to use it because Django's ORM was good enough for me (to the point that I +know surprisingly little SQL). But when I started using FastAPI, SQLAlchemy was +the recommended library for interacting with the database. Let's follow +SQLAlchemy's [Quick Start] guide to create a simple database while learning +about the differences between SQLAlchemy and Django's ORM. + +[ORM]: https://docs.djangoproject.com/en/4.2/topics/db/queries/ +[SQLAlchemy]: https://www.sqlalchemy.org/ +[Quick Start]: https://docs.sqlalchemy.org/en/20/orm/quickstart.html + +## Model Definition: Surprisingly Similar + +The first thing I noticed when I started using SQLAlchemy was how similar it is +to Django's ORM when it comes to defining models as classes that represent +database tables. Here is an example of a `User` model in Django: + +```python +from django.db import models + +class User(models.Model): + name = models.CharField(max_length=100) + fullname = models.TextField() +``` + +And here is the same model in SQLAlchemy: + +```python +from sqlalchemy import String +from sqlalchemy.orm import Mapped, mapped_column, DeclarativeBase + +class User(DeclarativeBase): + __tablename__ = "user_account" + + id: Mapped[int] = mapped_column(primary_key=True) + name: Mapped[str] = mapped_column(String(30)) + fullname: Mapped[Optional[str]] +``` + +*Note: this [declarative style] for model definition is relatively new, +superseding the old `declarative_base` function in SQLAlchemy 2.0. You might +still encounter the old style in some codebases.* + +[declarative style]: https://docs.sqlalchemy.org/en/20/orm/mapping_styles.html#orm-declarative-mapping + +These two models are similar in that once they get information out of the +database, table columns are accessible as attributes of the model instances such +as `user.name` and `user.fullname`. In the same way, modifying the attributes of +a model instance like `user.name = "Jane"` will modify the corresponding +database record when the object is "saved" (which is done differently in +SQLAlchemy as we will see later). + +In contrast, these models differ in that SQLAlchemy relies more heavily on type +hints to define the model. In my opinion this results in a more natural and +robust developer experience. For example, the `fullname` field only requires the +`Mapped[Optional[str]]` annotation to be mapped to a nullable text column. +Fields that require further customization that can't be expressed in a type +hint, like setting a character limit or marking a column as primary key, can use +the [`mapped_column`] function as seen in the `id` and `name` fields. In all +cases, by using the [`Mapped`] annotation type checkers have everything they +need to correctly type the model attributes. + +[`mapped_column`]: https://docs.sqlalchemy.org/en/20/orm/mapping_api.html#sqlalchemy.orm.mapped_column +[`Mapped`]: https://docs.sqlalchemy.org/en/20/orm/internals.html#sqlalchemy.orm.Mapped + +SQLAlchemy also supports defining models with the +[imperative syntax], which is less similar to Django's ORM. I personally prefer +the declarative syntax and find it more readable and intuitive. + +[imperative syntax]: https://docs.sqlalchemy.org/en/20/orm/mapping_styles.html#orm-imperative-mapping + +## Engines and Sessions Instead of Managers + +In Django, every model comes with a manager exposed as the `objects` attribute. +This means that as long as you get a reference to the model class, you can +access the manager and perform queries. For example, for the `User` model, you +can get all users with `User.objects.all()`. + +In SQLAlchemy, you need to create an [engine] and [session] first before you can +perform any queries. You can think of the engine as a factory that provides us +with database connections, and sessions map roughly to these individual +connections. + +[engine]: https://docs.sqlalchemy.org/en/20/core/connections.html#sqlalchemy.engine.Engine +[session]: https://docs.sqlalchemy.org/en/20/tutorial/dbapi_transactions.html#tutorial-executing-orm-session + +```python +from sqlalchemy import create_engine +from sqlalchemy.orm import Session + +engine = create_engine("sqlite:///db.sqlite3") +with Session(engine) as session: + users = session.execute("SELECT * FROM users").all() +``` + +*Notice we are using raw SQL here instead of the ORM. We will get to the ORM in +the next section.* + +You don't need to use a context manager to create a session, but it is +recommended so that the session is automatically closed when you are done with +it. This can get annoying when you are writing FastAPI path operations because +the code for each operation will be inside a context manager. Luckily, you can +create a FastAPI dependency that `yield`s the session from the context manager +and use it by declaring it as an argument in your path operation. + +```python +from fastapi import Depends, FastAPI +from sqlalchemy import create_engine +from sqlalchemy.orm import Session, sessionmaker + +engine = create_engine("sqlite:///db.sqlite3") +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +app = FastAPI() + +def get_session() -> Session: + with SessionLocal() as session: + yield session + +@app.get("/users", response_model=...) +def get_users(session: Session = Depends(get_session)): + return session.execute("SELECT * FROM users").all() +``` + +## Query with Class Attributes Instead of Keyword Arguments + +In Django, you can query a model with keyword arguments. For example, if you +want to get a single user with the name "John", you can do +`User.objects.get(name="John")`. In SQLAlchemy, you need to use class attributes +instead: + +```python +from sqlalchemy import select + +john = session.scalars(select(User).where(User.name == "John")).one() +``` + +The `where` method is chained to the `select` function and achieves the same as +the `filter` and `get` methods in Django. However, instead of keyword arguments, +we use an actual comparison of the `name` attribute with the string `"John"`. +This caught me off guard at first but I've come to appreciate it because I get +help from my text editor when building queries instead of trying to guess the +names of keyword arguments. + +More complex queries are also different. Django encourages you to use a double +underscore syntax for more specific lookups. For example, to get all users with +IDs 1, 2, or 3, you use `User.objects.filter(id__in=[1, 2, 3])`. SQLAlchemy +achieves this by exposing custom methods as part of the class attributes: + +```python +users = session.scalars(select(User).where(User.id.in_([1, 2, 3]))).all() +``` + +*The trailing underscore in `in_()` is needed because `in` is a reserved word in +Python, not because of anything specific to SQLAlchemy.* + +There's a whole host of interesting methods you can use with model attributes as +explained in the [`ColumnElement` documentation]. + +[`ColumnElement` documentation]: + https://docs.sqlalchemy.org/en/20/core/sqlelement.html#sqlalchemy.sql.expression.ColumnElement + +The `select` function accepts entire model classes or individual columns as +arguments. For example, to get only the `name` column, you can do +`select(User.name)`. + +Finally, notice that we call `one()` or `all()` instead of using separate +`get()` and `filter()` methods. This is because the `scalars` method returns a +[ScalarResult] that allows us to chose how to get the results. + +[ScalarResult]: https://docs.sqlalchemy.org/en/20/core/connections.html#sqlalchemy.engine.ScalarResult + +## Commit Sessions Instead of Saving Model Instances + +In Django, given a model instance `user`, you can save it to the database with +`user.save()`. In SQLAlchemy, you need to commit the session instead: + +```python +session.add(user) +session.commit() +``` + +This actually makes it easier to bundle together multiple "saves", even if they +are for different models, into a single transaction. You can do this by adding +multiple objects to the session and then committing the session. + +```python +user1 = User(...) +user2 = User(...) +address1 = Address(...) +session.add_all([user1, user2, address1]) +session.commit() +``` + +In Django terms, the session is like a transaction that you can commit to when +you're ready, and the notion of saving individual model instances by calling one +of their methods is not present. + +## Relations Require More Work + +Let's add an `Address` and let each user have multiple addresses. In Django, you +can do this with a `ForeignKey`: + +```python +# No changes required to the User model + +class Address(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + email_address = models.TextField() +``` + +In SQLAlchemy, you need to define the relationship explicitly: + +```python +from sqlalchemy import ForeignKey, String +from sqlalchemy.orm import relationship, Mapped, mapped_column, DeclarativeBase + +class User(DeclarativeBase): + # Previous attributes omitted for brevity + + addresses: Mapped[list["Address"]] = relationship( + back_populates="user", cascade="all, delete-orphan" + ) + +class Address(DeclarativeBase): + __tablename__ = "address" + + id: Mapped[int] = mapped_column(primary_key=True) + email_address: Mapped[str] + user_id: Mapped[int] = mapped_column(ForeignKey("user_account.id")) + + user: Mapped["User"] = relationship(back_populates="addresses") +``` + +Notice you need to define both the `user_id` column and the `user` relationship +in the `Address` model, something that Django does automatically. Additionally, +you also need to define the "other side" of the relationship as +`User.addresses`. + +Once your models are in place you can query the `Address` model and join it with +the `User` model: + +```python +from sqlalchemy import select + +stmt = ( + select(Address) + .join(Address.user) + .where(User.name == "sandy") +) +sandy_addresses = session.scalars(stmt).all() +``` + +There is no double underscore syntax like in Django, and no "related managers" +that allow you to get related objects from a given model instance. Instead we +need to use a `join` to bring in the `User` model and then filter on the `name` +attribute. + +One clear advantage of SQLAlchemy is that you can instantiate models and relate +them before they are saved, and then commit them all at once: + +```python +spongebob = User( + name="spongebob", + fullname="SpongeBob SquarePants", + addresses=[Address(email_address="spongebob@sqlalchemy.org")], +) +sandy = User( + name="sandy", + fullname="Sandy Cheeks", + addresses=[ + Address(email_address="sandy@sqlalchemy.org"), + Address(email_address="sandy@squirrelpower.org"), + ], +) +patrick = User(name="patrick", fullname="Patrick Star") +session.add_all([spongebob, sandy, patrick]) +session.commit() +``` + +In Django you would need to save all the users first, then save the addresses +with the `user` attribute set to the corresponding user. Here we can nest them +naturally and SQLAlchemy will take care of the rest. + +## Migrations Are Not Built-In + +Django comes with a built-in [migration system] that allows you to create and +apply migrations with a single command. This is definitely one of the most +important features of Django and I was surprised to find out that SQLAlchemy +does not have a built-in alternative. Instead, they maintain a separate package +called [Alembic] to manage migrations (which have their name changed to +"revisions"). + +[migration system]: https://docs.djangoproject.com/en/4.2/topics/migrations/ +[Alembic]: https://alembic.sqlalchemy.org/en/latest/ + +We won't go into details here, but the basic substitutions are: + +- `./manage.py makemigrations` becomes `alembic revision --autogenerate` +- `./manage.py migrate` becomes `alembic upgrade head` +- `./manage.py migrate app <migration number>` becomes `alembic upgrade + <revision hash>` if going forward, or `alembic downgrade <revision hash>` if + going back + +SQLAlchemy and Alembic don't have the concept of "apps" as standalone elements +with their own models and migrations. Instead, they use a single +`alembic/versions` directory that contains all the revisions for all tables, and +autogenerating revisions will scan the entire database for changes. + +To date I don't know how to manage migrations in databases that have models +defined by third-party packages. This is in contrast with Django where +third-parties usually ship their own migration history to manage their tables +independently from user-defined models. + +## Conclusion + +SQLAlchemy is a powerful library. We have only scratched the surface of what it +can do. I think it's as powerful as Django's ORM, but it's definitely not as +streamlined and putting the pieces together requires time. There also seems to +be a lot of old, pre-2.0 information out there that can be confusing. All in +all, I think it's a library worth learning and keeping in your tool belt, +especially if you are using FastAPI. diff --git a/content/blog/elsewhere/interview/video/learn-with-jason-cqs.md b/content/blog/elsewhere/interview/video/learn-with-jason-cqs.md new file mode 100644 index 000000000..605521fb0 --- /dev/null +++ b/content/blog/elsewhere/interview/video/learn-with-jason-cqs.md @@ -0,0 +1,27 @@ +--- +title: Demystifying CSS Container Queries +venue: Learn With Jason +url: https://www.learnwithjason.dev/demystifying-css-container-queries +date: 2023-10-16 +author: miriam +image: + src: blog/2023/learn-with-jason.jpg +tags: + - CSS + - Container Queries +summary: | + CSS Container Queries + promise even more powerful styling approaches, + but… what the heck are they? + How do they actually work? + Miriam joined Jason + to teach and explore Container Queries + in live code. +media: + - iframe: https://www.youtube.com/embed/KVFU0pOIJLI + - iframe: https://www.youtube.com/embed/eTTdl5CZDlo +--- + +{% import "embed.macros.njk" as embed %} + +{{ embed.figure(data=media) }} diff --git a/content/blog/wingingit/winging-it-03.md b/content/blog/wingingit/winging-it-03.md new file mode 100644 index 000000000..60eef40af --- /dev/null +++ b/content/blog/wingingit/winging-it-03.md @@ -0,0 +1,48 @@ +--- +title: Intuitive Web Design with OOUX +episode: 3 +tags: + - OOUX + - Design +author: + - sondra + - james + - davidh +date: 2023-10-24 +length: 32 mins +image: + src: winging-it/winging-it-3.jpg +media: + - iframe: https://www.youtube.com/embed/wk5tFSqYVzs +summary: | + During our conversation we look at 3 examples of unintuitive web design, and + learn how to create websites and apps that are more intuitive using + object-oriented user experience (OOUX) design strategies. +--- + +{% import "embed.macros.njk" as embed %} +{% import "utility.macros.njk" as utility %} + +{{ embed.figure( + data=media +) }} + +{{ utility.main_action( + 'Subscribe to Channel »', + subscribe_url +) }} + +## What we cover: + +- What is OOUX +- Practical examples for discovering objects +- Types of objects including broken, shapeshifter, and isolated objects +- Object maps +- OOUX Certification + +## Links: + +- [Denver Zoo](https://denverzoo.org/) +- [OOUX Certification (affiliate link)](http://partners.ooux.com/348125/17189) +- [Slides](https://xd.adobe.com/view/59a38984-ff8c-4ae6-b09f-2cbf31f235fc-0cf0/) +- [OddBird on Mastodon](https://front-end.social/@OddBird) diff --git a/content/contact/index.njk b/content/contact/index.njk index 2a0e12f26..04434772a 100644 --- a/content/contact/index.njk +++ b/content/contact/index.njk @@ -2,8 +2,11 @@ title: Contact sub: Let's get to know each other banner: Contact OddBird +bird: oddbird social: - twitter: oddbird + mastodon: + user: oddbird + server: front-end.social github: oddbird email: birds summary: | diff --git a/content/index.njk b/content/index.njk index 931750230..38a6222dd 100644 --- a/content/index.njk +++ b/content/index.njk @@ -81,7 +81,7 @@ resilient design systems, and **well-tested code.** - Branding & Logo Design - User Research & Concepting - UI/UX Design (*OOUX*) -- Python & Django on the backend +- Python on the backend (*Django, FastAPI*) - CSS & Sass on the frontend - JavaScript (*Svelte, Vue, React, Node, etc.*) - Design Systems & Component Libraries diff --git a/content/quickstart.md b/content/quickstart.md index 3d0a37a67..8c6379cc6 100644 --- a/content/quickstart.md +++ b/content/quickstart.md @@ -345,3 +345,138 @@ and sends invoices to clients on the same schedule. [harvest]: https://www.getharvest.com/ [accounts]: mailto:accounts@oddbird.net + +## Success Criteria: + +This guide will help you understand +the expectations for your role at OddBird. +The criteria are divided into three groups: +Work Quality, Communication, and Learning & Growth. +Each group has three levels of performance: +Underperform, Meet Expectations, and Exceed Expectations. +You can use this guide to assess your own performance, +identify your strengths and areas for improvement, +and set your goals and action plans. + +### Work Quality + +#### Underperform + +- Lack initiative and wait for direction or assignments + on high priority work +- Produce low-quality or incomplete work + that requires excessive rework + or refactoring from others +- Use outdated or inappropriate tools, technologies, or methodologies +- Avoid or give up on challenges +- Do not create plans for big assignments, + or dissect them into smaller tasks + +#### Meet Expectations + +- Take initiative on high priority work + by chipping away at it +- Deliver complete and high-quality work, + and act on feedback from others +- Approach challenges + by creating plans for big assignments, + and dissecting them into smaller tasks + +#### Exceed Expectations + +- Take ownership of features and infrastructure +- Lead internal review processes + and deliver high-quality, actionable feedback to others +- Make requests for input early in process + to tackle challenging work +- Take initiative and lead others + in creating plans for big assignments, + and dissecting them into smaller tasks + +### Communication + +#### Underperform + +- Rarely communicate + or do so in an untimely manner +- Miss large parts of or entire meetings without notice +- Do not document the breakdown of upcoming work + or the status of in-progress work, + and do not reflect on your contributions, accomplishments, + or lessons from challenges (self-retro) +- Do not ask for help or guidance when blocked, + and avoid participating and learning + from review and discussions +- Show disinterest or indifference when planning new work + +#### Meet Expectations + +- Communicate frequently + and in a timely manner +- Attend most meetings + and notify others in advance + when you will be late or cannot attend +- Post a breakdown of your daily assignments + documenting completed work, + the status of in-progress work, + and upcoming tasks +- Document your contributions, + accomplishments, + and lessons from challenges (self-retro) +- Reach out with questions when blocked + and engage with review and planning + by asking follow-up questions + +#### Exceed Expectations + +- Communicate with trust in advance + and request engagement from others +- Lead meetings and discussions + about internal and external projects +- Follow up during and after reviews and discussions + with questions that help confirm understanding +- Generate internal documents, + blog posts, + and other valuable content + based on your contributions + (especially accomplishments and challenges) + +### Learning & Growth + +#### Underperform + +- Do not participate or learn from review and discussions, + and asks few or no questions +- Resist and reject change and feedback, + and do not adjust to the changing needs + and expectations of projects +- Lack initiative and collaboration skills, + and don't support the team's goals and objectives +- Refuse to follow established team processes + +#### Meet Expectations + +- Engage with review and discussions + by asking more questions +- Reach out with questions when blocked +- Act on feedback as an opportunity to learn and improve, + and remain flexible and adaptable to change +- Challenge the team processes + and look for ways to improve them + +#### Exceed Expectations + +- Demonstrate curiosity and pursue challenges + that help you and the team grow +- Learn new skills, technologies, or methodologies + that can improve your performance + and the quality of your work +- Help others adapt + to the changing needs and expectations of the project +- Demonstrate leadership, + initiative, + and collaboration skills, + and contribute to the team's goals and objectives +- Adjust the team processes, + listening to feedback + and guiding the team through the changes diff --git a/content/services/development.md b/content/services/development.md index 935b45a9d..15deede9f 100644 --- a/content/services/development.md +++ b/content/services/development.md @@ -17,7 +17,8 @@ summary: | efficiently. We provide expertise across a range of technologies, including - **Python/Django**, accessible **HTML**, **CSS/Sass**, + **Python** with **Django** & **FastAPI**, + accessible **HTML**, **CSS/Sass**, **JavaScript** with **React** & **Vue**, **Node**, and more. --- @@ -147,7 +148,7 @@ performance and architecture. ### Languages & Tools -- **Python** with **Django** (*core contributor*) +- **Python** with **FastAPI** or **Django** (*core contributor*) - **HTML/CSS** with **Sass** (*core contributor*) - **JavaScript** with **Vue**, **React**, or **Svelte** - Node diff --git a/content/talks.njk b/content/talks.njk index eaca93d0c..c0d8ab5c0 100644 --- a/content/talks.njk +++ b/content/talks.njk @@ -1,25 +1,22 @@ --- title: Talks & Workshops -sub: Bring us to your conference or browse past talks -image: - src: talks/miriam.jpg - alt: Miriam Suzanne speaking at a conference - position: left center +sub: Bring us to your event or browse past talks action: - text: Hire us for conference talks » + text: Hire us to give a talk or workshop » url: /contact/ summary: | - **We provide award-winning conference talks & workshops** + **We provide award-winning talks & workshops** + for companies or conferences, to help you create resilient web applications and design systems -- improving team process, communication, site performance, and accessibility. - Missed a conference? Dive into the posts below for the latest videos & slides, - and upcoming conference dates. + and upcoming conference or workshop dates. --- +{% import 'utility.macros.njk' as utility %} {% import 'quotes.macros.njk' as quotes %} {% import 'layout.macros.njk' as layout %} {% import 'talks.macros.njk' as talks %} @@ -30,6 +27,30 @@ summary: | slugs=['spot-on', 'popular-tutorial'] ) }} +{% set fw = collections._talk | findPage('data.feature', 'workshop') %} +{% if fw %} + {{ layout.title('Featured Workshop') }} + <article {{ post.aria_label(item) }} class="feature-workshop"> + {{ post.hero(fw.data.image, 'post') }} + <header class="training-header"> + {{ post.banner(fw) }} + {{ post.subtitle(fw.data.sub) }} + {{ post.byline(fw, collections) }} + </header> + + <div class="training-detail"> + {{ fw.data.summary | md | safe }} + + {% if fw.data.action %} + {{ utility.main_action( + fw.data.action.text, + url=fw.data.action.url + ) }} + {% endif %} + </div> + </article> +{% endif %} + {{ talks.section( title='Upcoming Events', events=collections.all | getPublic | getEvents | getFuture, @@ -37,7 +58,7 @@ summary: | by_bird=collections ) }} -{{ layout.title('Talks & Workshops') }} +{{ layout.title('All Talks & Workshops') }} {% call layout.grid('training') %} {% for item in collections._talk | getPublic | eventSort | reverse %} <article {{ post.aria_label(item) }} class="training-item"> diff --git a/content/workshops/advanced-css.md b/content/workshops/advanced-css.md index e2b87e766..787e1701e 100644 --- a/content/workshops/advanced-css.md +++ b/content/workshops/advanced-css.md @@ -1,7 +1,7 @@ --- title: Advanced CSS Workshop banner: Advanced CSS for Modern Applications -sub: with practical use-cases, tooling, and pitfalls +sub: A workshop with practical use-cases, tooling, and pitfalls author: miriam date: 2019-04-18 image: diff --git a/content/workshops/cascading-styles-deep.md b/content/workshops/cascading-styles-deep.md index 3271df358..46cd22707 100644 --- a/content/workshops/cascading-styles-deep.md +++ b/content/workshops/cascading-styles-deep.md @@ -1,10 +1,15 @@ --- -title: Cascading Styles -sub: A CSS Deep Dive +title: Cascading Style Systems +sub: A workshop on resilient & maintainable CSS +feature: workshop author: miriam date: 2023-01-09 +action: + text: Hire us to give a workshop » + url: /contact/ image: - src: talks/mia-back.jpg + src: talks/mia-smashing-de.jpg + position: top alt: | Mia from behind, standing at a laptop - @@ -17,71 +22,166 @@ tags: - Cascade Layers - Container Queries - CSS Scope - - Color + - CSS Nesting events: + - venue: Smashing Workshops + date: 2024-02-26 + adr: Online + url: https://smashingconf.com/online-workshops/workshops/modern-css-miriam-suzanne/ + note: > + Tickets [on sale now](https://smashingconf.com/online-workshops/workshops/modern-css-miriam-suzanne/)! - venue: Smashing Workshops date: 2023-09-06 adr: Freiburg, Germany url: https://smashingconf.com/freiburg-2023/workshops/miriam-suzanne/ summary: | - It’s a great time to revisit - everything you thought you knew about CSS. - Join Miriam for a deep dive - into what makes the language work, - and how we can harness its power - to develop resilient and delightful experiences - that hold up across browsers, languages, and device interfaces. + New CSS features are shipping at an unprecedented rate -- + cascade layers, container queries, the `:has()` selector, + subgrid, nesting, and so much more. + **It’s a good time to step back and understand + how these tools fit together in a declarative system -- + a resilient cascade of styles**. + + This workshop is available + to companies as well as conferences. --- -A lot has changed in the nearly 30 years since CSS was first proposed, -and new features are shipping at an unprecedented rate -- -cascade layers, container queries, -the ':has()' selector, wide-gamut colors, -subgrid, and so much more. - -Meanwhile, we're still getting used to -custom properties and basic grids! -Taken one at a time, the list can feel overwhelming, -but these features all fit together to form a highly systemic language -based on a radical foundation: _the cascade of styles_. -Together, we’ll explore: - -## Selectors & the Cascade - -We’ll look at selectors, -their specificity, -nesting, and of course custom properties. - -- cascade origins and importance -- cascade layers -- specificity and source-order -- :is(), :where(), and :has() -- nesting & scope -- preference & support queries -- custom properties -- naming & organizing conventions -- progressive enhancement - -## Layout & Typography - -From modern CSS layout to functions, -from aspect ratios to media & container queries. - -- display, flow, and context -- writing modes -- logical properties -- flexbox, grid, and subgrid -- comparison functions -- aspect-ratios -- scroll-snapping -- media & container queries - -## CSS Colors - -Lastly, new color spaces & formats, accent-color and much more! - -- accent-color -- color-scheme -- new color spaces & formats -- gradient color spaces -- color-mix() +It’s an exciting time, but the list can also feel overwhelming. +Do I really need grids if I already know flexbox? +What problem do layers actually solve? +Should I rewrite my styles with each feature release, +or stick with the tools that I know? + +If you ever feel lost in the CSS weeds, +wrestling with the cascade, +or you just want to improve your workflow +with modern, efficient, and maintainable stylesheets, +then this workshop is for you! +We'll approach the language as a cohesive system, +learn new features along the way, +and then put it all in practice +with a resilient approach to CSS architecture. + +Join Miriam for a deep dive +into what makes the language work, +and how we can harness its power +to **develop resilient and delightful experiences** +that hold up across browsers, languages, and device interfaces. + +## What Will Attendees Learn In This Workshop? + +- Building maintainable CSS systems with progressive enhancement +- The entire cascade, why it exists, + and what all is involved (much more than specificity!) +- Managing style conflicts with cascade layers, scope, and nesting +- Modern selectors like `:is()`, `:where()`, and `:has()` +- Value resolution and validation, beyond cascading and inheritance +- Using custom properties to build adaptive systems +- The advantages of logical vs physical dimensions +- The layout flow with intrinsic and extrinsic sizing +- Size comparison functions like min(), max(), and clamp() +- When to use flexbox vs grid for layout and alignment +- Fast and dynamic layouts using subgrid and container queries + +## Who Is This For? + +This workshop is intended for designers & developers +with at least a basic understanding in HTML and CSS. +You don’t need to be an expert to keep up, +but even the experts are likely to learn something new. + +## Schedule + +The workshop is taught in five sessions, each with two parts: + +### 1. Resilient Styles: a Declarative Cascade + +#### First, Do No Harm + +CSS is fundamentally different +from other languages or design tools, +built around a radical vision +for contextual style and user-control. +We’ll dig into the practical implications of that vision, +and how the ‘grain’ of the language +can guide us to more performant and resilient styles. + +#### Cascading & Inheritance + +A deep-dive into the algorithms +that take us from simple property/value declarations +to a fully-styled web application. +Along the way, we’ll explore new features like nesting, +cascade layers, scope, and the `:has()` selector. + +### 2. Dynamic Systems: Custom Properties & Value Resolution + +#### Custom Properties Reveal the Matrix + +CSS custom properties (aka “variables”) +expose the internals of CSS value resolution and error recovery. +What does it even mean for properties +to become ‘invalid at computed value time’? +And how can we use these CSS internals to our advantage, +developing more robust and dynamic style systems? + +#### CSS Variables in Practice + +Practical use-cases, +and interactive exercises related to CSS variables and functions. + +### 3. Intrinsic Layouts: Distributing Space + +#### Flowing & Flexing + +Unlike the printed page, +web content and context can be unpredictable. +CSS provides tools to manage that uncertainty, +aligning & distributing objects on the page. +We’ll talk about normal flow, +intrinsic and extrinsic sizing, +logical properties, +box sizing & alignment, +and the flexible box model. + +#### Flex & Alignment in Practice + +Practical use-cases, +and interactive exercises related to distributing space. + +### 4. Intrinsic Layouts: Defining Structure + +#### Defining Structure + +Sometimes we also need to impose external structure +to create consistent and reliable layouts, +even with unpredictable content. +This is a full session dedicated to grid & subgrid, +the multiple ‘stages of squishiness’, +and container queries. + +#### Grids & Containers in Practice + +Practical use-cases, +and interactive exercises related to defining layouts. + +### 5. Resilient Styles: Organizing Conventions + +#### Cascade Aligned Programming + +There are many conventions for organizing CSS, +but the best systems all share underlying principles +based on CSS itself. +What would it mean to use _the cascade_ itself +as our guide for writing maintainable CSS? + +#### Modern and Resilient + +CSS is designed to adapt to context -- +failing silently, and enhancing progressively. +We have tools to manage that context and support everyone, +without giving up on the latest features. +The details may vary from project to project, +but we’ll look at practical strategies +for building an expressive and robust CSS system +that works for you. diff --git a/content/workshops/django-end-to-end-testing.md b/content/workshops/django-end-to-end-testing.md index 17031eaad..b05d8c6aa 100644 --- a/content/workshops/django-end-to-end-testing.md +++ b/content/workshops/django-end-to-end-testing.md @@ -1,5 +1,6 @@ --- title: Effective End-to-End Testing for Django +sub: A hands-on workshop using pytest and Playwright date: 2022-10-16 author: ed image: diff --git a/content/workshops/resilient-systems.md b/content/workshops/resilient-systems.md index ee2f26fc7..5b6cc76af 100644 --- a/content/workshops/resilient-systems.md +++ b/content/workshops/resilient-systems.md @@ -1,6 +1,6 @@ --- title: Resilient Web Systems -sub: Inspiration & practical steps to take full advantage of the web +sub: A workshop with practical steps to take full advantage of the web author: miriam card: feature date: 2020-01-01 diff --git a/package.json b/package.json index fea726c24..b053d0953 100644 --- a/package.json +++ b/package.json @@ -58,30 +58,30 @@ "@11ty/eleventy-img": "^3.1.1", "@11ty/eleventy-plugin-rss": "^1.2.0", "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", - "@babel/core": "^7.23.0", - "@babel/preset-env": "^7.22.20", + "@babel/core": "^7.23.2", + "@babel/preset-env": "^7.23.2", "@netlify/plugin-a11y": "^1.0.0-beta.1", "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-commonjs": "^25.0.5", + "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", "@tommoor/remove-markdown": "^0.3.2", - "@typescript-eslint/parser": "^6.7.4", + "@typescript-eslint/parser": "^6.8.0", "autoprefixer": "^10.4.16", "babel-jest": "^29.7.0", "chalk": "^4.1.2", "chokidar-cli": "^3.0.0", - "core-js": "^3.33.0", + "core-js": "^3.33.1", "date-fns": "^2.30.0", "date-fns-tz": "^2.0.0", "dotenv": "^16.3.1", "doxray": "^0.10.1", - "eslint": "^8.51.0", + "eslint": "^8.52.0", "eslint-config-prettier": "^9.0.0", "eslint-import-resolver-node": "^0.3.9", "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jest": "^27.4.2", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-jest": "^27.4.3", "eslint-plugin-simple-import-sort": "^10.0.0", "fs-extra": "^11.1.1", "jest": "^29.7.0", @@ -99,14 +99,14 @@ "postcss": "^8.4.31", "prettier": "^3.0.3", "rimraf": "^3.0.2", - "rollup": "^4.0.2", + "rollup": "^4.1.4", "sanitize-html": "^2.11.0", - "sass": "^1.69.0", + "sass": "^1.69.4", "sassdoc": "^2.7.4", "sassdoc-theme-herman": "^5.0.1", "slugify": "^1.6.6", "striptags": "^3.2.0", - "stylelint": "^15.10.3", + "stylelint": "^15.11.0", "stylelint-config-standard-scss": "^11.0.0", "truncate-html": "^1.0.4", "typescript": "^5.2.2", diff --git a/src/images/blog/2023/fast.jpg b/src/images/blog/2023/fast.jpg new file mode 100644 index 000000000..662d60f64 Binary files /dev/null and b/src/images/blog/2023/fast.jpg differ diff --git a/src/images/blog/2023/learn-with-jason.jpg b/src/images/blog/2023/learn-with-jason.jpg new file mode 100644 index 000000000..5709cf18a Binary files /dev/null and b/src/images/blog/2023/learn-with-jason.jpg differ diff --git a/src/images/blog/2023/library.jpg b/src/images/blog/2023/library.jpg new file mode 100644 index 000000000..d5371fae3 Binary files /dev/null and b/src/images/blog/2023/library.jpg differ diff --git a/src/images/talks/mia-smashing-de.jpg b/src/images/talks/mia-smashing-de.jpg new file mode 100644 index 000000000..fe3ced2bc Binary files /dev/null and b/src/images/talks/mia-smashing-de.jpg differ diff --git a/src/images/winging-it/winging-it-3.jpg b/src/images/winging-it/winging-it-3.jpg new file mode 100644 index 000000000..2c98ddfb9 Binary files /dev/null and b/src/images/winging-it/winging-it-3.jpg differ diff --git a/src/scss/components/_events.scss b/src/scss/components/_events.scss index 5be3a1ed9..18343e19e 100644 --- a/src/scss/components/_events.scss +++ b/src/scss/components/_events.scss @@ -55,14 +55,12 @@ } } -.event-discount, +.event-note, .event-links { font-size: var(--small); } -.event-discount { - @include config.wrap-content('[' ']'); - +.event-note { font-style: italic; } diff --git a/src/scss/layout/_title.scss b/src/scss/layout/_title.scss index c0f057b52..a529a745a 100644 --- a/src/scss/layout/_title.scss +++ b/src/scss/layout/_title.scss @@ -40,7 +40,8 @@ line-height: 1.1; span { - &:first-of-type { + // spans not generated by the typogrify plugin + &:not([class]) { display: block; font-size: var(--h3); font-weight: normal; diff --git a/yarn.lock b/yarn.lock index 6dd21b738..f3d14980d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -183,33 +183,33 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.20, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9": - version: 7.22.20 - resolution: "@babel/compat-data@npm:7.22.20" - checksum: efedd1d18878c10fde95e4d82b1236a9aba41395ef798cbb651f58dbf5632dbff475736c507b8d13d4c8f44809d41c0eb2ef0d694283af9ba5dd8339b6dab451 +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/compat-data@npm:7.23.2" + checksum: d8dc27437d40907b271161d4c88ffe72ccecb034c730deb1960a417b59a14d7c5ebca8cd80dd458a01cd396a7a329eb48cddcc3791b5a84da33d7f278f7bec6a languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/core@npm:7.23.0" +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/core@npm:7.23.2" dependencies: "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.22.13 "@babel/generator": ^7.23.0 "@babel/helper-compilation-targets": ^7.22.15 "@babel/helper-module-transforms": ^7.23.0 - "@babel/helpers": ^7.23.0 + "@babel/helpers": ^7.23.2 "@babel/parser": ^7.23.0 "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.0 + "@babel/traverse": ^7.23.2 "@babel/types": ^7.23.0 convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: cebd9b48dbc970a7548522f207f245c69567e5ea17ebb1a4e4de563823cf20a01177fe8d2fe19b6e1461361f92fa169fd0b29f8ee9d44eeec84842be1feee5f2 + checksum: 003897718ded16f3b75632d63cd49486bf67ff206cc7ebd1a10d49e2456f8d45740910d5ec7e42e3faf0deec7a2e96b1a02e766d19a67a8309053f0d4e57c0fe languageName: node linkType: hard @@ -288,9 +288,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.4.2": - version: 0.4.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.4.2" +"@babel/helper-define-polyfill-provider@npm:^0.4.3": + version: 0.4.3 + resolution: "@babel/helper-define-polyfill-provider@npm:0.4.3" dependencies: "@babel/helper-compilation-targets": ^7.22.6 "@babel/helper-plugin-utils": ^7.22.5 @@ -299,7 +299,7 @@ __metadata: resolve: ^1.14.2 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 1f6dec0c5d0876d278fe15b71238eccc5f74c4e2efa2c78aaafa8bc2cc96336b8e68d94cd1a78497356c96e8b91b8c1f4452179820624d1702aee2f9832e6569 + checksum: 5d21e3f47b320e4b5b644195ec405e7ebc3739e48e65899efc808c5fa9c3bf5b06ce0d8ff5246ca99d1411e368f4557bc66730196c5781a5c4e986ee703bee79 languageName: node linkType: hard @@ -378,7 +378,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.22.5, @babel/helper-remap-async-to-generator@npm:^7.22.9": +"@babel/helper-remap-async-to-generator@npm:^7.22.20, @babel/helper-remap-async-to-generator@npm:^7.22.5": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" dependencies: @@ -463,14 +463,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.0": - version: 7.23.1 - resolution: "@babel/helpers@npm:7.23.1" +"@babel/helpers@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/helpers@npm:7.23.2" dependencies: "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.0 + "@babel/traverse": ^7.23.2 "@babel/types": ^7.23.0 - checksum: acfc345102045c24ea2a4d60e00dcf8220e215af3add4520e2167700661338e6a80bd56baf44bb764af05ec6621101c9afc315dc107e18c61fa6da8acbdbb893 + checksum: aaf4828df75ec460eaa70e5c9f66e6dadc28dae3728ddb7f6c13187dbf38030e142194b83d81aa8a31bbc35a5529a5d7d3f3cf59d5d0b595f5dd7f9d8f1ced8e languageName: node linkType: hard @@ -770,17 +770,17 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.22.15" +"@babel/plugin-transform-async-generator-functions@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.2" dependencies: - "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-remap-async-to-generator": ^7.22.9 + "@babel/helper-remap-async-to-generator": ^7.22.20 "@babel/plugin-syntax-async-generators": ^7.8.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: fad98786b446ce63bde0d14a221e2617eef5a7bbca62b49d96f16ab5e1694521234cfba6145b830fbf9af16d60a8a3dbf148e8694830bd91796fe333b0599e73 + checksum: e1abae0edcda7304d7c17702ac25a127578791b89c4f767d60589249fa3e50ec33f8c9ff39d3d8d41f00b29947654eaddd4fd586e04c4d598122db745fab2868 languageName: node linkType: hard @@ -808,7 +808,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.22.15": +"@babel/plugin-transform-block-scoping@npm:^7.23.0": version: 7.23.0 resolution: "@babel/plugin-transform-block-scoping@npm:7.23.0" dependencies: @@ -875,7 +875,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.22.15": +"@babel/plugin-transform-destructuring@npm:^7.23.0": version: 7.23.0 resolution: "@babel/plugin-transform-destructuring@npm:7.23.0" dependencies: @@ -1015,7 +1015,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.22.5": +"@babel/plugin-transform-modules-amd@npm:^7.23.0": version: 7.23.0 resolution: "@babel/plugin-transform-modules-amd@npm:7.23.0" dependencies: @@ -1027,7 +1027,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.22.15": +"@babel/plugin-transform-modules-commonjs@npm:^7.23.0": version: 7.23.0 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.0" dependencies: @@ -1040,7 +1040,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.22.11": +"@babel/plugin-transform-modules-systemjs@npm:^7.23.0": version: 7.23.0 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.0" dependencies: @@ -1152,7 +1152,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.22.15": +"@babel/plugin-transform-optional-chaining@npm:^7.22.15, @babel/plugin-transform-optional-chaining@npm:^7.23.0": version: 7.23.0 resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.0" dependencies: @@ -1339,11 +1339,11 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/preset-env@npm:7.22.20" +"@babel/preset-env@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/preset-env@npm:7.23.2" dependencies: - "@babel/compat-data": ^7.22.20 + "@babel/compat-data": ^7.23.2 "@babel/helper-compilation-targets": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-validator-option": ^7.22.15 @@ -1369,15 +1369,15 @@ __metadata: "@babel/plugin-syntax-top-level-await": ^7.14.5 "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 "@babel/plugin-transform-arrow-functions": ^7.22.5 - "@babel/plugin-transform-async-generator-functions": ^7.22.15 + "@babel/plugin-transform-async-generator-functions": ^7.23.2 "@babel/plugin-transform-async-to-generator": ^7.22.5 "@babel/plugin-transform-block-scoped-functions": ^7.22.5 - "@babel/plugin-transform-block-scoping": ^7.22.15 + "@babel/plugin-transform-block-scoping": ^7.23.0 "@babel/plugin-transform-class-properties": ^7.22.5 "@babel/plugin-transform-class-static-block": ^7.22.11 "@babel/plugin-transform-classes": ^7.22.15 "@babel/plugin-transform-computed-properties": ^7.22.5 - "@babel/plugin-transform-destructuring": ^7.22.15 + "@babel/plugin-transform-destructuring": ^7.23.0 "@babel/plugin-transform-dotall-regex": ^7.22.5 "@babel/plugin-transform-duplicate-keys": ^7.22.5 "@babel/plugin-transform-dynamic-import": ^7.22.11 @@ -1389,9 +1389,9 @@ __metadata: "@babel/plugin-transform-literals": ^7.22.5 "@babel/plugin-transform-logical-assignment-operators": ^7.22.11 "@babel/plugin-transform-member-expression-literals": ^7.22.5 - "@babel/plugin-transform-modules-amd": ^7.22.5 - "@babel/plugin-transform-modules-commonjs": ^7.22.15 - "@babel/plugin-transform-modules-systemjs": ^7.22.11 + "@babel/plugin-transform-modules-amd": ^7.23.0 + "@babel/plugin-transform-modules-commonjs": ^7.23.0 + "@babel/plugin-transform-modules-systemjs": ^7.23.0 "@babel/plugin-transform-modules-umd": ^7.22.5 "@babel/plugin-transform-named-capturing-groups-regex": ^7.22.5 "@babel/plugin-transform-new-target": ^7.22.5 @@ -1400,7 +1400,7 @@ __metadata: "@babel/plugin-transform-object-rest-spread": ^7.22.15 "@babel/plugin-transform-object-super": ^7.22.5 "@babel/plugin-transform-optional-catch-binding": ^7.22.11 - "@babel/plugin-transform-optional-chaining": ^7.22.15 + "@babel/plugin-transform-optional-chaining": ^7.23.0 "@babel/plugin-transform-parameters": ^7.22.15 "@babel/plugin-transform-private-methods": ^7.22.5 "@babel/plugin-transform-private-property-in-object": ^7.22.11 @@ -1417,15 +1417,15 @@ __metadata: "@babel/plugin-transform-unicode-regex": ^7.22.5 "@babel/plugin-transform-unicode-sets-regex": ^7.22.5 "@babel/preset-modules": 0.1.6-no-external-plugins - "@babel/types": ^7.22.19 - babel-plugin-polyfill-corejs2: ^0.4.5 - babel-plugin-polyfill-corejs3: ^0.8.3 - babel-plugin-polyfill-regenerator: ^0.5.2 + "@babel/types": ^7.23.0 + babel-plugin-polyfill-corejs2: ^0.4.6 + babel-plugin-polyfill-corejs3: ^0.8.5 + babel-plugin-polyfill-regenerator: ^0.5.3 core-js-compat: ^3.31.0 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 99357a5cb30f53bacdc0d1cd6dff0f052ea6c2d1ba874d969bba69897ef716e87283e84a59dc52fb49aa31fd1b6f55ed756c64c04f5678380700239f6030b881 + checksum: 49327ef584b529b56aedd6577937b80c0d89603c68b23795495a13af04b5aa008db9ad04cd280423600cdc0d3cce13ae9d0d9a977db5c8193697b20ced8a10b2 languageName: node linkType: hard @@ -1450,11 +1450,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.8.4": - version: 7.23.1 - resolution: "@babel/runtime@npm:7.23.1" + version: 7.23.2 + resolution: "@babel/runtime@npm:7.23.2" dependencies: regenerator-runtime: ^0.14.0 - checksum: 0cd0d43e6e7dc7f9152fda8c8312b08321cda2f56ef53d6c22ebdd773abdc6f5d0a69008de90aa41908d00e2c1facb24715ff121274e689305c858355ff02c70 + checksum: 6c4df4839ec75ca10175f636d6362f91df8a3137f86b38f6cd3a4c90668a0fe8e9281d320958f4fbd43b394988958585a17c3aab2a4ea6bf7316b22916a371fb languageName: node linkType: hard @@ -1469,9 +1469,9 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/traverse@npm:7.23.0" +"@babel/traverse@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/traverse@npm:7.23.2" dependencies: "@babel/code-frame": ^7.22.13 "@babel/generator": ^7.23.0 @@ -1483,7 +1483,7 @@ __metadata: "@babel/types": ^7.23.0 debug: ^4.1.0 globals: ^11.1.0 - checksum: 0b17fae53269e1af2cd3edba00892bc2975ad5df9eea7b84815dab07dfec2928c451066d51bc65b4be61d8499e77db7e547ce69ef2a7b0eca3f96269cb43a0b0 + checksum: 26a1eea0dde41ab99dde8b9773a013a0dc50324e5110a049f5d634e721ff08afffd54940b3974a20308d7952085ac769689369e9127dea655f868c0f6e1ab35d languageName: node linkType: hard @@ -1575,21 +1575,21 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.51.0": - version: 8.51.0 - resolution: "@eslint/js@npm:8.51.0" - checksum: 0228bf1e1e0414843e56d9ff362a2a72d579c078f93174666f29315690e9e30a8633ad72c923297f7fd7182381b5a476805ff04dac8debe638953eb1ded3ac73 +"@eslint/js@npm:8.52.0": + version: 8.52.0 + resolution: "@eslint/js@npm:8.52.0" + checksum: 490893b8091a66415f4ac98b963d23eb287264ea3bd6af7ec788f0570705cf64fd6ab84b717785980f55e39d08ff5c7fde6d8e4391ccb507169370ce3a6d091a languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.11": - version: 0.11.11 - resolution: "@humanwhocodes/config-array@npm:0.11.11" +"@humanwhocodes/config-array@npm:^0.11.13": + version: 0.11.13 + resolution: "@humanwhocodes/config-array@npm:0.11.13" dependencies: - "@humanwhocodes/object-schema": ^1.2.1 + "@humanwhocodes/object-schema": ^2.0.1 debug: ^4.1.1 minimatch: ^3.0.5 - checksum: db84507375ab77b8ffdd24f498a5b49ad6b64391d30dd2ac56885501d03964d29637e05b1ed5aefa09d57ac667e28028bc22d2da872bfcd619652fbdb5f4ca19 + checksum: f8ea57b0d7ed7f2d64cd3944654976829d9da91c04d9c860e18804729a33f7681f78166ef4c761850b8c324d362f7d53f14c5c44907a6b38b32c703ff85e4805 languageName: node linkType: hard @@ -1600,10 +1600,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 +"@humanwhocodes/object-schema@npm:^2.0.1": + version: 2.0.1 + resolution: "@humanwhocodes/object-schema@npm:2.0.1" + checksum: 24929487b1ed48795d2f08346a0116cc5ee4634848bce64161fb947109352c562310fd159fc64dda0e8b853307f5794605191a9547f7341158559ca3c8262a45 languageName: node linkType: hard @@ -1913,7 +1913,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13, @jridgewell/sourcemap-codec@npm:^1.4.14": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 @@ -1921,12 +1921,12 @@ __metadata: linkType: hard "@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.19 - resolution: "@jridgewell/trace-mapping@npm:0.3.19" + version: 0.3.20 + resolution: "@jridgewell/trace-mapping@npm:0.3.20" dependencies: "@jridgewell/resolve-uri": ^3.1.0 "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: 956a6f0f6fec060fb48c6bf1f5ec2064e13cd38c8be3873877d4b92b4a27ba58289a34071752671262a3e3c202abcc3fa2aac64d8447b4b0fa1ba3c9047f1c20 + checksum: cd1a7353135f385909468ff0cf20bdd37e59f2ee49a13a966dedf921943e222082c583ade2b579ff6cd0d8faafcb5461f253e1bf2a9f48fec439211fdbe788f5 languageName: node linkType: hard @@ -2006,22 +2006,22 @@ __metadata: languageName: node linkType: hard -"@rollup/plugin-commonjs@npm:^25.0.5": - version: 25.0.5 - resolution: "@rollup/plugin-commonjs@npm:25.0.5" +"@rollup/plugin-commonjs@npm:^25.0.7": + version: 25.0.7 + resolution: "@rollup/plugin-commonjs@npm:25.0.7" dependencies: "@rollup/pluginutils": ^5.0.1 commondir: ^1.0.1 estree-walker: ^2.0.2 glob: ^8.0.3 is-reference: 1.2.1 - magic-string: ^0.27.0 + magic-string: ^0.30.3 peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 37cb6ce5188448250c2a97775c5879814119ff9fb3576d35089b7c00fed1a2b46b78d74a1377027cca26d0d984cfe99f450bfc0da561d596447ab6064adb4f08 + checksum: 052e11839a9edc556eda5dcc759ab816dcc57e9f0f905a1e6e14fff954eaa6b1e2d0d544f5bd18d863993c5eba43d8ac9c19d9bb53b1c3b1213f32cfc9d50b2e languageName: node linkType: hard @@ -2076,86 +2076,86 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.0.2" +"@rollup/rollup-android-arm-eabi@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.1.4" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-android-arm64@npm:4.0.2" +"@rollup/rollup-android-arm64@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-android-arm64@npm:4.1.4" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-darwin-arm64@npm:4.0.2" +"@rollup/rollup-darwin-arm64@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-darwin-arm64@npm:4.1.4" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-darwin-x64@npm:4.0.2" +"@rollup/rollup-darwin-x64@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-darwin-x64@npm:4.1.4" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.0.2" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.1.4" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.0.2" +"@rollup/rollup-linux-arm64-gnu@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.1.4" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.0.2" +"@rollup/rollup-linux-arm64-musl@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.1.4" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.0.2" +"@rollup/rollup-linux-x64-gnu@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.1.4" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.0.2" +"@rollup/rollup-linux-x64-musl@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.1.4" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.0.2" +"@rollup/rollup-win32-arm64-msvc@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.1.4" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.0.2" +"@rollup/rollup-win32-ia32-msvc@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.1.4" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.0.2": - version: 4.0.2 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.0.2" +"@rollup/rollup-win32-x64-msvc@npm:4.1.4": + version: 4.1.4 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.1.4" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2236,93 +2236,93 @@ __metadata: linkType: hard "@types/babel__core@npm:^7.1.14": - version: 7.20.2 - resolution: "@types/babel__core@npm:7.20.2" + version: 7.20.3 + resolution: "@types/babel__core@npm:7.20.3" dependencies: "@babel/parser": ^7.20.7 "@babel/types": ^7.20.7 "@types/babel__generator": "*" "@types/babel__template": "*" "@types/babel__traverse": "*" - checksum: 564fbaa8ff1305d50807ada0ec227c3e7528bebb2f8fe6b2ed88db0735a31511a74ad18729679c43eeed8025ed29d408f53059289719e95ab1352ed559a100bd + checksum: 8d14acc14d99b4b8bf36c00da368f6d597bd9ae3344aa7048f83f0f701b0463fa7c7bf2e50c3e4382fdbcfd1e4187b3452a0f0888b0f3ae8fad975591f7bdb94 languageName: node linkType: hard "@types/babel__generator@npm:*": - version: 7.6.5 - resolution: "@types/babel__generator@npm:7.6.5" + version: 7.6.6 + resolution: "@types/babel__generator@npm:7.6.6" dependencies: "@babel/types": ^7.0.0 - checksum: c7459f5025c4c800eaf58f4db3b24e9d736331fe7df40961d9bc49f31b46e2a3be83dc9276e8688f10a5ed752ae153ad5f1bdd45e2245bac95273730b9115ec2 + checksum: 36e8838c7e16eff611447579e840526946a8b14c794c82486cee2a5ad2257aa6cad746d8ecff3144e3721178837d2c25d0a435d384391eb67846b933c062b075 languageName: node linkType: hard "@types/babel__template@npm:*": - version: 7.4.2 - resolution: "@types/babel__template@npm:7.4.2" + version: 7.4.3 + resolution: "@types/babel__template@npm:7.4.3" dependencies: "@babel/parser": ^7.1.0 "@babel/types": ^7.0.0 - checksum: 0fe977b45a3269336c77f3ae4641a6c48abf0fa35ab1a23fb571690786af02d6cec08255a43499b0b25c5633800f7ae882ace450cce905e3060fa9e6995047ae + checksum: 55deb814c94d1bfb78c4d1de1de1b73eb17c79374602f3bd8aa14e356a77fca64d01646cebe25ec9b307f53a047acc6d53ad6e931019d0726422f5f911e945aa languageName: node linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.2 - resolution: "@types/babel__traverse@npm:7.20.2" + version: 7.20.3 + resolution: "@types/babel__traverse@npm:7.20.3" dependencies: "@babel/types": ^7.20.7 - checksum: 981340286479524436348d32373eaa3bf993c635cbf70307b4b69463eee83406a959ac4844f683911e0db8ab8d9f0025ab630dc7a8c170fee9ee74144c2a528f + checksum: 6d0f70d8972647c9b78b51a54f0b6481c4f23f0bb2699ad276e6070678bd121fede99e8e2c8c3e409d2f31a0bf83ae511abc6fefb91f0630c8d728a3a9136790 languageName: node linkType: hard "@types/cheerio@npm:^0.22.8": - version: 0.22.32 - resolution: "@types/cheerio@npm:0.22.32" + version: 0.22.33 + resolution: "@types/cheerio@npm:0.22.33" dependencies: "@types/node": "*" - checksum: 5a4885e03889c19638f0086d53e653d36a9eb097d0a08ec69dddf65ef685cd7118989c4fb28d5b28746502efc54bc57a3f751ee2a9aab3cfd32991bf5b51df10 + checksum: da4745b4d431b79c0ea046ae831a65f948d889bac5c7fe8b50b38055401e7c736e97c0f499e6506941b3ed4d80e4c5b8736b34fc7ecdcae48be7353eb24230be languageName: node linkType: hard "@types/estree@npm:*, @types/estree@npm:^1.0.0": - version: 1.0.2 - resolution: "@types/estree@npm:1.0.2" - checksum: aeedb1b2fe20cbe06f44b99b562bf9703e360bfcdf5bb3d61d248182ee1dd63500f2474e12f098ffe1f5ac3202b43b3e18ec99902d9328d5374f5512fa077e45 + version: 1.0.3 + resolution: "@types/estree@npm:1.0.3" + checksum: f21a5448995f8aa61ab2248d10590d275666b11d26c27fe75b3c23420b07b469d5ce820deefcf7399671faa09d56eb7ce012322948e484d94686fda154be5221 languageName: node linkType: hard "@types/graceful-fs@npm:^4.1.3": - version: 4.1.7 - resolution: "@types/graceful-fs@npm:4.1.7" + version: 4.1.8 + resolution: "@types/graceful-fs@npm:4.1.8" dependencies: "@types/node": "*" - checksum: 8b97e208f85c9efd02a6003a582c77646dd87be0af13aec9419a720771560a8a87a979eaca73ae193d7c73127f34d0a958403a9b5d6246e450289fd8c79adf09 + checksum: 6e1ee9c119e075134696171b680fee7b627f3e077ec5e5ad9ba9359f1688a84fa35ea6804f96922c43ca30ab8d4ca9531a526b64f57fa13e1d721bf741884829 languageName: node linkType: hard "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.4 - resolution: "@types/istanbul-lib-coverage@npm:2.0.4" - checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 + version: 2.0.5 + resolution: "@types/istanbul-lib-coverage@npm:2.0.5" + checksum: 978eaf327f9a238eb1e2828b93b4b48e288ffb88c4be81330c74477ab8b93fac41a8784260d72bdd9995535d70608f738199b6364fd3344842e924a3ec3301e7 languageName: node linkType: hard "@types/istanbul-lib-report@npm:*": - version: 3.0.1 - resolution: "@types/istanbul-lib-report@npm:3.0.1" + version: 3.0.2 + resolution: "@types/istanbul-lib-report@npm:3.0.2" dependencies: "@types/istanbul-lib-coverage": "*" - checksum: cfc66de48577bb7b2636a6afded7056483693c3ea70916276518cdfaa0d4b51bf564ded88fb13e75716665c3af3d4d54e9c2de042c0219dcabad7e81c398688b + checksum: 549e44e14a4dc98164ce477ca8650d33898e5c74a6bb8079cbec7f811567dcb805a3bfdbf83ce53222eaecc37ae53aa7f25bda1a7d8347449155c8f0b4f30232 languageName: node linkType: hard "@types/istanbul-reports@npm:^3.0.0": - version: 3.0.2 - resolution: "@types/istanbul-reports@npm:3.0.2" + version: 3.0.3 + resolution: "@types/istanbul-reports@npm:3.0.3" dependencies: "@types/istanbul-lib-report": "*" - checksum: f52028d6fe4d28f0085dd7ed66ccfa6af632579e9a4091b90928ffef93d4dbec0bacd49e9caf1b939d05df9eafc5ac1f5939413cdf8ac59fbe4b29602d4d0939 + checksum: 21d007be7dd09165ed24f5cc9947319ad435fc3b3e568f3eec0a42ee80fd2adccdeb929bc1311efb2cf7597835638cde865d3630d8b4c15d1390c9527bcad1a9 languageName: node linkType: hard @@ -2338,9 +2338,9 @@ __metadata: linkType: hard "@types/json-schema@npm:^7.0.9": - version: 7.0.13 - resolution: "@types/json-schema@npm:7.0.13" - checksum: 345df21a678fa72fb389f35f33de77833d09d4a142bb2bcb27c18690efa4cf70fc2876e43843cefb3fbdb9fcb12cd3e970a90936df30f53bbee899865ff605ab + version: 7.0.14 + resolution: "@types/json-schema@npm:7.0.14" + checksum: 4b3dd99616c7c808201c56f6c7f6552eb67b5c0c753ab3fa03a6cb549aae950da537e9558e53fa65fba23d1be624a1e4e8d20c15027efbe41e03ca56f2b04fb0 languageName: node linkType: hard @@ -2368,23 +2368,25 @@ __metadata: linkType: hard "@types/minimist@npm:^1.2.2": - version: 1.2.3 - resolution: "@types/minimist@npm:1.2.3" - checksum: 666ea4f8c39dcbdfbc3171fe6b3902157c845cc9cb8cee33c10deb706cda5e0cc80f98ace2d6d29f6774b0dc21180c96cd73c592a1cbefe04777247c7ba0e84b + version: 1.2.4 + resolution: "@types/minimist@npm:1.2.4" + checksum: d7912f9a466312cbc1333800272b9208178140ef4da2ccec3fa82231c8e67f57f84275b3c19109c4f68f1b7b057baeacc6b80af1de14b58b46e6b54233e44c6a languageName: node linkType: hard "@types/node@npm:*": - version: 20.8.3 - resolution: "@types/node@npm:20.8.3" - checksum: bfb88b341faeb19f8fd37306a3bf433721b876c6491d10fcb0b13fd26601fa36ee45113dd82b1e1c23e3c957dff5b99f81a16493cefa03abe797e41a2487a4f7 + version: 20.8.7 + resolution: "@types/node@npm:20.8.7" + dependencies: + undici-types: ~5.25.1 + checksum: 2173c0c03daefcb60c03a61b1371b28c8fe412e7a40dc6646458b809d14a85fbc7aeb369d957d57f0aaaafd99964e77436f29b3b579232d8f2b20c58abbd1d25 languageName: node linkType: hard "@types/normalize-package-data@npm:^2.4.0": - version: 2.4.2 - resolution: "@types/normalize-package-data@npm:2.4.2" - checksum: 2132e4054711e6118de967ae3a34f8c564e58d71fbcab678ec2c34c14659f638a86c35a0fd45237ea35a4a03079cf0a485e3f97736ffba5ed647bfb5da086b03 + version: 2.4.3 + resolution: "@types/normalize-package-data@npm:2.4.3" + checksum: 6f60e157c0fc39b80d80eb9043cdd78e4090f25c5264ef0317f5701648a5712fd453d364569675a19aef44a18c6f14f6e4809bdc0b97a46a0ed9ce4a320bbe42 languageName: node linkType: hard @@ -2396,75 +2398,75 @@ __metadata: linkType: hard "@types/responselike@npm:^1.0.0": - version: 1.0.1 - resolution: "@types/responselike@npm:1.0.1" + version: 1.0.2 + resolution: "@types/responselike@npm:1.0.2" dependencies: "@types/node": "*" - checksum: ae8c36c9354aaedfa462dab655aa17613529d545a418acc54ba0214145fc1d0454be2ae107031a1b2c24768f19f2af7e4096a85d1e604010becd0bec2355cb0e + checksum: ff1767e947eb7d49849e4566040453efcd894888e85b398f7f8cb731552f303f26aceda573b680a142b77ec5fb6c79535d9c6d047d9f936c386dbf3863d2ae17 languageName: node linkType: hard "@types/semver@npm:^7.3.12": - version: 7.5.3 - resolution: "@types/semver@npm:7.5.3" - checksum: 349fdd1ab6c213bac5c991bac766bd07b8b12e63762462bb058740dcd2eb09c8193d068bb226f134661275f2022976214c0e727a4e5eb83ec1b131127c980d3e + version: 7.5.4 + resolution: "@types/semver@npm:7.5.4" + checksum: 120c0189f6fec5f2d12d0d71ac8a4cfa952dc17fa3d842e8afddb82bba8828a4052f8799c1653e2b47ae1977435f38e8985658fde971905ce5afb8e23ee97ecf languageName: node linkType: hard "@types/stack-utils@npm:^2.0.0": - version: 2.0.1 - resolution: "@types/stack-utils@npm:2.0.1" - checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019 + version: 2.0.2 + resolution: "@types/stack-utils@npm:2.0.2" + checksum: 777cc7ac0c1000c5a07561013bcf7bd8477a3d55f55f376ee2f0c586331f7b999f57788140cfbdb65f6d7d97c0c41fe8fe6c778fd3ed71859c9b681ea76fc621 languageName: node linkType: hard "@types/tough-cookie@npm:*": - version: 4.0.3 - resolution: "@types/tough-cookie@npm:4.0.3" - checksum: f201be1bbca2f2d3572032513cdb9825845114d2604a7f4091af848eeee3228a573cdc5e8082b04468a2848bb1d058f1adbb97db822e22c975ebd6fcd851a453 + version: 4.0.4 + resolution: "@types/tough-cookie@npm:4.0.4" + checksum: 6be275b09f5fbf33f359fd6d5372c69357cf96dea5d7ba7a6563c76c6cce8b0c7f81caa4805810b0e67427cad381aeef00d8c060d614fee79ca245c2b9887c3a languageName: node linkType: hard "@types/yargs-parser@npm:*": - version: 21.0.1 - resolution: "@types/yargs-parser@npm:21.0.1" - checksum: 64e6316c2045e2d460c4fb79572f872f9d2f98fddc6d9d3949c71f0b6ad0ef8a2706cf49db26dfb02a9cb81433abb8f340f015e1d20a9692279abe9477b72c8e + version: 21.0.2 + resolution: "@types/yargs-parser@npm:21.0.2" + checksum: e979051aac91d778fdb3953aced8cf039d954c3936b910b57735b7b52a413d065e6b2aea1cb2c583f6c23296a6f8543d2541879d798f0afedd7409a562b7bdeb languageName: node linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.28 - resolution: "@types/yargs@npm:17.0.28" + version: 17.0.29 + resolution: "@types/yargs@npm:17.0.29" dependencies: "@types/yargs-parser": "*" - checksum: f78c5e5c29903933c0557b4ffcd1d0b8564d66859c8ca4aa51da3714e49109ed7c2644334a1918d033df19028f4cecc91fd2e502651bb8e8451f246c371da847 + checksum: 8bbc0edd573a5a084cb13a9985c124490fd74e73b1ed8a3058861c13124e103b00a19770dc55c53215653a7845d7033e0695917b75153cfe9618d5b2fd3cf86e languageName: node linkType: hard "@types/yauzl@npm:^2.9.1": - version: 2.10.1 - resolution: "@types/yauzl@npm:2.10.1" + version: 2.10.2 + resolution: "@types/yauzl@npm:2.10.2" dependencies: "@types/node": "*" - checksum: 3377916a2d493cb2422b167fb7dfff8cb3ea045a9489dab4955858719bf7fe6808e5f6a51ee819904fb7f623f7ac092b87f9d6a857ea1214a45070d19c8b3d7e + checksum: 4ee53b704074064179ed50881b2dfa6f07f8a7032af487f513aa04f0ed333be4ff4231ac8531e6a2024cc45ac69a22e78a2ff4e39a6ed2fe8cc0bfabc353da45 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.7.4": - version: 6.7.4 - resolution: "@typescript-eslint/parser@npm:6.7.4" +"@typescript-eslint/parser@npm:^6.8.0": + version: 6.8.0 + resolution: "@typescript-eslint/parser@npm:6.8.0" dependencies: - "@typescript-eslint/scope-manager": 6.7.4 - "@typescript-eslint/types": 6.7.4 - "@typescript-eslint/typescript-estree": 6.7.4 - "@typescript-eslint/visitor-keys": 6.7.4 + "@typescript-eslint/scope-manager": 6.8.0 + "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/typescript-estree": 6.8.0 + "@typescript-eslint/visitor-keys": 6.8.0 debug: ^4.3.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 60e7c01a69c1a67577f031cd6ef3c7980a9aedf2045b9950e339836acb2fe9d7bf0c8909fa95d713a8270f19dead43d82beb27dcf8705f81fe35b14b737e8fe0 + checksum: 10d7a3ae383fee5a5cba9541c72e23d6ab01cca6b414a62b44dacb5ebc15c80b80aa6c105b6469d3795f2f8514ae2499c069cd2d9dcac61f3db9ef6c7a75e080 languageName: node linkType: hard @@ -2478,13 +2480,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.7.4": - version: 6.7.4 - resolution: "@typescript-eslint/scope-manager@npm:6.7.4" +"@typescript-eslint/scope-manager@npm:6.8.0": + version: 6.8.0 + resolution: "@typescript-eslint/scope-manager@npm:6.8.0" dependencies: - "@typescript-eslint/types": 6.7.4 - "@typescript-eslint/visitor-keys": 6.7.4 - checksum: 8475d28f6408c204fb6bf25df45c1f16cad950190e31346c4b1ae15461a96f30b31b6fd1d3d635b41db6aa9a3fd3de25f04823632c74eeea478f34ebd134a1b0 + "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/visitor-keys": 6.8.0 + checksum: b6cf2803531d1c14b56c30fd3cd807b80e17fe48d0da8e5aa9ae50915407ed732c7e2a7ac8030b7cf8ed07b8e481a1138d76bf05b727837a0e016280c2f6873b languageName: node linkType: hard @@ -2495,10 +2497,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:6.7.4": - version: 6.7.4 - resolution: "@typescript-eslint/types@npm:6.7.4" - checksum: 287ae48a2bb722b866460bcb2ba4ff908348145b3fc0af4ea75679d474e9ba3632bf64689044f181fe8ca3cb5f41238bb31ea428d5e78f1c3982f6dac6b7b149 +"@typescript-eslint/types@npm:6.8.0": + version: 6.8.0 + resolution: "@typescript-eslint/types@npm:6.8.0" + checksum: 1fcd85f6d575116d51c6ee757ed37610ae5e7e4296a29f93c9c6949f6cd16d24550eb7fc5bae7a43119cc08e13836f69a7ae7c54ebba6c95aef96b34d3bfb7f7 languageName: node linkType: hard @@ -2520,12 +2522,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.7.4": - version: 6.7.4 - resolution: "@typescript-eslint/typescript-estree@npm:6.7.4" +"@typescript-eslint/typescript-estree@npm:6.8.0": + version: 6.8.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.8.0" dependencies: - "@typescript-eslint/types": 6.7.4 - "@typescript-eslint/visitor-keys": 6.7.4 + "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/visitor-keys": 6.8.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -2534,7 +2536,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 2e8f5e972403233522eff09cfe7a0a23549cfd462e82b434aa32ddbdba5b329be5a549514a157f6b79e2d0159c9348d23b202e5d915d4f2c7cbfe72e1a48a429 + checksum: 388db7f33ef1bc0e7b960c0bce9c744c2e32c66c7ab8dfae73d8533958202ad6f31663b0010f79c45b5ff93159c67f45b00693d73b9da2472b17156dfd26b4a8 languageName: node linkType: hard @@ -2566,13 +2568,20 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.7.4": - version: 6.7.4 - resolution: "@typescript-eslint/visitor-keys@npm:6.7.4" +"@typescript-eslint/visitor-keys@npm:6.8.0": + version: 6.8.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.8.0" dependencies: - "@typescript-eslint/types": 6.7.4 + "@typescript-eslint/types": 6.8.0 eslint-visitor-keys: ^3.4.1 - checksum: 34d09798b6c48dc059e88c6cb3df5f96e859bd65d1dd05d907b8a3c7a5708a737d50607081fb14a4b974b90cfe4169a93db974bf53af8b282420187f73b0afac + checksum: 710d9067b85d7715a400ae625c083c41733abb891d7b35108de083913980f9642e79d27689599fa39915f0fecae16dbfc30367007fccc838ccd917943660de22 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 languageName: node linkType: hard @@ -2920,7 +2929,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6": +"array-includes@npm:^3.1.7": version: 3.1.7 resolution: "array-includes@npm:3.1.7" dependencies: @@ -2956,7 +2965,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlastindex@npm:^1.2.2": +"array.prototype.findlastindex@npm:^1.2.3": version: 1.2.3 resolution: "array.prototype.findlastindex@npm:1.2.3" dependencies: @@ -2969,7 +2978,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.3.1": +"array.prototype.flat@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flat@npm:1.3.2" dependencies: @@ -2981,7 +2990,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.1": +"array.prototype.flatmap@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flatmap@npm:1.3.2" dependencies: @@ -3152,39 +3161,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.5": - version: 0.4.5 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.5" +"babel-plugin-polyfill-corejs2@npm:^0.4.6": + version: 0.4.6 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" dependencies: "@babel/compat-data": ^7.22.6 - "@babel/helper-define-polyfill-provider": ^0.4.2 + "@babel/helper-define-polyfill-provider": ^0.4.3 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 33a8e06aa54e2858d211c743d179f0487b03222f9ca1bfd7c4865bca243fca942a3358cb75f6bb894ed476cbddede834811fbd6903ff589f055821146f053e1a + checksum: 08896811df31530be6a9bcdd630cb9fd4b5ae5181039d18db3796efbc54e38d57a42af460845c10a04434e1bc45c0d47743c7e6c860383cc6b141083cde22030 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.8.3": - version: 0.8.4 - resolution: "babel-plugin-polyfill-corejs3@npm:0.8.4" +"babel-plugin-polyfill-corejs3@npm:^0.8.5": + version: 0.8.5 + resolution: "babel-plugin-polyfill-corejs3@npm:0.8.5" dependencies: - "@babel/helper-define-polyfill-provider": ^0.4.2 + "@babel/helper-define-polyfill-provider": ^0.4.3 core-js-compat: ^3.32.2 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 7243241a5b978b1335d51bcbd1248d6c4df88f6b3726706e71e0392f111c59bbf01118c85bb0ed42dce65e90e8fc768d19eda0a81a321cbe54abd3df9a285dc8 + checksum: 54ff3956c4f88e483d38b27ceec6199b9e73fceac10ebf969469d215e6a62929384e4433f85335c9a6ba809329636e27f9bdae2f54075f833e7a745341c07d84 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.2": - version: 0.5.2 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.2" +"babel-plugin-polyfill-regenerator@npm:^0.5.3": + version: 0.5.3 + resolution: "babel-plugin-polyfill-regenerator@npm:0.5.3" dependencies: - "@babel/helper-define-polyfill-provider": ^0.4.2 + "@babel/helper-define-polyfill-provider": ^0.4.3 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: d962200f604016a9a09bc9b4aaf60a3db7af876bb65bcefaeac04d44ac9d9ec4037cf24ce117760cc141d7046b6394c7eb0320ba9665cb4a2ee64df2be187c93 + checksum: 2bb546582cda1870d19e646a7183baeb2cccd56e0ef3e4eaeabd28e120daf17cb87399194a9ccdcf32506bcaa68d23e73440fc8ab990a7a0f8c5a77c12d5d4bc languageName: node linkType: hard @@ -3484,13 +3493,14 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": + version: 1.0.5 + resolution: "call-bind@npm:1.0.5" dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.1 + set-function-length: ^1.1.1 + checksum: 449e83ecbd4ba48e7eaac5af26fea3b50f8f6072202c2dd7c5a6e7a6308f2421abe5e13a3bbd55221087f76320c5e09f25a8fdad1bab2b77c68ae74d92234ea5 languageName: node linkType: hard @@ -3538,9 +3548,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001541": - version: 1.0.30001546 - resolution: "caniuse-lite@npm:1.0.30001546" - checksum: d3ef82f5ee94743002c5b2dd61c84342debcc94b2d5907b64ade3514ecfc4f20bbe86a6bc453fd6436d5fbcf6582e07405d7c2077565675a71c83adc238a11fa + version: 1.0.30001553 + resolution: "caniuse-lite@npm:1.0.30001553" + checksum: 45d6a2a3c3a098c8093a4c8883fceafb4bbf59d96f6fd5bb381ba4581d07eecbe0ede4f55383f0d49374154ff6a808bd90fbe32b17ccd1738034d2579787b33c languageName: node linkType: hard @@ -4093,11 +4103,11 @@ __metadata: linkType: hard "core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.32.2": - version: 3.33.0 - resolution: "core-js-compat@npm:3.33.0" + version: 3.33.1 + resolution: "core-js-compat@npm:3.33.1" dependencies: browserslist: ^4.22.1 - checksum: 83ae54008c09b8e0ae3c59457039866c342c7e28b0d30eebb638a5b51c01432e63fe97695c90645cbc6a8b073a4f9a8b0e75f0818bbf8b4b054e01f4c17d3181 + checksum: 39329daf135a3d8fdd86cf61d4fb2e868d1d9a60308cd98fccd0296d5e40b040c107e9aaa8a87163d8c058c69fbd441bc0a7a035aebd2d0978275bd0b257df15 languageName: node linkType: hard @@ -4108,10 +4118,10 @@ __metadata: languageName: node linkType: hard -"core-js@npm:^3.33.0": - version: 3.33.0 - resolution: "core-js@npm:3.33.0" - checksum: dd62217935ac281faf6f833bb306fb891162919fcf9c1f0c975b1b91e82ac09a940f5deb5950bbb582739ceef716e8bd7e4f9eab8328932fb029d3bc2ecb2881 +"core-js@npm:^3.33.1": + version: 3.33.1 + resolution: "core-js@npm:3.33.1" + checksum: 3a95003b0e77995203587117f3bde7f4e96adf434b6b78033dbe60347ffe38b2bac31eafab6a4cc641e5766062846b52f336ab4553fc0902c278959af4778e53 languageName: node linkType: hard @@ -4187,10 +4197,10 @@ __metadata: languageName: node linkType: hard -"css-functions-list@npm:^3.2.0": - version: 3.2.0 - resolution: "css-functions-list@npm:3.2.0" - checksum: fe912ea852fad500aef9a4f04db9a0371c7b0eb1ac1a45fbd8df0156ae0538cee7492ebd620b9bb502fe5bf2b5ed3bf3c16b6659cf67c7144eff0b597bcc3891 +"css-functions-list@npm:^3.2.1": + version: 3.2.1 + resolution: "css-functions-list@npm:3.2.1" + checksum: 57d7deb3b05e84d95b88ba9b3244cf60d33b40652b3357f084c805b24a9febda5987ade44ef25a56be41e73249a7dcc157abd704d8a0e998b2c1c2e2d5de6461 languageName: node linkType: hard @@ -4446,14 +4456,14 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.0.1": - version: 1.1.0 - resolution: "define-data-property@npm:1.1.0" +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": + version: 1.1.1 + resolution: "define-data-property@npm:1.1.1" dependencies: get-intrinsic: ^1.2.1 gopd: ^1.0.1 has-property-descriptors: ^1.0.0 - checksum: 7ad4ee84cca8ad427a4831f5693526804b62ce9dfd4efac77214e95a4382aed930072251d4075dc8dc9fc949a353ed51f19f5285a84a788ba9216cc51472a093 + checksum: a29855ad3f0630ea82e3c5012c812efa6ca3078d5c2aa8df06b5f597c1cde6f7254692df41945851d903e05a1668607b6d34e778f402b9ff9ffb38111f1a3f0d languageName: node linkType: hard @@ -4782,9 +4792,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.535": - version: 1.4.544 - resolution: "electron-to-chromium@npm:1.4.544" - checksum: 78e88e4c56fc4faaa9a405de5e0b51305531e9cdf2c71bcc9296c2c59fb68001472e5b924f8701c873bc855ab5174cf0340642712d7af05c1d8e92356529397e + version: 1.4.563 + resolution: "electron-to-chromium@npm:1.4.563" + checksum: 50512b9662688291b1c4e921def7206bab1ebd57f5bf5bdbb7961842ae69b4baad5df1293084b62ea07686c578e42ed17546434d7c9102960914240770921a5b languageName: node linkType: hard @@ -4930,24 +4940,24 @@ __metadata: linkType: hard "es-abstract@npm:^1.22.1": - version: 1.22.2 - resolution: "es-abstract@npm:1.22.2" + version: 1.22.3 + resolution: "es-abstract@npm:1.22.3" dependencies: array-buffer-byte-length: ^1.0.0 arraybuffer.prototype.slice: ^1.0.2 available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 + call-bind: ^1.0.5 es-set-tostringtag: ^2.0.1 es-to-primitive: ^1.2.1 function.prototype.name: ^1.1.6 - get-intrinsic: ^1.2.1 + get-intrinsic: ^1.2.2 get-symbol-description: ^1.0.0 globalthis: ^1.0.3 gopd: ^1.0.1 - has: ^1.0.3 has-property-descriptors: ^1.0.0 has-proto: ^1.0.1 has-symbols: ^1.0.3 + hasown: ^2.0.0 internal-slot: ^1.0.5 is-array-buffer: ^3.0.2 is-callable: ^1.2.7 @@ -4957,7 +4967,7 @@ __metadata: is-string: ^1.0.7 is-typed-array: ^1.1.12 is-weakref: ^1.0.2 - object-inspect: ^1.12.3 + object-inspect: ^1.13.1 object-keys: ^1.1.1 object.assign: ^4.1.4 regexp.prototype.flags: ^1.5.1 @@ -4971,28 +4981,28 @@ __metadata: typed-array-byte-offset: ^1.0.0 typed-array-length: ^1.0.4 unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.11 - checksum: cc70e592d360d7d729859013dee7a610c6b27ed8630df0547c16b0d16d9fe6505a70ee14d1af08d970fdd132b3f88c9ca7815ce72c9011608abf8ab0e55fc515 + which-typed-array: ^1.1.13 + checksum: b1bdc962856836f6e72be10b58dc128282bdf33771c7a38ae90419d920fc3b36cc5d2b70a222ad8016e3fc322c367bf4e9e89fc2bc79b7e933c05b218e83d79a languageName: node linkType: hard "es-set-tostringtag@npm:^2.0.1": - version: 2.0.1 - resolution: "es-set-tostringtag@npm:2.0.1" + version: 2.0.2 + resolution: "es-set-tostringtag@npm:2.0.2" dependencies: - get-intrinsic: ^1.1.3 - has: ^1.0.3 + get-intrinsic: ^1.2.2 has-tostringtag: ^1.0.0 - checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 + hasown: ^2.0.0 + checksum: afcec3a4c9890ae14d7ec606204858441c801ff84f312538e1d1ccf1e5493c8b17bd672235df785f803756472cb4f2d49b87bde5237aef33411e74c22f194e07 languageName: node linkType: hard "es-shim-unscopables@npm:^1.0.0": - version: 1.0.0 - resolution: "es-shim-unscopables@npm:1.0.0" + version: 1.0.2 + resolution: "es-shim-unscopables@npm:1.0.2" dependencies: - has: ^1.0.3 - checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 + hasown: ^2.0.0 + checksum: 432bd527c62065da09ed1d37a3f8e623c423683285e6188108286f4a1e8e164a5bcbfbc0051557c7d14633cd2a41ce24c7048e6bbb66a985413fd32f1be72626 languageName: node linkType: hard @@ -5099,7 +5109,7 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.7, eslint-import-resolver-node@npm:^0.3.9": +"eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" dependencies: @@ -5140,36 +5150,36 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.28.1": - version: 2.28.1 - resolution: "eslint-plugin-import@npm:2.28.1" +"eslint-plugin-import@npm:^2.29.0": + version: 2.29.0 + resolution: "eslint-plugin-import@npm:2.29.0" dependencies: - array-includes: ^3.1.6 - array.prototype.findlastindex: ^1.2.2 - array.prototype.flat: ^1.3.1 - array.prototype.flatmap: ^1.3.1 + array-includes: ^3.1.7 + array.prototype.findlastindex: ^1.2.3 + array.prototype.flat: ^1.3.2 + array.prototype.flatmap: ^1.3.2 debug: ^3.2.7 doctrine: ^2.1.0 - eslint-import-resolver-node: ^0.3.7 + eslint-import-resolver-node: ^0.3.9 eslint-module-utils: ^2.8.0 - has: ^1.0.3 - is-core-module: ^2.13.0 + hasown: ^2.0.0 + is-core-module: ^2.13.1 is-glob: ^4.0.3 minimatch: ^3.1.2 - object.fromentries: ^2.0.6 - object.groupby: ^1.0.0 - object.values: ^1.1.6 + object.fromentries: ^2.0.7 + object.groupby: ^1.0.1 + object.values: ^1.1.7 semver: ^6.3.1 tsconfig-paths: ^3.14.2 peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: e8ae6dd8f06d8adf685f9c1cfd46ac9e053e344a05c4090767e83b63a85c8421ada389807a39e73c643b9bff156715c122e89778169110ed68d6428e12607edf + checksum: 19ee541fb95eb7a796f3daebe42387b8d8262bbbcc4fd8a6e92f63a12035f3d2c6cb8bc0b6a70864fa14b1b50ed6b8e6eed5833e625e16cb6bb98b665beff269 languageName: node linkType: hard -"eslint-plugin-jest@npm:^27.4.2": - version: 27.4.2 - resolution: "eslint-plugin-jest@npm:27.4.2" +"eslint-plugin-jest@npm:^27.4.3": + version: 27.4.3 + resolution: "eslint-plugin-jest@npm:27.4.3" dependencies: "@typescript-eslint/utils": ^5.10.0 peerDependencies: @@ -5181,7 +5191,7 @@ __metadata: optional: true jest: optional: true - checksum: 99a8301ae00c37da97866b8b13c89a077716d2c653b26bc417d242e7300a43237c0017fd488c43966fa38585f19050facdbbc71d03ca36a1ce6f2ba930a9143e + checksum: de062a04f30d72535aecfd6594aa302cf350d62e86805c8f0edbb3dce4cde5b557766e7acfd0f87709a9b70854cc2522c04b875337925c64d0d9bc1118ef4693 languageName: node linkType: hard @@ -5221,17 +5231,18 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.51.0": - version: 8.51.0 - resolution: "eslint@npm:8.51.0" +"eslint@npm:^8.52.0": + version: 8.52.0 + resolution: "eslint@npm:8.52.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.6.1 "@eslint/eslintrc": ^2.1.2 - "@eslint/js": 8.51.0 - "@humanwhocodes/config-array": ^0.11.11 + "@eslint/js": 8.52.0 + "@humanwhocodes/config-array": ^0.11.13 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 + "@ungap/structured-clone": ^1.2.0 ajv: ^6.12.4 chalk: ^4.0.0 cross-spawn: ^7.0.2 @@ -5264,7 +5275,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 214fa5d1fcb67af1b8992ce9584ccd85e1aa7a482f8b8ea5b96edc28fa838a18a3b69456db45fc1ed3ef95f1e9efa9714f737292dc681e572d471d02fda9649c + checksum: fd22d1e9bd7090e31b00cbc7a3b98f3b76020a4c4641f987ae7d0c8f52e1b88c3b268bdfdabac2e1a93513e5d11339b718ff45cbff48a44c35d7e52feba510ed languageName: node linkType: hard @@ -5546,6 +5557,15 @@ __metadata: languageName: node linkType: hard +"file-entry-cache@npm:^7.0.0": + version: 7.0.1 + resolution: "file-entry-cache@npm:7.0.1" + dependencies: + flat-cache: ^3.1.1 + checksum: 3b5affa175cc246147ca394fa2ed719d306126a9259bef7b29c4024451d6671c82bf505600c37ec1398f80427c1fa91edb973b5d5228fd40590f797ce7a2401c + languageName: node + linkType: hard + "filelist@npm:^1.0.4": version: 1.0.4 resolution: "filelist@npm:1.0.4" @@ -5615,7 +5635,7 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4": +"flat-cache@npm:^3.0.4, flat-cache@npm:^3.1.1": version: 3.1.1 resolution: "flat-cache@npm:3.1.1" dependencies: @@ -5674,9 +5694,9 @@ __metadata: linkType: hard "fraction.js@npm:^4.3.6": - version: 4.3.6 - resolution: "fraction.js@npm:4.3.6" - checksum: e96ae77e64ebfd442d3a5a01a3f0637b0663fc2440bcf2841b3ad9341ba24c81fb2e3e7142e43ef7d088558c6b3f8609df135b201adc7a1c674aea6a71384162 + version: 4.3.7 + resolution: "fraction.js@npm:4.3.7" + checksum: e1553ae3f08e3ba0e8c06e43a3ab20b319966dfb7ddb96fd9b5d0ee11a66571af7f993229c88ebbb0d4a816eb813a24ed48207b140d442a8f76f33763b8d1f3f languageName: node linkType: hard @@ -5762,10 +5782,10 @@ __metadata: languageName: node linkType: hard -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 languageName: node linkType: hard @@ -5818,15 +5838,15 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1": - version: 1.2.1 - resolution: "get-intrinsic@npm:1.2.1" +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": + version: 1.2.2 + resolution: "get-intrinsic@npm:1.2.2" dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 + function-bind: ^1.1.2 has-proto: ^1.0.1 has-symbols: ^1.0.3 - checksum: 5b61d88552c24b0cf6fa2d1b3bc5459d7306f699de060d76442cce49a4721f52b8c560a33ab392cf5575b7810277d54ded9d4d39a1ea61855619ebc005aa7e5f + hasown: ^2.0.0 + checksum: 447ff0724df26829908dc033b62732359596fcf66027bc131ab37984afb33842d9cd458fd6cecadfe7eac22fd8a54b349799ed334cf2726025c921c7250e7417 languageName: node linkType: hard @@ -6213,11 +6233,11 @@ __metadata: linkType: hard "has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" + version: 1.0.1 + resolution: "has-property-descriptors@npm:1.0.1" dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + get-intrinsic: ^1.2.2 + checksum: 2bcc6bf6ec6af375add4e4b4ef586e43674850a91ad4d46666d0b28ba8e1fd69e424c7677d24d60f69470ad0afaa2f3197f508b20b0bb7dd99a8ab77ffc4b7c4 languageName: node linkType: hard @@ -6258,10 +6278,12 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.4 - resolution: "has@npm:1.0.4" - checksum: 8a11ba062e0627c9578a1d08285401e39f1d071a9692ddf793199070edb5648b21c774dd733e2a181edd635bf6862731885f476f4ccf67c998d7a5ff7cef2550 +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" + dependencies: + function-bind: ^1.1.2 + checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 languageName: node linkType: hard @@ -6574,13 +6596,13 @@ __metadata: linkType: hard "internal-slot@npm:^1.0.5": - version: 1.0.5 - resolution: "internal-slot@npm:1.0.5" + version: 1.0.6 + resolution: "internal-slot@npm:1.0.6" dependencies: - get-intrinsic: ^1.2.0 - has: ^1.0.3 + get-intrinsic: ^1.2.2 + hasown: ^2.0.0 side-channel: ^1.0.4 - checksum: 97e84046bf9e7574d0956bd98d7162313ce7057883b6db6c5c7b5e5f05688864b0978ba07610c726d15d66544ffe4b1050107d93f8a39ebc59b15d8b429b497a + checksum: 7872454888047553ce97a3fa1da7cc054a28ec5400a9c2e9f4dbe4fe7c1d041cb8e8301467614b80d4246d50377aad2fb58860b294ed74d6700cc346b6f89549 languageName: node linkType: hard @@ -6705,12 +6727,12 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": - version: 2.13.0 - resolution: "is-core-module@npm:2.13.0" +"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.5.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" dependencies: - has: ^1.0.3 - checksum: 053ab101fb390bfeb2333360fd131387bed54e476b26860dc7f5a700bbf34a0ec4454f7c8c4d43e8a0030957e4b3db6e16d35e1890ea6fb654c833095e040355 + hasown: ^2.0.0 + checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c languageName: node linkType: hard @@ -7045,7 +7067,7 @@ __metadata: languageName: node linkType: hard -"is@npm:^3.2.1": +"is@npm:^3.3.0": version: 3.3.0 resolution: "is@npm:3.3.0" checksum: 81fad3b40c606984c2d0699207c4c48d2a0d29cc834b274d0b74c172f3eeebdb981301fe0d690ce090a96bf021a8a1f8b1325262ad9870c525e557ac4a559c56 @@ -7916,6 +7938,13 @@ __metadata: languageName: node linkType: hard +"known-css-properties@npm:^0.29.0": + version: 0.29.0 + resolution: "known-css-properties@npm:0.29.0" + checksum: daa6562e907f856cbfd58a00c42f532c9bba283388984da6a3bffb494e56612e5f23c52f30b0d9885f0ea07ad5d88bfa0470ee65017a6ce6c565289a1afd78af + languageName: node + linkType: hard + "latest-version@npm:^5.0.0": version: 5.1.0 resolution: "latest-version@npm:5.1.0" @@ -7977,14 +8006,14 @@ __metadata: linkType: hard "liquidjs@npm:^10.7.0": - version: 10.9.2 - resolution: "liquidjs@npm:10.9.2" + version: 10.9.3 + resolution: "liquidjs@npm:10.9.3" dependencies: commander: ^10.0.0 bin: liquid: bin/liquid.js liquidjs: bin/liquid.js - checksum: 2d061869fe76f69f7bf38258c34ddd17659174aaad9a072dc35a230cf858d39ff514e7bf5898065eb2de838392acc04e8fdcf7ec70c6ec53ab11d097ab068148 + checksum: 8f4d62f746706a9483a03527798b3b0277a4becaddee7f4b43fe30298849c34db99c1bfbeb99145e3119c96847527b8b3c42eff386605bf72443de472df88089 languageName: node linkType: hard @@ -8405,12 +8434,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.27.0": - version: 0.27.0 - resolution: "magic-string@npm:0.27.0" +"magic-string@npm:^0.30.3": + version: 0.30.5 + resolution: "magic-string@npm:0.30.5" dependencies: - "@jridgewell/sourcemap-codec": ^1.4.13 - checksum: 273faaa50baadb7a2df6e442eac34ad611304fc08fe16e24fe2e472fd944bfcb73ffb50d2dc972dc04e92784222002af46868cb9698b1be181c81830fd95a13e + "@jridgewell/sourcemap-codec": ^1.4.15 + checksum: da10fecff0c0a7d3faf756913ce62bd6d5e7b0402be48c3b27bfd651b90e29677e279069a63b764bcdc1b8ecdcdb898f29a5c5ec510f2323e8d62ee057a6eb18 languageName: node linkType: hard @@ -8977,11 +9006,11 @@ __metadata: linkType: hard "node-abi@npm:^3.3.0": - version: 3.47.0 - resolution: "node-abi@npm:3.47.0" + version: 3.51.0 + resolution: "node-abi@npm:3.51.0" dependencies: semver: ^7.3.5 - checksum: ff8498dcd4a805ebf0af27162023bb17e56cb973c955d6c411ebce0938b0827e34323ede846b635daff516d5cd2ea8d64f9d99f2d63f61d1d7469415323fa9a6 + checksum: 3fabc9d58f0478767157560249f79c4a9e95082b96700cd8cc470f517bd566dbab82a37c862db3f78d3187be9f19f5cd9822b6f1b7ac7a3254fa70c3e3b38a83 languageName: node linkType: hard @@ -9044,12 +9073,12 @@ __metadata: linkType: hard "node.extend@npm:~2.0.2": - version: 2.0.2 - resolution: "node.extend@npm:2.0.2" + version: 2.0.3 + resolution: "node.extend@npm:2.0.3" dependencies: - has: ^1.0.3 - is: ^3.2.1 - checksum: 1fe3a1ca7fc35392f169c8a46d889d07deb201bba3a20d17df23efab509698c9639737b0c235c9be772a34035e749bae5d477f74c9e26a1b67c78bd7d6dce8e4 + hasown: ^2.0.0 + is: ^3.3.0 + checksum: fde3c527df4b814d773d06392a576a062a6322bbcf4ad2c8726c900573256164fd04d61ee9b09fca774f1dfae7035cb47d23334da50b308d83e9c525f2b83ea9 languageName: node linkType: hard @@ -9233,10 +9262,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": - version: 1.12.3 - resolution: "object-inspect@npm:1.12.3" - checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db +"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": + version: 1.13.1 + resolution: "object-inspect@npm:1.13.1" + checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f languageName: node linkType: hard @@ -9259,7 +9288,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.6": +"object.fromentries@npm:^2.0.7": version: 2.0.7 resolution: "object.fromentries@npm:2.0.7" dependencies: @@ -9270,7 +9299,7 @@ __metadata: languageName: node linkType: hard -"object.groupby@npm:^1.0.0": +"object.groupby@npm:^1.0.1": version: 1.0.1 resolution: "object.groupby@npm:1.0.1" dependencies: @@ -9282,7 +9311,7 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.6": +"object.values@npm:^1.1.7": version: 1.1.7 resolution: "object.values@npm:1.1.7" dependencies: @@ -9303,33 +9332,33 @@ __metadata: "@11ty/eleventy-plugin-rss": ^1.2.0 "@11ty/eleventy-plugin-syntaxhighlight": ^5.0.0 "@algolia/algoliasearch-netlify-frontend": ^1.0.15 - "@babel/core": ^7.23.0 - "@babel/preset-env": ^7.22.20 + "@babel/core": ^7.23.2 + "@babel/preset-env": ^7.23.2 "@netlify/plugin-a11y": ^1.0.0-beta.1 "@rollup/plugin-babel": ^6.0.4 - "@rollup/plugin-commonjs": ^25.0.5 + "@rollup/plugin-commonjs": ^25.0.7 "@rollup/plugin-node-resolve": ^15.2.3 "@rollup/plugin-terser": ^0.4.4 "@tommoor/remove-markdown": ^0.3.2 - "@typescript-eslint/parser": ^6.7.4 + "@typescript-eslint/parser": ^6.8.0 accoutrement: ^4.0.4 autoprefixer: ^10.4.16 babel-jest: ^29.7.0 cascading-color-systems: ^0.1.0-beta.16 chalk: ^4.1.2 chokidar-cli: ^3.0.0 - core-js: ^3.33.0 + core-js: ^3.33.1 cssremedy: ^0.1.0-beta.2 date-fns: ^2.30.0 date-fns-tz: ^2.0.0 dotenv: ^16.3.1 doxray: ^0.10.1 - eslint: ^8.51.0 + eslint: ^8.52.0 eslint-config-prettier: ^9.0.0 eslint-import-resolver-node: ^0.3.9 eslint-import-resolver-typescript: ^3.6.1 - eslint-plugin-import: ^2.28.1 - eslint-plugin-jest: ^27.4.2 + eslint-plugin-import: ^2.29.0 + eslint-plugin-jest: ^27.4.3 eslint-plugin-simple-import-sort: ^10.0.0 fs-extra: ^11.1.1 jest: ^29.7.0 @@ -9347,14 +9376,14 @@ __metadata: postcss: ^8.4.31 prettier: ^3.0.3 rimraf: ^3.0.2 - rollup: ^4.0.2 + rollup: ^4.1.4 sanitize-html: ^2.11.0 - sass: ^1.69.0 + sass: ^1.69.4 sassdoc: ^2.7.4 sassdoc-theme-herman: ^5.0.1 slugify: ^1.6.6 striptags: ^3.2.0 - stylelint: ^15.10.3 + stylelint: ^15.11.0 stylelint-config-standard-scss: ^11.0.0 truncate-html: ^1.0.4 typescript: ^5.2.2 @@ -9838,7 +9867,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:*, postcss@npm:^8.3.11, postcss@npm:^8.4.27, postcss@npm:^8.4.31": +"postcss@npm:*, postcss@npm:^8.3.11, postcss@npm:^8.4.28, postcss@npm:^8.4.31": version: 8.4.31 resolution: "postcss@npm:8.4.31" dependencies: @@ -10645,28 +10674,28 @@ __metadata: linkType: hard "resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.15.1, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4": - version: 1.22.6 - resolution: "resolve@npm:1.22.6" + version: 1.22.8 + resolution: "resolve@npm:1.22.8" dependencies: is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: d13bf66d4e2ee30d291491f16f2fa44edd4e0cefb85d53249dd6f93e70b2b8c20ec62f01b18662e3cd40e50a7528f18c4087a99490048992a3bb954cf3201a5b + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c languageName: node linkType: hard "resolve@patch:resolve@^1.10.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.14.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.15.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.4#~builtin<compat/resolve>": - version: 1.22.6 - resolution: "resolve@patch:resolve@npm%3A1.22.6#~builtin<compat/resolve>::version=1.22.6&hash=c3c19d" + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin<compat/resolve>::version=1.22.8&hash=c3c19d" dependencies: is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 9d3b3c67aefd12cecbe5f10ca4d1f51ea190891096497c43f301b086883b426466918c3a64f1bbf1788fabb52b579d58809614006c5d0b49186702b3b8fb746a + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 languageName: node linkType: hard @@ -10715,22 +10744,22 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.0.2": - version: 4.0.2 - resolution: "rollup@npm:4.0.2" - dependencies: - "@rollup/rollup-android-arm-eabi": 4.0.2 - "@rollup/rollup-android-arm64": 4.0.2 - "@rollup/rollup-darwin-arm64": 4.0.2 - "@rollup/rollup-darwin-x64": 4.0.2 - "@rollup/rollup-linux-arm-gnueabihf": 4.0.2 - "@rollup/rollup-linux-arm64-gnu": 4.0.2 - "@rollup/rollup-linux-arm64-musl": 4.0.2 - "@rollup/rollup-linux-x64-gnu": 4.0.2 - "@rollup/rollup-linux-x64-musl": 4.0.2 - "@rollup/rollup-win32-arm64-msvc": 4.0.2 - "@rollup/rollup-win32-ia32-msvc": 4.0.2 - "@rollup/rollup-win32-x64-msvc": 4.0.2 +"rollup@npm:^4.1.4": + version: 4.1.4 + resolution: "rollup@npm:4.1.4" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.1.4 + "@rollup/rollup-android-arm64": 4.1.4 + "@rollup/rollup-darwin-arm64": 4.1.4 + "@rollup/rollup-darwin-x64": 4.1.4 + "@rollup/rollup-linux-arm-gnueabihf": 4.1.4 + "@rollup/rollup-linux-arm64-gnu": 4.1.4 + "@rollup/rollup-linux-arm64-musl": 4.1.4 + "@rollup/rollup-linux-x64-gnu": 4.1.4 + "@rollup/rollup-linux-x64-musl": 4.1.4 + "@rollup/rollup-win32-arm64-msvc": 4.1.4 + "@rollup/rollup-win32-ia32-msvc": 4.1.4 + "@rollup/rollup-win32-x64-msvc": 4.1.4 fsevents: ~2.3.2 dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -10761,7 +10790,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 29ada628da893964b238466053e81750a9e0339e2a933fe6b100d0de2cb68c493f6cc4af558f5bbdafdfcd085e7d8d06da025776ef54fdd46447c3244053fb41 + checksum: 1a2226627df78c1ce90c0f7ce8e4f589117205c7c699e91403d132d945b3e1d9803d2c2ebaa1a7ef144cc9c08d83b7eb177e6aa5c82517d8faad6a3a59d82666 languageName: node linkType: hard @@ -10862,16 +10891,16 @@ __metadata: languageName: node linkType: hard -"sass@npm:^1.69.0": - version: 1.69.0 - resolution: "sass@npm:1.69.0" +"sass@npm:^1.69.4": + version: 1.69.4 + resolution: "sass@npm:1.69.4" dependencies: chokidar: ">=3.0.0 <4.0.0" immutable: ^4.0.0 source-map-js: ">=0.6.2 <2.0.0" bin: sass: sass.js - checksum: eabea31ea3b1dd529c7eff345c8b6468afe6ab8011bd4f95caa2cffb8fb115cc055ea21de425be6197f7ed22516f5652eccb98d315d592ea152ada553f964b8a + checksum: ed5558445b59dfa711e094f804e4a360544dd916c069ee211e1c687446146721d91d4304f33fe5df3966a10de96eba43369beb2e14f0881c285424e5e44cf360 languageName: node linkType: hard @@ -11077,6 +11106,18 @@ __metadata: languageName: node linkType: hard +"set-function-length@npm:^1.1.1": + version: 1.1.1 + resolution: "set-function-length@npm:1.1.1" + dependencies: + define-data-property: ^1.1.1 + get-intrinsic: ^1.2.1 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + checksum: c131d7569cd7e110cafdfbfbb0557249b538477624dfac4fc18c376d879672fa52563b74029ca01f8f4583a8acb35bb1e873d573a24edb80d978a7ee607c6e06 + languageName: node + linkType: hard + "set-function-name@npm:^2.0.0": version: 2.0.1 resolution: "set-function-name@npm:2.0.1" @@ -11695,9 +11736,9 @@ __metadata: languageName: node linkType: hard -"stylelint@npm:^15.10.3": - version: 15.10.3 - resolution: "stylelint@npm:15.10.3" +"stylelint@npm:^15.11.0": + version: 15.11.0 + resolution: "stylelint@npm:15.11.0" dependencies: "@csstools/css-parser-algorithms": ^2.3.1 "@csstools/css-tokenizer": ^2.2.0 @@ -11706,12 +11747,12 @@ __metadata: balanced-match: ^2.0.0 colord: ^2.9.3 cosmiconfig: ^8.2.0 - css-functions-list: ^3.2.0 + css-functions-list: ^3.2.1 css-tree: ^2.3.1 debug: ^4.3.4 fast-glob: ^3.3.1 fastest-levenshtein: ^1.0.16 - file-entry-cache: ^6.0.1 + file-entry-cache: ^7.0.0 global-modules: ^2.0.0 globby: ^11.1.0 globjoin: ^0.1.4 @@ -11720,13 +11761,13 @@ __metadata: import-lazy: ^4.0.0 imurmurhash: ^0.1.4 is-plain-object: ^5.0.0 - known-css-properties: ^0.28.0 + known-css-properties: ^0.29.0 mathml-tag-names: ^2.1.3 meow: ^10.1.5 micromatch: ^4.0.5 normalize-path: ^3.0.0 picocolors: ^1.0.0 - postcss: ^8.4.27 + postcss: ^8.4.28 postcss-resolve-nested-selector: ^0.1.1 postcss-safe-parser: ^6.0.0 postcss-selector-parser: ^6.0.13 @@ -11741,7 +11782,7 @@ __metadata: write-file-atomic: ^5.0.1 bin: stylelint: bin/stylelint.mjs - checksum: eb70dd0e4d500141f4868ddb7403ad7eb8732b02a3f2fe3907d0859369cedd395b60b0075da758b5be07de771c586b1bf64de4eead8159d46b0d16beff827e67 + checksum: 9835f8a3e3976a3b81a35569d08f5f4a9c3b5cff415f1345a505870afc0c3231acff27f119d937c5bb11fdbc98d554af564c2a648a52604280a59a11974fcbfc languageName: node linkType: hard @@ -11892,8 +11933,8 @@ __metadata: linkType: hard "terser@npm:^5.17.4": - version: 5.21.0 - resolution: "terser@npm:5.21.0" + version: 5.22.0 + resolution: "terser@npm:5.22.0" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -11901,7 +11942,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 130f1567af1ffa4ddb067651bb284a01b45b5c83e82b3a072a5ff94b0b00ac35090f89c8714631a4a45972f65187bc149fc7144380611f437e1e3d9e174b136b + checksum: ee95981c54ebd381e0b7f5872c646e7a05543e53960f8e0c2f240863c368989d43a3ca80b7e9f691683c92ba199eb4b91d61785fef0b9ca4a887eb55866001f4 languageName: node linkType: hard @@ -12338,6 +12379,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~5.25.1": + version: 5.25.3 + resolution: "undici-types@npm:5.25.3" + checksum: ec9d2cc36520cbd9fbe3b3b6c682a87fe5be214699e1f57d1e3d9a2cb5be422e62735f06e0067dc325fd3dd7404c697e4d479f9147dc8a804e049e29f357f2ff + languageName: node + linkType: hard + "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" @@ -12730,16 +12778,16 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.11": - version: 1.1.11 - resolution: "which-typed-array@npm:1.1.11" +"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "which-typed-array@npm:1.1.13" dependencies: available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 + call-bind: ^1.0.4 for-each: ^0.3.3 gopd: ^1.0.1 has-tostringtag: ^1.0.0 - checksum: 711ffc8ef891ca6597b19539075ec3e08bb9b4c2ca1f78887e3c07a977ab91ac1421940505a197758fb5939aa9524976d0a5bbcac34d07ed6faa75cedbb17206 + checksum: 3828a0d5d72c800e369d447e54c7620742a4cc0c9baf1b5e8c17e9b6ff90d8d861a3a6dd4800f1953dbf80e5e5cec954a289e5b4a223e3bee4aeb1f8c5f33309 languageName: node linkType: hard