Author SHA1 Message Date
Ninosaurier 475a6cb634 docs(readme): remove outdated storybook root-script gap notice
CI / lint-and-format (push) Successful in 35s
CI / changeset-check (push) Successful in 27s
CI / unit-tests (push) Successful in 41s
CI / component-tests (push) Successful in 32s
CI / lint-and-format (pull_request) Successful in 35s
CI / changeset-check (pull_request) Successful in 31s
CI / unit-tests (pull_request) Successful in 37s
CI / component-tests (pull_request) Successful in 31s
Removes the note stating that running Storybook from the repository
root isn't set up yet, along with the old cd-into-package workaround
instructions. This gap was closed by the root-level pnpm run
storybook script added in #11, so the outdated guidance is no longer
accurate.
2026-08-12 13:47:01 +02:00
Ninosaurier f0c59a9b6f Merge pull request 'sync: merge dev into main' (#20) from dev into main
CI / lint-and-format (push) Successful in 38s
CI / changeset-check (push) Successful in 29s
CI / unit-tests (push) Successful in 37s
CI / component-tests (push) Successful in 29s
Reviewed-on: #20

Merge pull request #20 from dev into main

sync: merge dev into main

Syncs dev into main following the merge of PR #19 (storybook root
script).

Closes #11.
2026-08-12 11:22:40 +00:00
Ninosaurier 61ec0d839e Merge pull request 'build(scripts): add root-level pnpm run storybook script' (#19) from build/11-root-storybook-script into dev
CI / lint-and-format (push) Successful in 35s
CI / changeset-check (push) Successful in 32s
CI / unit-tests (push) Successful in 37s
CI / component-tests (push) Successful in 30s
CI / lint-and-format (pull_request) Successful in 36s
CI / changeset-check (pull_request) Successful in 28s
CI / unit-tests (pull_request) Successful in 38s
CI / component-tests (pull_request) Successful in 31s
Reviewed-on: #19

Adds a storybook script to the root package.json that filters into
the luna-charts package, so Storybook can be launched directly from
the repository root instead of requiring a manual cd into
packages/luna-charts. Updates README.md to document the new command
as part of the standard developer workflow.

Closes #11.
2026-08-12 10:48:59 +00:00
Ninosaurier 382536168b build(scripts): add root-level pnpm run storybook script
CI / lint-and-format (push) Successful in 34s
CI / changeset-check (push) Successful in 27s
CI / unit-tests (push) Successful in 41s
CI / component-tests (push) Successful in 30s
CI / lint-and-format (pull_request) Successful in 34s
CI / changeset-check (pull_request) Successful in 27s
CI / unit-tests (pull_request) Successful in 36s
CI / component-tests (pull_request) Successful in 30s
Adds a storybook script to the root package.json that filters into
the luna-charts package, so Storybook can be launched directly from
the repository root instead of requiring a manual cd into
packages/luna-charts. Updates README.md to document the new command
as part of the standard developer workflow.

 Closes #11.
2026-08-12 12:30:48 +02:00
Ninosaurier 956b2f277b Merge pull request 'chore(release): prepare v0.1.0 release for main' (#16) from dev into main
CI / lint-and-format (push) Successful in 34s
CI / changeset-check (push) Successful in 27s
CI / unit-tests (push) Successful in 34s
CI / component-tests (push) Successful in 30s
Reviewed-on: #16
2026-08-05 15:57:46 +00:00
Ninosaurier 37bb4e9ea2 Merge pull request 'chore(release): prepare v0.1.0 foundation release and update technology architecture' (#15) from update-technology-architecture into dev
CI / lint-and-format (push) Successful in 32s
CI / changeset-check (push) Successful in 31s
CI / unit-tests (push) Successful in 37s
CI / component-tests (push) Successful in 29s
CI / lint-and-format (pull_request) Successful in 33s
CI / changeset-check (pull_request) Successful in 24s
CI / unit-tests (pull_request) Successful in 39s
CI / component-tests (pull_request) Successful in 29s
Reviewed-on: #15

Merge pull request #15 from <branch-name>

chore(release): prepare v0.1.0 foundation release

Includes:
- Added Changeset for initial v0.1.0 release
- Updated README documentation
- Updated Technology Architecture documentation
- Updated ADR-0002
2026-08-05 15:52:19 +00:00
Ninosaurier 72c49e6b0f chore(changeset): prepare v0.1.0 release
CI / lint-and-format (push) Successful in 37s
CI / changeset-check (push) Successful in 25s
CI / unit-tests (push) Successful in 39s
CI / component-tests (push) Successful in 30s
CI / lint-and-format (pull_request) Successful in 32s
CI / changeset-check (pull_request) Successful in 28s
CI / unit-tests (pull_request) Successful in 36s
CI / component-tests (pull_request) Successful in 30s
2026-08-05 17:28:41 +02:00
Ninosaurier 9091bdcfae docs(update): update README to reflect .gitea/ CI setup and test image sourcing
CI / lint-and-format (push) Successful in 33s
CI / changeset-check (push) Successful in 26s
CI / unit-tests (push) Successful in 36s
CI / component-tests (push) Successful in 29s
Adds the .gitea/ directory to the project structure overview and
corrects the claim that local and CI test environments are identical.
Both are built from the same Dockerfile.test, but locally the image is
built on demand while CI pulls a prebuilt version — see ADR-0002 and
the Technology Architecture doc for details.
2026-08-05 17:20:41 +02:00
Ninosaurier 2ddf8961c2 docs(update): update README to reflect .gitea/ CI setup and test image sourcing
CI / lint-and-format (push) Successful in 34s
CI / changeset-check (push) Successful in 30s
CI / unit-tests (push) Successful in 37s
CI / component-tests (push) Successful in 30s
Adds the .gitea/ directory to the project structure overview and
corrects the claim that local and CI test environments are identical.
Both are built from the same Dockerfile.test, but locally the image is
built on demand while CI pulls a prebuilt version — see ADR-0002 and
the Technology Architecture doc for details.
2026-08-05 17:00:52 +02:00
Ninosaurier 7559a2725a Merge pull request 'ci(component-tests): add containerized component test workflow' (#14) from fix/ci-runner-test-component into dev
CI / lint-and-format (push) Successful in 39s
CI / changeset-check (push) Successful in 29s
CI / unit-tests (push) Successful in 42s
CI / component-tests (push) Successful in 32s
Merge branch 'fix/ci-runner-test-component' into 'dev'

ci(component-tests): add containerized component test workflow

Reviewed-on: #14
2026-08-04 12:34:04 +00:00
Ninosaurier caf0f3de2d ci(component-tests): add containerized component test workflow
CI / lint-and-format (push) Successful in 35s
CI / changeset-check (push) Successful in 28s
CI / unit-tests (push) Successful in 39s
CI / component-tests (push) Successful in 29s
CI / lint-and-format (pull_request) Successful in 36s
CI / changeset-check (pull_request) Successful in 33s
CI / unit-tests (pull_request) Successful in 37s
CI / component-tests (pull_request) Successful in 29s
Introduce dedicated CI container images and improve the component
test execution in Gitea Actions.

The workflow now uses reproducible runner environments, private
registry authentication and executes Playwright component tests
inside a prepared container.
2026-08-03 22:18:14 +02:00
Ninosaurier 856fea304a chore: scope workspace commands with pnpm filter
CI / lint-and-format (push) Successful in 36s
CI / changeset-check (push) Successful in 32s
CI / unit-tests (push) Successful in 38s
CI / component-tests (push) Failing after 28s
2026-08-02 15:39:19 +02:00
Ninosaurier 3b9a78bf9d style: format luna charts source 2026-08-02 15:38:45 +02:00
Ninosaurier 75d4632052 chore: update prettier configuration 2026-08-02 15:38:24 +02:00
Ninosaurier 9089a4ef60 fix(eslint): fix: allow stencil jsx helper in eslint
CI / changeset-check (push) Canceled after 0s
CI / unit-tests (push) Canceled after 0s
CI / component-tests (push) Canceled after 0s
CI / lint-and-format (push) Canceled after 4m4s
2026-08-02 15:26:15 +02:00
Ninosaurier 88154775de eslint(error): removed double line 2026-08-02 15:25:53 +02:00
Ninosaurier 5211b5f76a fix(ci): adjust root lint script to execute eslint directly within project directory 2026-08-02 15:25:31 +02:00
Ninosaurier b0ae34dbaa chore(lint): improve monorepo workspace scripts 2026-08-02 15:03:49 +02:00
Ninosaurier a92d83a5f4 fix(ci):
CI / lint-and-format (push) Failing after 34s
CI / changeset-check (push) Successful in 31s
CI / unit-tests (push) Successful in 42s
CI / component-tests (push) Failing after 25s
trigger workflow on all branch pushes and fix component tests setup
2026-08-02 14:35:50 +02:00
Ninosaurier 35747ec681 ci: trigger workflow on all branch pushes and fix component tests setup
- Changed push branch filter to wildcard '*' to test feature branches before merging
- Kept the missing pnpm/node setup fix for the component-tests job
2026-08-02 14:33:03 +02:00
Ninosaurier 6d1aeb6ee2 ci: trigger workflow on all branch pushes and fix component tests setup
- Changed push branch filter to wildcard '*' to test feature branches before merging
- Kept the missing pnpm/node setup fix for the component-tests job
2026-08-02 14:32:24 +02:00
Ninosaurier 768a43d9b6 fix(ci): add missing node and pnpm setup to component tests
Every job runs in an isolated container. The component-tests job
was missing the Node.js and pnpm installation steps, causing
command not found errors (exit code 127) during local execution.
2026-08-02 14:30:05 +02:00
Ninosaurier 75c8300d84 fix(runner): Fixed wrong label. the right label for using the runner is ubuntu-docker-dind
CI / lint-and-format (push) Failing after 1m31s
CI / changeset-check (push) Successful in 29s
CI / unit-tests (push) Successful in 39s
CI / component-tests (push) Failing after 5s
2026-08-02 14:14:12 +02:00
Ninosaurier 97f99a23ae fix-lint(lint-violation): Updated readme.md It had a lint-violation
CI / lint-and-format (push) Canceled after 0s
CI / changeset-check (push) Canceled after 0s
CI / unit-tests (push) Canceled after 0s
CI / component-tests (push) Canceled after 0s
2026-08-02 14:11:38 +02:00
Ninosaurier dd2874d8b0 feat(ci): add quality gate workflow for dev/main
CI / lint-and-format (push) Canceled after 0s
CI / changeset-check (push) Canceled after 0s
CI / unit-tests (push) Canceled after 0s
CI / component-tests (push) Canceled after 0s
Adds automated checks that were previously only run manually and
locally, closing the last remaining gap before dev can be merged
into main with confidence.

Runs on every push and pull request targeting dev or main:
- lint (eslint)
- format check (prettier --check)
- changeset presence check (non-blocking for now, see comment in
  workflow file)
- unit tests (vitest)
- component/browser tests (vitest + playwright, via the existing
  Docker test setup)

Fixes: #10
2026-08-02 02:00:57 +02:00
Ninosaurier 6e13c29141 chore(tooling): add prettier format check script 2026-08-02 01:44:40 +02:00
Ninosaurier 85b1ca240e fix(deps): pin playwright exactly and respect lockfile in docker build
The Playwright version was pinned with a caret range and the test
Dockerfile deleted pnpm-lock.yaml before installing, so every image
build silently re-resolved to the latest matching Playwright version.
This caused the npm package and the Docker base image to drift apart.

- packages/luna-charts/package.json: pin playwright to 1.62.1 exactly
- Dockerfile.test: stop deleting pnpm-lock.yaml before install, and
  use --frozen-lockfile so a mismatch between package.json and the
  lockfile fails the build loudly instead of resolving silently
2026-08-02 01:31:47 +02:00
27 changed files with 511 additions and 136 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'luna-charts': minor
---
Establish the initial project foundation with architecture, documentation, governance, and development tooling.
+18
View File
@@ -0,0 +1,18 @@
FROM node:22-bullseye
# Install Docker CLI + Compose V2 plugin from Docker's official apt repo
# (Debian's own docker.io package ships an outdated Docker version and
# does not include the compose plugin at all).
RUN apt-get update \
&& apt-get install -y ca-certificates curl gnupg \
&& install -m 0755 -d /etc/apt/keyrings \
&& curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc \
&& chmod a+r /etc/apt/keyrings/docker.asc \
&& echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian bullseye stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null \
&& apt-get update \
&& apt-get install -y docker-ce-cli docker-compose-plugin \
&& rm -rf /var/lib/apt/lists/*
RUN corepack enable
+90
View File
@@ -0,0 +1,90 @@
name: CI
on:
push:
branches:
- '**'
pull_request:
branches: [dev, main]
jobs:
lint-and-format:
runs-on: ubuntu-docker-dind
container:
image: git.byting-pandas.ninja/ci/node22-docker:latest
credentials:
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_TOKEN }}
steps:
- uses: actions/checkout@v4
- run: corepack enable
- run: corepack prepare pnpm@11.11.0 --activate
- run: pnpm install --frozen-lockfile
- name: Lint
run: pnpm lint
- name: Check formatting
run: pnpm format:check
changeset-check:
runs-on: ubuntu-docker-dind
container:
image: git.byting-pandas.ninja/ci/node22-docker:latest
credentials:
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_TOKEN }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- run: corepack enable
- run: corepack prepare pnpm@11.11.0 --activate
- run: pnpm install --frozen-lockfile
- name: Verify changeset exists
continue-on-error: true
run: pnpm changeset status --since=origin/dev
unit-tests:
runs-on: ubuntu-docker-dind
container:
image: git.byting-pandas.ninja/ci/node22-docker:latest
credentials:
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_TOKEN }}
steps:
- uses: actions/checkout@v4
- run: corepack enable
- run: corepack prepare pnpm@11.11.0 --activate
- run: pnpm install --frozen-lockfile
- name: Run unit tests
run: pnpm test:unit
component-tests:
runs-on: ubuntu-docker-dind
container:
image: git.byting-pandas.ninja/ci/luna-charts-test:v1.62.1
credentials:
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_TOKEN }}
steps:
- uses: actions/checkout@v4
- run: corepack enable
- run: corepack prepare pnpm@11.11.0 --activate
- run: pnpm install --frozen-lockfile
- name: Run component tests (Playwright)
working-directory: packages/luna-charts
run: pnpm test:browser
+2 -1
View File
@@ -2,5 +2,6 @@
"singleQuote": true, "singleQuote": true,
"semi": true, "semi": true,
"trailingComma": "es5", "trailingComma": "es5",
"printWidth": 100 "printWidth": 100,
"bracketSameLine": true
} }
+1 -3
View File
@@ -10,11 +10,9 @@ COPY . .
RUN rm -rf node_modules packages/**/node_modules RUN rm -rf node_modules packages/**/node_modules
RUN rm -f pnpm-lock.yaml
ENV PNPM_CONFIG_SUPPORTED_ARCHITECTURES="current,linux-x64-gnu" ENV PNPM_CONFIG_SUPPORTED_ARCHITECTURES="current,linux-x64-gnu"
RUN pnpm install RUN pnpm install --frozen-lockfile
WORKDIR /app/packages/luna-charts WORKDIR /app/packages/luna-charts
+8 -13
View File
@@ -50,7 +50,9 @@ luna-charts/
├── .changeset/ # Release/versioning configuration ├── .changeset/ # Release/versioning configuration
── .github/ # Community health files (Code of Conduct, etc.) ── .github/ # Community health files (Code of Conduct, etc.)
└── .gitea/ # CI workflows (Gitea Actions) and CI runner image
``` ```
## Getting Started ## Getting Started
@@ -86,19 +88,12 @@ pnpm install
| `pnpm test` | Run the full test suite (unit + component) | | `pnpm test` | Run the full test suite (unit + component) |
| `pnpm changeset` | Record a changeset for your change (required for any user-facing change) | | `pnpm changeset` | Record a changeset for your change (required for any user-facing change) |
| `pnpm run docs` | Start the documentation site locally (astroJS) | | `pnpm run docs` | Start the documentation site locally (astroJS) |
| `pnpm run lint` | Run the linter to check for code style and quality issues |
| `pnpm run format` | Run the formatter to automatically fix code style issues |
| `pnpm run test:browser` | Run browser tests (only works inside the `packages/luna-charts` directory) |
| `pnpm run storybook` | Start the storybook documentation |
### Storybook Component and browser tests run inside Docker (`docker-compose.test.yaml`), based on the same `Dockerfile.test` used to build the image CI tests against, to guarantee a reproducible browser environment — you don't need Playwright browsers installed locally. Locally this image is built on demand; in CI a prebuilt version of the same image is pulled directly (see [ADR-0002](./docs/src/content/docs/architecture/adr/000200-technology-stack.mdx) and the [Technology Architecture](./docs/src/content/docs/architecture/adm/technology-architecture.mdx#66-test-execution-environment) doc for details).
Storybook currently needs to be started from within the library package directly:
```bash
cd packages/luna-charts
pnpm run storybook
```
> **Note:** Running Storybook from the repository root isn't set up yet. This is a known gap — contributions to add a root-level `pnpm --filter` script are welcome.
Component and browser tests run inside Docker (`docker-compose.test.yaml`) to guarantee a reproducible browser environment across all contributors and CI — you don't need Playwright browsers installed locally.
## Documentation ## Documentation
@@ -150,19 +150,39 @@ LUNA Charts follows a multi-layer quality assurance model.
### 6.6 Test Execution Environment ### 6.6 Test Execution Environment
Component and browser tests (Vitest browser mode, see ADR-0002) run inside a **containerized Playwright environment** rather than directly on contributor or CI host machines. Component and browser tests (Vitest browser mode, see ADR-0002) run inside
a **containerized Playwright environment** rather than directly on
contributor or CI host machines.
#### Characteristics #### Characteristics
- A dedicated `Dockerfile.test`, based on the official Playwright container image, provides a reproducible browser environment with pinned browser versions - A dedicated `Dockerfile.test`, based on the official Playwright container
- `docker-compose.test.yaml` orchestrates the test execution, isolating dependencies from the host system image, provides a reproducible browser environment with pinned browser
- The same containerized environment is used locally by contributors and in Continuous Integration, avoiding "works on my machine" discrepancies caused by differing local Playwright/browser installations versions
- Locally, `docker-compose.test.yaml` builds this image from source and
orchestrates test execution, isolating dependencies from the host system
- In Continuous Integration, the same `Dockerfile.test` is built and
pushed to the project's container registry out-of-band (tagged by
Playwright version, e.g. `luna-charts-test:v1.62.1`); CI jobs pull this
prebuilt image directly rather than rebuilding it on every run, then
check out the current commit and install dependencies inside the running
container before executing tests
- `Dockerfile.test` remains the single source of truth for the test
environment definition in both cases — only *when* the image is built
(on demand locally, ahead of time for CI) differs
#### Rationale #### Rationale
- Ensures deterministic, reproducible accessibility and browser test results independent of the host operating system - Ensures deterministic, reproducible accessibility and browser test
- Removes the need for contributors to install and maintain matching Playwright browser binaries locally results independent of the host operating system
- Aligns automated testing (Section 6.16.4) with a single, version-controlled execution environment - Removes the need for contributors to install and maintain matching
Playwright browser binaries locally
- Avoids rebuilding the Playwright/browser image on every CI run, which
would otherwise require Docker-in-Docker access inside the CI runner —
significant infrastructure complexity for a single-service image build
- Aligns automated testing (Section 6.16.4) with a single,
version-controlled execution environment definition, even though the
build trigger differs between local development and CI
## 7. Release & Distribution Model ## 7. Release & Distribution Model
@@ -255,4 +275,32 @@ Component and browser tests are executed inside a Docker-based Playwright enviro
**Impact** **Impact**
This clarifies an already-implemented part of the testing strategy (Section 6) and does not change any other architectural decision in this document. This clarifies an already-implemented part of the testing strategy (Section 6) and does not change any other architectural decision in this document.
### 2026-08-04 CI uses a prebuilt test image instead of rebuilding per run
**Reason**
The initial implementation of Section 6.6 assumed CI would build
`Dockerfile.test` fresh on every run, identical to local execution. In
practice, this required Docker-in-Docker access inside the CI runner
purely to build a single-service image — disproportionate operational
complexity (privileged sidecar container, custom pod networking,
runner-level configuration) for the orchestration value actually needed,
since `docker-compose.test.yaml` defines only one service with no
inter-service dependencies.
**Changes**
- Section 6.6 updated to describe the actual CI flow: `Dockerfile.test` is
built and pushed to the registry out-of-band (not on every CI run), and
CI jobs pull the prebuilt image, then check out the current commit and
install dependencies at runtime
- Clarified that `Dockerfile.test` remains the single source of truth for
the test environment definition; only the build trigger differs between
local and CI usage
**Impact**
No other architectural decision in this document is affected. Local
component testing (`pnpm test:component`) is unchanged.
@@ -235,4 +235,90 @@ During implementation, Jest was replaced with Vitest as the unit testing tool. S
**Impact** **Impact**
Playwright remains part of the technology stack, but its architectural role changes from an independent browser test runner to the browser engine used by Vitest. No other decisions in this ADR are affected. Playwright remains part of the technology stack, but its architectural role changes from an independent browser test runner to the browser engine used by Vitest. No other decisions in this ADR are affected.
### 2026-08-03 Continuous Integration: GitHub Actions replaced with Gitea Actions
**Reason**
During implementation, the project moved to a self-hosted Gitea instance
with Gitea Actions (`act_runner`) instead of GitHub Actions. The ADR's
"Considered Alternatives" and "Decision" tables still listed GitHub
Actions, which no longer matched the actual CI/CD tooling in use.
**Changes**
- "Considered Alternatives" table: `Continuous Integration` row updated —
considered alternatives changed to *GitHub Actions, GitLab CI, Azure
Pipelines, Gitea Actions*; selected technology changed to **Gitea
Actions**
- "Decision" table: **GitHub Actions** entry replaced with **Gitea
Actions**
- "Rationale" section: `GitHub Actions` subsection replaced with `Gitea
Actions`, noting that workflows run on a self-hosted `act_runner`
(Docker-in-Docker mode) against the project's own Gitea instance
**Impact**
Only the Continuous Integration technology choice is affected. Workflow
syntax remains GitHub-Actions-compatible (Gitea Actions is designed to be
largely compatible with the GitHub Actions workflow format), so no other
architectural decisions in this ADR are impacted.
### 2026-08-04 Component test CI execution: prebuilt image instead of Docker-in-Docker
**Reason**
Component tests run inside a container built from `Dockerfile.test`
(based on the official Playwright image). Running this build step inside
every CI job would require Docker-in-Docker (DinD) access on the
self-hosted Gitea Actions runner — a privileged sidecar container, custom
pod networking, and runner-level configuration — solely to build a
single-service image with no inter-service orchestration need.
**Considered Alternatives**
| Alternative | Description |
| ----------- | ----------- |
| Build `Dockerfile.test` fresh on every CI run (DinD) | Mirrors the local `docker compose up --build` flow exactly inside a DinD-enabled CI job. |
| Replicate `Dockerfile.test`'s steps directly as CI workflow steps, using the public Playwright image | Avoids Docker entirely in CI, but duplicates the test environment definition in two places (`Dockerfile.test` and the workflow YAML), risking drift between local and CI environments. |
| **Build and push `Dockerfile.test` out-of-band, pull the prebuilt image in CI (selected)** | `Dockerfile.test` remains the only definition of the test environment; the resulting image is built and pushed to the registry separately (tagged by Playwright version), and CI jobs simply pull it and run tests — no Docker access needed at test time. |
Building fresh on every run was rejected due to the disproportionate DinD
infrastructure complexity for a single-service build. Replicating the
steps in the workflow file was rejected because it reintroduces a second,
manually-synchronized source of truth for the test environment.
**Decision**
`Dockerfile.test` is built and pushed to the project's container registry
out-of-band (not as part of the CI pipeline), tagged by Playwright
version (e.g. `luna-charts-test:v1.62.1`). The `component-tests` CI job
pulls this prebuilt image directly, checks out the current commit, and
runs the test command — no Docker access is required inside the CI job
container.
**Consequences**
*Positive*
- `Dockerfile.test` remains the single source of truth for the test
environment definition
- No Docker-in-Docker, privileged containers, or custom pod networking
required in the CI job itself
- Faster, simpler `component-tests` job
*Negative*
- The test image must be rebuilt and pushed manually (or via a separate,
intentionally-triggered process) whenever `Dockerfile.test` changes;
forgetting this step means CI runs against a stale image
- This is considered an acceptable trade-off given how infrequently
`Dockerfile.test` changes, versus the ongoing operational cost of
maintaining DinD access in the runner
**Impact**
Local component testing (`pnpm test:component` via Docker Compose) is
unaffected — it continues to build `Dockerfile.test` fresh via
`docker-compose.test.yaml`. Only the CI-side image sourcing changes.
+30 -4
View File
@@ -1,8 +1,34 @@
// For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format // For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format
import storybook from "eslint-plugin-storybook"; import storybook from "eslint-plugin-storybook";
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import js from '@eslint/js'; export default [
{
ignores: [
"**/dist/**",
"**/www/**",
"**/node_modules/**",
"**/.stencil/**",
"**/loader/**",
],
},
export default [js.configs.recommended, { js.configs.recommended,
ignores: ['**/dist/**', '**/www/**', '**/node_modules/**', '**/.stencil/**'],
}, ...storybook.configs["flat/recommended"]]; ...tseslint.configs.recommended,
...storybook.configs["flat/recommended"],
{
files: ["**/*.tsx"],
rules: {
"@typescript-eslint/no-unused-vars": [
"error",
{
varsIgnorePattern: "^h$",
},
],
},
},
];
+8 -2
View File
@@ -5,11 +5,13 @@
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"docs": "pnpm --filter docs run dev", "docs": "pnpm --filter docs run dev",
"lint": "eslint .", "lint": "pnpm --filter luna-charts run lint",
"format": "prettier --write .", "format": "prettier --write .",
"format:check": "pnpm --filter luna-charts run format:check",
"changeset": "changeset", "changeset": "changeset",
"version": "changeset version", "version": "changeset version",
"release": "changeset publish", "release": "changeset publish",
"storybook": "pnpm --filter luna-charts run storybook",
"test:unit": "pnpm --filter luna-charts test:unit", "test:unit": "pnpm --filter luna-charts test:unit",
"test:component": "docker compose -f docker-compose.test.yaml up --build --abort-on-container-exit --exit-code-from test", "test:component": "docker compose -f docker-compose.test.yaml up --build --abort-on-container-exit --exit-code-from test",
"test": "pnpm test:unit && pnpm test:component" "test": "pnpm test:unit && pnpm test:component"
@@ -31,7 +33,11 @@
"type": "module", "type": "module",
"devDependencies": { "devDependencies": {
"@changesets/cli": "^2.31.0", "@changesets/cli": "^2.31.0",
"@eslint/js": "^10.0.1",
"eslint": "^10.6.0", "eslint": "^10.6.0",
"prettier": "^3.9.4" "eslint-config-prettier": "^10.1.8",
"eslint-plugin-storybook": "10.5.0",
"prettier": "^3.9.4",
"typescript-eslint": "^8.65.0"
} }
} }
+1 -1
View File
@@ -6,4 +6,4 @@ const config = {
}, },
}; };
export default config; export default config;
+1 -1
View File
@@ -12,4 +12,4 @@ defineCustomElements();
* Loads and registers component metadata for Storybook. * Loads and registers component metadata for Storybook.
* This enables automatic generation of props, methods, events, slots, shadow parts, and CSS variables tables. * This enables automatic generation of props, methods, events, slots, shadow parts, and CSS variables tables.
*/ */
setCustomElementsManifest(customElements); setCustomElementsManifest(customElements);
+3 -4
View File
@@ -1,4 +1,3 @@
/** /**
* This is an autogenerated file created by the Stencil compiler. * This is an autogenerated file created by the Stencil compiler.
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
@@ -29,7 +28,7 @@ interface ComponentCompilerTypeReference {
* - globally * - globally
* - by importing it into a file (and is defined elsewhere) * - by importing it into a file (and is defined elsewhere)
*/ */
location: "local" | "global" | "import"; location: 'local' | 'global' | 'import';
/** /**
* The path to the type reference, if applicable (global types should not need a path associated with them) * The path to the type reference, if applicable (global types should not need a path associated with them)
*/ */
@@ -152,7 +151,7 @@ export interface JsonDocsComponent {
/** /**
* The encapsulation strategy for a component * The encapsulation strategy for a component
*/ */
encapsulation: "shadow" | "scoped" | "none"; encapsulation: 'shadow' | 'scoped' | 'none';
/** /**
* The tag name for the component, for use in HTML * The tag name for the component, for use in HTML
*/ */
@@ -467,7 +466,7 @@ export interface StyleDoc {
* Used to inform Stencil where the start of a new property's description starts (and where the previous description * Used to inform Stencil where the start of a new property's description starts (and where the previous description
* ends). * ends).
*/ */
annotation: "prop"; annotation: 'prop';
/** /**
* The Stencil style-mode that is associated with this property. * The Stencil style-mode that is associated with this property.
*/ */
+1 -1
View File
@@ -107,4 +107,4 @@
} }
], ],
"typeLibrary": {} "typeLibrary": {}
} }
+3
View File
@@ -32,6 +32,9 @@
"loader/" "loader/"
], ],
"scripts": { "scripts": {
"lint": "eslint .",
"format:check": "prettier --check .",
"format": "prettier --write .",
"build": "stencil build", "build": "stencil build",
"start": "stencil build --dev --watch --serve", "start": "stencil build --dev --watch --serve",
"test": "stencil-test --prod", "test": "stencil-test --prod",
+2 -6
View File
@@ -95,11 +95,7 @@ function App() {
return ( return (
<> <>
<div> <div>
<my-component <my-component first="Stencil" middle="'Don't call me a framework'" last="JS"></my-component>
first="Stencil"
middle="'Don't call me a framework'"
last="JS"
></my-component>
</div> </div>
</> </>
); );
@@ -108,4 +104,4 @@ function App() {
export default App; export default App;
``` ```
Check out this [Live Demo](https://stackblitz.com/edit/vitejs-vite-b6zuds?file=src%2FApp.tsx). Check out this [Live Demo](https://stackblitz.com/edit/vitejs-vite-b6zuds?file=src%2FApp.tsx).
+52 -52
View File
@@ -1,68 +1,68 @@
/* eslint-disable */
/* tslint:disable */ /* tslint:disable */
/** /**
* This is an autogenerated file created by the Stencil compiler. * This is an autogenerated file created by the Stencil compiler.
* It contains typing information for all components that exist in this project. * It contains typing information for all components that exist in this project.
*/ */
import { HTMLStencilElement, JSXBase } from "@stencil/core/internal"; import { HTMLStencilElement, JSXBase } from '@stencil/core/internal';
export namespace Components { export namespace Components {
interface MyComponent { interface MyComponent {
/** /**
* The first name * The first name
*/ */
"first"?: string; first?: string;
/** /**
* The last name * The last name
*/ */
"last"?: string; last?: string;
/** /**
* The middle name * The middle name
*/ */
"middle"?: string; middle?: string;
} }
} }
declare global { declare global {
interface HTMLMyComponentElement extends Components.MyComponent, HTMLStencilElement { interface HTMLMyComponentElement extends Components.MyComponent, HTMLStencilElement {}
} var HTMLMyComponentElement: {
var HTMLMyComponentElement: { prototype: HTMLMyComponentElement;
prototype: HTMLMyComponentElement; new (): HTMLMyComponentElement;
new (): HTMLMyComponentElement; };
}; interface HTMLElementTagNameMap {
interface HTMLElementTagNameMap { 'my-component': HTMLMyComponentElement;
"my-component": HTMLMyComponentElement; }
}
} }
declare namespace LocalJSX { declare namespace LocalJSX {
interface MyComponent { interface MyComponent {
/** /**
* The first name * The first name
*/ */
"first"?: string; first?: string;
/** /**
* The last name * The last name
*/ */
"last"?: string; last?: string;
/** /**
* The middle name * The middle name
*/ */
"middle"?: string; middle?: string;
} }
interface MyComponentAttributes { interface MyComponentAttributes {
"first": string; first: string;
"middle": string; middle: string;
"last": string; last: string;
} }
interface IntrinsicElements { interface IntrinsicElements {
"my-component": Omit<MyComponent, keyof MyComponentAttributes> & { [K in keyof MyComponent & keyof MyComponentAttributes]?: MyComponent[K] } & { [K in keyof MyComponent & keyof MyComponentAttributes as `attr:${K}`]?: MyComponentAttributes[K] } & { [K in keyof MyComponent & keyof MyComponentAttributes as `prop:${K}`]?: MyComponent[K] }; 'my-component': Omit<MyComponent, keyof MyComponentAttributes> & { [K in keyof MyComponent & keyof MyComponentAttributes]?: MyComponent[K] } & {
} [K in keyof MyComponent & keyof MyComponentAttributes as `attr:${K}`]?: MyComponentAttributes[K];
} & { [K in keyof MyComponent & keyof MyComponentAttributes as `prop:${K}`]?: MyComponent[K] };
}
} }
export { LocalJSX as JSX }; export { LocalJSX as JSX };
declare module "@stencil/core" { declare module '@stencil/core' {
export namespace JSX { export namespace JSX {
interface IntrinsicElements { interface IntrinsicElements {
"my-component": LocalJSX.IntrinsicElements["my-component"] & JSXBase.HTMLAttributes<HTMLMyComponentElement>; 'my-component': LocalJSX.IntrinsicElements['my-component'] & JSXBase.HTMLAttributes<HTMLMyComponentElement>;
}
} }
}
} }
@@ -26,7 +26,7 @@ export const Primary: Story = {
last: 'Doe', last: 'Doe',
middle: 'Michael', middle: 'Michael',
}, },
render: (props) => <my-component {...props} />, render: props => <my-component {...props} />,
}; };
/** /**
@@ -38,4 +38,4 @@ export const Secondary: Story = {
last: 'Smith', last: 'Smith',
middle: 'Marie', middle: 'Marie',
}, },
}; };
@@ -1,10 +1,7 @@
# my-component # my-component
<!-- Auto Generated Below --> <!-- Auto Generated Below -->
## Properties ## Properties
| Property | Attribute | Description | Type | Default | | Property | Attribute | Description | Type | Default |
@@ -13,7 +10,6 @@
| `last` | `last` | The last name | `string \| undefined` | `undefined` | | `last` | `last` | The last name | `string \| undefined` | `undefined` |
| `middle` | `middle` | The middle name | `string \| undefined` | `undefined` | | `middle` | `middle` | The middle name | `string \| undefined` | `undefined` |
---
---------------------------------------------- _Built with [StencilJS](https://stenciljs.com/)_
*Built with [StencilJS](https://stenciljs.com/)*
+1 -1
View File
@@ -1,4 +1,4 @@
<!DOCTYPE html> <!doctype html>
<html dir="ltr" lang="en"> <html dir="ltr" lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
@@ -9,13 +9,13 @@ export const axeCoreChecker: A11yChecker = {
return { return {
checkerName: 'axe-core', checkerName: 'axe-core',
violations: results.violations.map((violations) => ({ violations: results.violations.map(violations => ({
id: violations.id, id: violations.id,
impact: violations.impact ?? null, impact: violations.impact ?? null,
description: violations.help, description: violations.help,
helpUrl: violations.helpUrl, helpUrl: violations.helpUrl,
nodes: violations.nodes.map((node) => node.target.join(' ')), nodes: violations.nodes.map(node => node.target.join(' ')),
})), })),
}; };
}, },
}; };
@@ -14,4 +14,4 @@ export interface A11yCheckResult {
export interface A11yChecker { export interface A11yChecker {
name: string; name: string;
run(root: Element): Promise<A11yCheckResult>; run(root: Element): Promise<A11yCheckResult>;
} }
@@ -1,12 +1,10 @@
import type { A11yChecker, A11yCheckResult } from './checkers/types'; import type { A11yChecker, A11yCheckResult } from './checkers/types';
import { axeCoreChecker } from './checkers/axe-core.checker'; import { axeCoreChecker } from './checkers/axe-core.checker';
const a11yCheckerRegistry: A11yChecker[] = [ const a11yCheckerRegistry: A11yChecker[] = [axeCoreChecker];
axeCoreChecker,
];
export async function runA11yChecks(rootElement: Element): Promise<A11yCheckResult[]> { export async function runA11yChecks(rootElement: Element): Promise<A11yCheckResult[]> {
return Promise.all(a11yCheckerRegistry.map((a11yChecker) => a11yChecker.run(rootElement))); return Promise.all(a11yCheckerRegistry.map(a11yChecker => a11yChecker.run(rootElement)));
} }
export type { A11yChecker, A11yCheckResult, A11yViolation } from './checkers/types'; export type { A11yChecker, A11yCheckResult, A11yViolation } from './checkers/types';
@@ -3,7 +3,7 @@ import type { A11yCheckResult } from './checkers/types';
expect.extend({ expect.extend({
toHaveNoA11yViolations(results: A11yCheckResult[]) { toHaveNoA11yViolations(results: A11yCheckResult[]) {
const failing = results.filter((results) => results.violations.length > 0); const failing = results.filter(results => results.violations.length > 0);
if (failing.length === 0) { if (failing.length === 0) {
return { return {
@@ -14,11 +14,9 @@ expect.extend({
const message = failing const message = failing
.map( .map(
(results) => results =>
`[${results.checkerName}] ${results.violations.length} violation(s):\n` + `[${results.checkerName}] ${results.violations.length} violation(s):\n` +
results.violations results.violations.map(validation => ` - ${validation.id} (${validation.impact}): ${validation.description}\n affected: ${validation.nodes.join(', ')}`).join('\n'),
.map((validation) => ` - ${validation.id} (${validation.impact}): ${validation.description}\n affected: ${validation.nodes.join(', ')}`)
.join('\n')
) )
.join('\n\n'); .join('\n\n');
@@ -33,4 +31,4 @@ declare module 'vitest' {
interface Assertion { interface Assertion {
toHaveNoA11yViolations(): void; toHaveNoA11yViolations(): void;
} }
} }
+4 -13
View File
@@ -5,10 +5,7 @@
"allowUnreachableCode": false, "allowUnreachableCode": false,
"declaration": false, "declaration": false,
"experimentalDecorators": true, "experimentalDecorators": true,
"lib": [ "lib": ["dom", "es2022"],
"dom",
"es2022"
],
"moduleResolution": "bundler", "moduleResolution": "bundler",
"module": "esnext", "module": "esnext",
"target": "es2022", "target": "es2022",
@@ -18,14 +15,8 @@
"jsx": "react", "jsx": "react",
"jsxFactory": "h", "jsxFactory": "h",
"jsxFragmentFactory": "h.Fragment", "jsxFragmentFactory": "h.Fragment",
"types": [ "types": ["@stencil/vitest/globals"]
"@stencil/vitest/globals"
]
}, },
"include": [ "include": ["src"],
"src" "exclude": ["node_modules"]
],
"exclude": [
"node_modules"
]
} }
+2 -2
View File
@@ -1,4 +1,4 @@
import { defineCustomElements } from "./loader"; import { defineCustomElements } from './loader';
import './src/testing/a11y/matchers'; import './src/testing/a11y/matchers';
defineCustomElements(); defineCustomElements();
+121
View File
@@ -210,12 +210,24 @@ importers:
'@changesets/cli': '@changesets/cli':
specifier: ^2.31.0 specifier: ^2.31.0
version: 2.31.1(@types/node@24.13.3) version: 2.31.1(@types/node@24.13.3)
'@eslint/js':
specifier: ^10.0.1
version: 10.0.1(eslint@10.8.0(jiti@2.7.0))
eslint: eslint:
specifier: ^10.6.0 specifier: ^10.6.0
version: 10.8.0(jiti@2.7.0) version: 10.8.0(jiti@2.7.0)
eslint-config-prettier:
specifier: ^10.1.8
version: 10.1.8(eslint@10.8.0(jiti@2.7.0))
eslint-plugin-storybook:
specifier: 10.5.0
version: 10.5.0(eslint@10.8.0(jiti@2.7.0))(storybook@10.5.5(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(typescript@5.9.3)
prettier: prettier:
specifier: ^3.9.4 specifier: ^3.9.4
version: 3.9.6 version: 3.9.6
typescript-eslint:
specifier: ^8.65.0
version: 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3)
docs: docs:
dependencies: dependencies:
@@ -745,6 +757,15 @@ packages:
resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24} engines: {node: ^20.19.0 || ^22.13.0 || >=24}
'@eslint/js@10.0.1':
resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
peerDependencies:
eslint: ^10.0.0
peerDependenciesMeta:
eslint:
optional: true
'@eslint/object-schema@3.0.5': '@eslint/object-schema@3.0.5':
resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24} engines: {node: ^20.19.0 || ^22.13.0 || >=24}
@@ -1692,6 +1713,21 @@ packages:
'@types/unist@3.0.3': '@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
'@typescript-eslint/eslint-plugin@8.65.0':
resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.65.0
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/parser@8.65.0':
resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/project-service@8.65.0': '@typescript-eslint/project-service@8.65.0':
resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1708,6 +1744,13 @@ packages:
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/type-utils@8.65.0':
resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/types@8.65.0': '@typescript-eslint/types@8.65.0':
resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2146,6 +2189,12 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'} engines: {node: '>=12'}
eslint-config-prettier@10.1.8:
resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
eslint-plugin-storybook@10.5.0: eslint-plugin-storybook@10.5.0:
resolution: {integrity: sha512-UyhbK11baKAYqzyDUHlwDlm1aP/wxPMR0vFmsxA5984BGaPwarhoXUWng1Xa0cd9BdPbQ+zr/y8ADk6XxtwkYg==} resolution: {integrity: sha512-UyhbK11baKAYqzyDUHlwDlm1aP/wxPMR0vFmsxA5984BGaPwarhoXUWng1Xa0cd9BdPbQ+zr/y8ADk6XxtwkYg==}
peerDependencies: peerDependencies:
@@ -2445,6 +2494,10 @@ packages:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'} engines: {node: '>= 4'}
ignore@7.0.6:
resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==}
engines: {node: '>= 4'}
imurmurhash@0.1.4: imurmurhash@0.1.4:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'} engines: {node: '>=0.8.19'}
@@ -3456,6 +3509,13 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
typescript-eslint@8.65.0:
resolution: {integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
typescript@5.9.3: typescript@5.9.3:
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
@@ -4316,6 +4376,10 @@ snapshots:
dependencies: dependencies:
'@types/json-schema': 7.0.15 '@types/json-schema': 7.0.15
'@eslint/js@10.0.1(eslint@10.8.0(jiti@2.7.0))':
optionalDependencies:
eslint: 10.8.0(jiti@2.7.0)
'@eslint/object-schema@3.0.5': {} '@eslint/object-schema@3.0.5': {}
'@eslint/plugin-kit@0.7.2': '@eslint/plugin-kit@0.7.2':
@@ -5068,6 +5132,34 @@ snapshots:
'@types/unist@3.0.3': {} '@types/unist@3.0.3': {}
'@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
'@typescript-eslint/parser': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.65.0
'@typescript-eslint/type-utils': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3)
'@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.65.0
eslint: 10.8.0(jiti@2.7.0)
ignore: 7.0.6
natural-compare: 1.4.0
ts-api-utils: 2.5.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3)':
dependencies:
'@typescript-eslint/scope-manager': 8.65.0
'@typescript-eslint/types': 8.65.0
'@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.65.0
debug: 4.4.3
eslint: 10.8.0(jiti@2.7.0)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/project-service@8.65.0(typescript@5.9.3)': '@typescript-eslint/project-service@8.65.0(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3)
@@ -5086,6 +5178,18 @@ snapshots:
dependencies: dependencies:
typescript: 5.9.3 typescript: 5.9.3
'@typescript-eslint/type-utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3)':
dependencies:
'@typescript-eslint/types': 8.65.0
'@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3)
'@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3)
debug: 4.4.3
eslint: 10.8.0(jiti@2.7.0)
ts-api-utils: 2.5.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/types@8.65.0': {} '@typescript-eslint/types@8.65.0': {}
'@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3)': '@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3)':
@@ -5622,6 +5726,10 @@ snapshots:
escape-string-regexp@5.0.0: {} escape-string-regexp@5.0.0: {}
eslint-config-prettier@10.1.8(eslint@10.8.0(jiti@2.7.0)):
dependencies:
eslint: 10.8.0(jiti@2.7.0)
eslint-plugin-storybook@10.5.0(eslint@10.8.0(jiti@2.7.0))(storybook@10.5.5(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(typescript@5.9.3): eslint-plugin-storybook@10.5.0(eslint@10.8.0(jiti@2.7.0))(storybook@10.5.5(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(typescript@5.9.3):
dependencies: dependencies:
'@typescript-eslint/types': 8.65.0 '@typescript-eslint/types': 8.65.0
@@ -6083,6 +6191,8 @@ snapshots:
ignore@5.3.2: {} ignore@5.3.2: {}
ignore@7.0.6: {}
imurmurhash@0.1.4: {} imurmurhash@0.1.4: {}
indent-string@4.0.0: {} indent-string@4.0.0: {}
@@ -7468,6 +7578,17 @@ snapshots:
dependencies: dependencies:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
typescript-eslint@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3):
dependencies:
'@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3)
'@typescript-eslint/parser': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3)
'@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3)
'@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@5.9.3)
eslint: 10.8.0(jiti@2.7.0)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
typescript@5.9.3: {} typescript@5.9.3: {}
ufo@1.6.4: {} ufo@1.6.4: {}