diff --git a/.agents/skills/monitor-ci/SKILL.md b/.agents/skills/monitor-ci/SKILL.md index 48b71bf..ad1bbc9 100644 --- a/.agents/skills/monitor-ci/SKILL.md +++ b/.agents/skills/monitor-ci/SKILL.md @@ -111,7 +111,7 @@ The decision script returns one of the following statuses. This table defines th | `cipe_canceled` | Exit, CI was canceled | | `cipe_timed_out` | Exit, CI timed out | | `polling_timeout` | Exit, polling timeout reached | -| `circuit_breaker` | Exit, no progress after 5 consecutive polls | +| `circuit_breaker` | Exit, no progress after 13 consecutive polls | | `environment_rerun_cap` | Exit, environment reruns exhausted | | `fix_auto_applying` | Self-healing is handling it — just record `last_cipe_url`, enter wait mode. No MCP call or local git ops needed. | | `error` | Wait 60s and loop | @@ -143,7 +143,7 @@ The decision script returns one of the following statuses. This table defines th ``` cycle_count = 0 # Only incremented for agent-initiated cycles (counted against --max-cycles) -start_time = now() +start_time = now() # Passed to the decision script as --elapsed-seconds on every poll to enforce --timeout across attempts no_progress_count = 0 local_verify_count = 0 env_rerun_count = 0 @@ -180,8 +180,9 @@ node /scripts/ci-poll-decide.mjs '' ] \ [--expected-sha ] \ [--prev-status ] \ - [--timeout ] \ - [--new-cipe-timeout ] \ + [--timeout ] \ + [--new-cipe-timeout ] \ + [--elapsed-seconds ] \ [--env-rerun-count ] \ [--no-progress-count ] \ [--prev-cipe-status ] \ @@ -190,6 +191,8 @@ node /scripts/ci-poll-decide.mjs '' ] ``` +Pass `--timeout` and `--new-cipe-timeout` in **minutes** (the values from Configuration Defaults) — the script converts to seconds internally. Pass `--elapsed-seconds` as the whole seconds elapsed since `start_time` (`now() - start_time`); this is what enforces `--timeout` as a **total** monitor budget across every poll and attempt, so it must be supplied on every call once monitoring has started. + The script outputs a single JSON line: `{ action, code, message, delay?, noProgressCount, envRerunCount, fields?, newCipeDetected?, verifiableTaskIds? }` #### 2c. Process script output @@ -262,9 +265,10 @@ node /scripts/ci-state-update.mjs cycle-check \ --env-rerun-count ``` -The script returns `{ cycleCount, agentTriggered, envRerunCount, approachingLimit, message }`. Update tracking state from the output. +The script returns `{ cycleCount, agentTriggered, envRerunCount, approachingLimit, limitReached, message }`. Update tracking state from the output. -- If `approachingLimit` → ask user whether to continue (with 5 or 10 more cycles) or stop monitoring +- If `limitReached` → the `--max-cycles` budget is exhausted. Print `message` and **stop monitoring** (do not handle the code or start another cycle). This is a hard stop, not advisory. +- Else if `approachingLimit` → ask user whether to continue (with 5 or 10 more cycles) or stop monitoring - If previous cycle was NOT agent-triggered (human pushed), log that human-initiated push was detected #### Progress Tracking diff --git a/.agents/skills/monitor-ci/scripts/ci-poll-decide.mjs b/.agents/skills/monitor-ci/scripts/ci-poll-decide.mjs index 3fe17e5..15190eb 100644 --- a/.agents/skills/monitor-ci/scripts/ci-poll-decide.mjs +++ b/.agents/skills/monitor-ci/scripts/ci-poll-decide.mjs @@ -13,10 +13,15 @@ * Usage: * node ci-poll-decide.mjs '' \ * [--wait-mode] [--prev-cipe-url ] [--expected-sha ] \ - * [--prev-status ] [--timeout ] [--new-cipe-timeout ] \ - * [--env-rerun-count ] [--no-progress-count ] \ + * [--prev-status ] [--timeout ] [--new-cipe-timeout ] \ + * [--elapsed-seconds ] [--env-rerun-count ] [--no-progress-count ] \ * [--prev-cipe-status ] [--prev-sh-status ] \ * [--prev-verification-status ] [--prev-failure-classification ] + * + * Note: --timeout and --new-cipe-timeout are accepted in MINUTES (matching the + * skill's documented flags) and converted to seconds internally. --elapsed-seconds + * is the wall-clock time since monitoring began, carried across attempts by the + * orchestrator, and is the authoritative signal for the --timeout budget. */ // --- Arg parsing --- @@ -39,8 +44,14 @@ const waitMode = getFlag('--wait-mode'); const prevCipeUrl = getArg('--prev-cipe-url'); const expectedSha = getArg('--expected-sha'); const prevStatus = getArg('--prev-status'); -const timeoutSeconds = parseInt(getArg('--timeout') || '0', 10); -const newCipeTimeoutSeconds = parseInt(getArg('--new-cipe-timeout') || '0', 10); +// Flags are documented in minutes; convert to seconds for internal comparison. +const timeoutSeconds = parseInt(getArg('--timeout') || '0', 10) * 60; +const newCipeTimeoutSeconds = + parseInt(getArg('--new-cipe-timeout') || '0', 10) * 60; +// Wall-clock seconds since monitoring began (carried across attempts); null when +// the orchestrator doesn't supply it (see isTimedOut for that fallback). +const elapsedArg = getArg('--elapsed-seconds'); +const elapsedSeconds = elapsedArg !== null ? parseInt(elapsedArg, 10) : null; const envRerunCount = parseInt(getArg('--env-rerun-count') || '0', 10); const inputNoProgressCount = parseInt(getArg('--no-progress-count') || '0', 10); const prevCipeStatus = getArg('--prev-cipe-status'); @@ -106,7 +117,7 @@ function categorizeTasks() { } function backoff(count) { - const delays = [60, 90, 120]; + const delays = [60, 90, 120, 180]; return delays[Math.min(count, delays.length - 1)]; } @@ -125,6 +136,11 @@ function hasStateChanged() { function isTimedOut() { if (timeoutSeconds <= 0) return false; + // Prefer real wall-clock elapsed (carried across attempts) so --timeout caps + // total monitor duration, not a single invocation. + if (elapsedSeconds !== null && !Number.isNaN(elapsedSeconds)) + return elapsedSeconds >= timeoutSeconds; + // Fallback: estimate elapsed from poll cadence within this invocation. const avgDelay = pollCount === 0 ? 0 : backoff(Math.floor(pollCount / 2)); return pollCount * avgDelay >= timeoutSeconds; } @@ -153,7 +169,7 @@ function isNewCipe() { // 3. still waiting → wait (waiting_for_cipe) // NORMAL MODE: // 4. polling timeout → done (polling_timeout) -// 5. circuit breaker (5 polls) → done (circuit_breaker) +// 5. circuit breaker (13 polls) → done (circuit_breaker) // 6. CI succeeded → done (ci_success) // 7. CI canceled → done (cipe_canceled) // 8. CI timed out → done (cipe_timed_out) @@ -179,13 +195,17 @@ function classify() { // --- Wait mode --- if (waitMode) { if (isNewCipe()) return { action: 'poll', code: 'new_cipe_detected' }; + // The total --timeout budget also caps time spent waiting for a new CI + // Attempt, so it must win over --new-cipe-timeout here; otherwise a long + // wait (or a sequence of apply→wait cycles) could run past --timeout. + if (isTimedOut()) return { action: 'done', code: 'polling_timeout' }; if (isWaitTimedOut()) return { action: 'done', code: 'no_new_cipe' }; return { action: 'wait', code: 'waiting_for_cipe' }; } // --- Guards --- if (isTimedOut()) return { action: 'done', code: 'polling_timeout' }; - if (noProgressCount >= 5) return { action: 'done', code: 'circuit_breaker' }; + if (noProgressCount >= 13) return { action: 'done', code: 'circuit_breaker' }; // --- Terminal CI states --- if (cipeStatus === 'SUCCEEDED') return { action: 'done', code: 'ci_success' }; @@ -300,7 +320,7 @@ const messages = { // guards polling_timeout: () => 'Polling timeout exceeded.', - circuit_breaker: () => 'No progress after 5 consecutive polls. Stopping.', + circuit_breaker: () => 'No progress after 13 consecutive polls. Stopping.', // terminal ci_success: () => 'CI passed successfully!', diff --git a/.agents/skills/monitor-ci/scripts/ci-state-update.mjs b/.agents/skills/monitor-ci/scripts/ci-state-update.mjs index 90fa714..6ab4125 100644 --- a/.agents/skills/monitor-ci/scripts/ci-state-update.mjs +++ b/.agents/skills/monitor-ci/scripts/ci-state-update.mjs @@ -129,7 +129,9 @@ function cycleCheck() { // Reset env_rerun_count on non-environment status if (status !== 'environment_issue') envRerunCount = 0; - // Approaching limit gate + // Cycle limit gates. limitReached is a terminal stop; approachingLimit is an + // advisory warning emitted in the two cycles before the cap. + const limitReached = cycleCount >= maxCycles; const approachingLimit = cycleCount >= maxCycles - 2; output({ @@ -137,7 +139,10 @@ function cycleCheck() { agentTriggered: false, envRerunCount, approachingLimit, - message: approachingLimit + limitReached, + message: limitReached + ? `Cycle limit reached (${cycleCount}/${maxCycles}). Stopping.` + : approachingLimit ? `Approaching cycle limit (${cycleCount}/${maxCycles})` : null, }); diff --git a/.agents/skills/nx-cloud-api/SKILL.md b/.agents/skills/nx-cloud-api/SKILL.md new file mode 100644 index 0000000..0e48db6 --- /dev/null +++ b/.agents/skills/nx-cloud-api/SKILL.md @@ -0,0 +1,193 @@ +--- +name: nx-cloud-api +description: Query the read-only Nx Cloud Public API for workspace data with `npx nx-cloud api`. Use this skill when a user asks to inspect or retrieve CIPEs, pipelines, run groups, runs, tasks, workflows, agents, task statistics, flaky tasks, cache data, or API endpoint details. Use this skill before any Nx Cloud API call. It covers endpoint discovery, link navigation, pagination, asset downloads, and error recovery. Do not use it for live CI monitoring. +--- + +# Nx Cloud API + +Answer a defined workspace-data question with `npx nx-cloud api`, the read-only +Nx Cloud Public API command. This is an API access skill, not a report generator +or configuration editor. Run every command from the workspace root so the +command finds `nx.json`. + +Run `npx nx-cloud api --help` (or `npx nx-cloud api` alone) once for syntax and +options. This skill covers the workflow around it. + +All output is JSON. stdout carries only the response data. stderr carries one +JSON object per line: `{"error": ...}`, `{"output": ...}`, and, with `-i` or +`NX_VERBOSE_LOGGING`, `{"response": ...}` and `{"log": ...}`. The one exception +is an asset download, whose raw bytes go to the `-o` file. + +## Non-negotiable rules + +- Discover endpoints from the live spec. Use `npx nx-cloud api --list-operations` + to find a route and `npx nx-cloud api --describe ` + for its parameters, response fields, and error statuses. Both show what an + operation `returns`: `list` (the wrapped list below), `object` (the response + body), or `file` (an asset download). Do not use + remembered routes, fields, filter names, or enum values. +- Start at `cipes` and follow returned `links` values. Do not build child URLs by + hand or use an internal workflow ID as a route parameter. When you must + address an entity by ID, use the `{placeholder}` path from `--describe` and + fill it with `-p name=value`. Never paste an ID into a path: IDs are raw and + can contain `/` or `:` (task IDs like `@scope/app:build`). +- Start with one filtered page. Ask for a workspace, scope, or time range when + they are missing. Do not collect history by default. +- Read the operation description from `--describe`. It states server limits that + the command does not enforce. +- Do not use this skill to poll or monitor live CI. + +## Cache boundary + +The API returns recorded task and run fields. It does not query the local Nx +target. `cacheEnabled` describes the recorded run. `cacheable` describes the +recorded task. Neither value identifies `targetDefaults`, an inferred target, +or Vite, ESLint, or another tool-native cache. + +Do not infer `cache: false` from an absent project property. For cache causes, +target settings, inputs, outputs, or a configuration change, use +`nx-cloud-cache-investigator`. API data alone cannot justify a cache or inputs +pull request. + +## Quick workflow + +```sh +npx nx-cloud api --describe cipes + +# Save one bounded page to a scratch file, then project only what you need. +dir="$(mktemp -d)" +npx nx-cloud api cipes \ + -f createdAfter=2026-08-01T00:00:00Z \ + -f statuses=FAILED -f statuses=CANCELED \ + -o "$dir/cipes.json" +echo "exit $?" +jq '{pageLimitReached, nextCursor, items: [.items[] | {id, status, createdAt, links}]}' "$dir/cipes.json" + +# Follow a link from a previous response as-is. +npx nx-cloud api "" -o "$dir/next.json" + +# Address an entity by ID only through a path parameter. +npx nx-cloud api 'runs/{runId}/tasks' -p runId="$run_id" -o "$dir/tasks.json" +``` + +Pass a `links.*` value exactly as returned; it may already carry query +parameters, and `-f` adds more. Full URLs are accepted only on the configured +Nx Cloud host. That includes app links such as `https://cloud.nx.app/cipes/`, +which resolve like the bare path `cipes/`. + +## Keep API output compact + +To preserve context, write every live data response to a file with `-o` (files are created +owner-only) in a scratch directory outside the workspace. Give the file an +extension. A name without one gets `.json`, `.ndjson`, or the download's own +(such as `.tar.gz`), and the command reports the final path on stderr as +`{"output": {"file": "..."}}`. Create the scratch directory with `mktemp -d`, +and read a question-specific `jq` projection. Do not let +a raw collection print into the conversation unless the user asks for it. +Choose projected fields from `--describe`. For one row, select it first, then +project only the needed fields. Delete saved data when the task is done unless +the user asks to keep it. + +`--describe` output is usually small. Pipe it through `jq` only when you need +part of a large operation. + +## Exit codes and errors + +Always check the exit code. Every failure prints one record on stderr, and the +command adds no recovery hints; do not hide stderr with `2>/dev/null`: + +```text +{"error":{"type":"http","message":"HTTP 409 Conflict","status":409,"url":"...","body":{"code":"not_terminal","message":"..."}}} +``` + +`type` is `usage`, `http`, `network`, `response` (an answer the command cannot +use), or `output` (an unwritable `-o` file). For `http`, `body` is the server's +error body, parsed when it is JSON and absent when it is empty. Exit 4 and 5 +bodies carry a stable `code` (except 401 and an empty-body 429); branch on +`.error.body.code`, not on the prose `message`. + +| Exit | HTTP | `code` | Next action | +| ---- | ---- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 1 | — | — | Usage, network, response, or output error; read `.error.type` and `.error.message` on stderr. Fix the flags, path, or `-p` values, or check the host (`NX_CLOUD_API` or `nxCloudUrl`), proxy, and VPN. | +| 4 | 400 | `invalid_parameter` | Run `npx nx-cloud api --describe ` and fix the named parameter. Unknown query parameters are always rejected. | +| 4 | 400 | `invalid_limit`, `invalid_timestamp`, `invalid_date_range`, `invalid_filter` | Fix the value or filter combination named in `message`, using `--describe` for formats and limits. | +| 4 | 400 | `invalid_cursor` | A cursor is valid only for the list that minted it. Resume with the same path and filters, or restart without `cursor`. | +| 4 | 401 | none (`body` is plain text) | Run `npx nx-cloud login --status` from the workspace root. The command needs a personal access token from `npx nx-cloud login` with `nxCloudId` in `nx.json`, or a workspace token in `NX_CLOUD_ACCESS_TOKEN`. A stored personal access token takes precedence, so a stale one fails even when a valid workspace token is set. Run `npx nx-cloud login` only when the status check reports no usable login. | +| 4 | 403 | `plan_not_allowed` | The organization's plan does not include the Nx Cloud Public API. Tell the user; do not retry or use another person's token. | +| 4 | 404 | `not_found` | The ID in the path or in a parent-ID filter (`cipeId`, `runGroup`, `stepId`, `agentName`) is wrong. An unknown parent is never an empty result. Recheck the ID, or follow a link instead. | +| 4 | 404 | none (no `body`) | The path matched no route, usually because a raw ID containing `/` (such as `@scope/app:build`) was pasted into it. Use the `{placeholder}` path with `-p`, or follow `links`, and check the path with `--describe`. | +| 4 | 409 | `not_terminal` | The entity is still running. This is not a failure; its data is not final yet. See same-session retry below. | +| 4 | 429 | `rate_limit_exceeded` or no `body` | The organization-wide quota is exhausted. The command already retried 3 times honoring `Retry-After`. Back off, narrow filters, and make fewer requests. | +| 5 | 503 | `data_api_at_capacity`, `query_deadline_exceeded`, `audit_log_unavailable`, `rate_limit_unavailable` | No data was returned. The command already retried 3 times. Back off before one more attempt; for `query_deadline_exceeded`, narrow the time range or filters. | +| 5 | 5xx | other | Retry once after a short wait. Keep the endpoint, filters, time range, and `traceId` from the body for support. | + +`--list-operations`, `--describe`, and `--print-api-spec` do not need +credentials, so they succeed even when data requests fail with 401. + +Do not alter workspace configuration or credentials without the user's explicit +request. + +## Same-session retry + +For a 409 `not_terminal` on a known request, arrange at most one same-session +wake after the entity is expected to finish. Preserve the link and filters. +Stop at a terminal response. + +## Pagination + +Every list response is wrapped, even a single page: +`{source, pagesFetched, fetchedItemCount, pageLimitReached, nextCursor, items}`. +`source` records the origin, endpoint, and original query. Read rows with +`jq '.items[]'`. Non-list responses are returned as-is. + +The list is complete only when the exit code is 0 and `nextCursor` is `null`. +`pageLimitReached: true` means `--pages` stopped the run while more results +exist. To continue, rerun the same path and filters with +`--cursor `, or state that the data is incomplete. The output's +`source.query` records the cursor it started from. + +The command fetches one page by default. Raise `--pages` deliberately and keep +it small; prefer narrower filters over more pages. Do not fetch many +`flaky-tasks` or `task-stats` pages without a narrow filter. Leave the page size +alone unless needed: every page costs one unit of the organization's rate +limit, and `--page-size` (which sets `limit`, max 500) only helps when raised. + +If a later page fails, the command still prints what it fetched, with +`nextCursor` at the failed page, and exits 4 or 5. Handle the error, then +resume from that cursor. + +`--format ndjson` prints only the rows, one per line, with no metadata. Nothing +in its output says whether more pages exist, and it records no resume cursor. It prints each page as it is retrieved which can matter for responsiveness or very large responses. +Use it only when completeness does not matter; otherwise use the default JSON +output. + +For multi-range extraction, task or log assets, or a calculation, read +[references/extraction-and-calculation.md](references/extraction-and-calculation.md) +first. + +## Interpret responses + +Collection responses have top-level `items` and `nextCursor`. Single resources +are returned as-is. Do not infer a field meaning from its name; check +`--describe` and a live record first. + +Label cache statements by evidence source: + +- **API response field:** a recorded `cacheEnabled`, `cacheable`, cache-status, + or hash value. +- **Nx target query:** a value from `nx show project ... --json` in a matching + checkout. +- **Tool-native cache:** `Unknown` until its executor options are inspected. + +## Empty task assets + +A valid task asset can have zero-byte terminal output and no output files; +`nx:noop` commonly does. Check the matching workspace task before reporting a +log-capture or archive defect. + +## Report + +State the operations queried, filters, item counts, and whether the data is +complete. State whether a result is recorded API data, a local target query, or +a hypothesis. Never claim that an API-only read proved configuration provenance +or tool-native cache state. diff --git a/.agents/skills/nx-cloud-api/references/extraction-and-calculation.md b/.agents/skills/nx-cloud-api/references/extraction-and-calculation.md new file mode 100644 index 0000000..e83de22 --- /dev/null +++ b/.agents/skills/nx-cloud-api/references/extraction-and-calculation.md @@ -0,0 +1,83 @@ +# Large extraction, assets, and calculations + +Read this file only for more than one page, a task or log asset, or a +calculation. + +## Extraction + +1. Run `npx nx-cloud api --describe `. Use only its documented + filters. +2. Request one filtered page. Use `fetchedItemCount` and `nextCursor` to choose + a small `--pages` value, or narrower filters. +3. Split periods only with documented, non-overlapping time boundaries. +4. Run ranges in sequence. Save each range to its own file and record its exit + code. +5. Combine data only when every range exited 0 with `nextCursor: null`. + +Use the default JSON output for extraction; only it carries the completion +state and resume cursor: + +```sh +dir="$(mktemp -d)" +npx nx-cloud api task-stats \ + -f dateAfter=2026-08-01 -f dateBefore=2026-08-07 \ + -f percentiles=50 -f percentiles=95 \ + --pages 3 \ + -o "$dir/task-stats-2026-08-01.json" +echo "exit $?" +jq '{fetchedItemCount, pageLimitReached, nextCursor}' "$dir/task-stats-2026-08-01.json" +jq -c '.items[]' "$dir/task-stats-2026-08-01.json" # rows, one per line +``` + +A non-null `nextCursor` means the range is incomplete: either `--pages` stopped +it (`pageLimitReached: true`) or a later page failed (non-zero exit; the file +holds the pages fetched before the failure). To continue, rerun the same +command with `--cursor ` into a new file. Do not calculate a +complete result while any range is incomplete. Do not use `--format ndjson` for +extraction; it records neither completion state nor a resume cursor. You might want to record each +time range, filters, +file, exit code, item count, and final `nextCursor` in a manifest. + +## Assets + +Asset links (task logs, artifacts, reports) answer with a redirect; +`--describe` shows them as `returns: file`. The command downloads the target and writes the raw bytes, the only output that is +not JSON. Use `-o ` with an explicit extension such as `.tar.gz`; the +command refuses to write a download to a terminal. Encrypted +artifacts can be decrypted with `npx nx-cloud decrypt-artifact`. + +A returned asset link proves only that a route was advertised. A successful +download proves only that it resolves now. A 404 does not prove that the asset +never existed. + +Nx Cloud log and report assets are compressed binary payloads. Treat each as an +archive, not terminal text. Save it privately. Identify its format from bytes, not +the URL or file name. Decode it with a matching local tool into a second private +file. Do not stream, print, or expand it in the workspace. + +Read only the needed lines from the decoded text. Quote a redacted error signature, +not the complete log or report. + +A non-empty gzip payload can contain a valid tar archive whose terminal-output +entry is zero bytes. The artifact can also contain an empty outputs directory and +a zero-byte `terminalOutput` beside a successful exit code. This is usually not a +problem when the task writes no stdout or stderr and produces no declared output +files. An `nx:noop` target is one common example. + +Do not classify this shape as archive corruption or a log-capture defect from the +asset alone. Inspect the matching workspace task first. Check its resolved +executor, command, declared outputs, and expected terminal behavior. A matching +hash associates the archive with the task, but it does not prove that output +should exist. + +## Calculation + +Save the bounded input. Use a script that: + +1. Reads the saved JSON (rows in `.items`). +2. States fields, filters, time range, and formula in a code comment. +3. Prints machine-readable JSON before prose. +4. Uses numeric timestamps and weighted counts for rates. +5. Deletes raw data unless the user requests retention. + +Do not calculate material rates, percentiles, or durations by inspection. diff --git a/.agents/skills/nx-cloud-cache-investigator/SKILL.md b/.agents/skills/nx-cloud-cache-investigator/SKILL.md new file mode 100644 index 0000000..0877475 --- /dev/null +++ b/.agents/skills/nx-cloud-cache-investigator/SKILL.md @@ -0,0 +1,207 @@ +--- +name: nx-cloud-cache-investigator +description: Investigate a specific Nx cache miss, artifact download or extraction failure, same-hash non-replay, or suspected unsafe cache replay. Use this skill whenever a user asks why an Nx task did not use the cache, why cache artifact restoration failed, why a cache hit restored stale or wrong output, or to compare two cached task executions. Use the nx-cloud-api skill for every Nx Cloud read. This skill supports API-only investigations, preserves strict hash-evidence limits, and requests local configuration only when the question requires it. +--- + +# Nx cache investigator + +Requires the `nx-cloud-api` skill. Use a matching Nx workspace checkout only for local configuration diagnosis. An API-only investigation does not need a checkout. + +Diagnose one cache question with bounded evidence. Do not guess a changed hash +input or change configuration from cache status alone. + +Nx task caching and a tool-native cache are separate. A target `cache` field +controls Nx replay. Vite, ESLint, and other tools have separate executor options. +One does not prove the other. + +## Select the mode + +- **Cache-health trend:** This skill covers a specific task or artifact question, + not a multi-run rate regression. Use a separate bounded trend workflow for + rate or regression questions. +- **API-only:** Use this for supplied runs, CIPEs, tasks, or artifact errors when no + matching checkout exists. Do not request local configuration unless required. +- **Specific comparison:** Get two comparable executions. Ask for missing target, + branch, commit, command, configuration, CI environment, or time range. + +## Resume a pending investigation + +Arrange one same-session wake only when a known task is non-terminal, an API +request returns HTTP 409 (`not_terminal`), or the user starts a controlled +diagnostic run. Preserve the run, task, `batchId`, link, and filters. Re-query once after the +known delay or expected run completion. Stop at a terminal result or the retry +limit. Do not poll or monitor a live CI run. + +## Gather only relevant API evidence + +Use `nx-cloud-api` (`npx nx-cloud api`) for every read. Run `--describe` for a +known route. Use `--list-operations` only when the route is unknown or +ambiguous. Follow documented fields and returned links; do not construct routes +from internal IDs. + +Save every live API response to a file with `-o`. Use `jq` to select one +row and only the fields needed for this investigation. Do not print, read, or +paste a raw collection into model context. Keep the selected row's `batchId` and +`links.self` in the projection: + +```sh +npx nx-cloud api --describe 'runs/{runId}/tasks' +npx nx-cloud api "$run_tasks_link" -o "$dir/tasks.json" +jq --arg task "$task_id" --arg batch "$batch_id" \ + '.items[] | select(.id == $task and .batchId == $batch) | + {id, batchId, status, cacheStatus, hash, cacheable, + links: {self: .links.self}}' "$dir/tasks.json" +``` + +Here `$run_tasks_link` is the tasks link from the selected run and `$dir` is a +scratch directory from `mktemp -d`. Without a link, use +`npx nx-cloud api 'runs/{runId}/tasks' -p runId="$run_id"`; never paste an ID +into the path. Check `nextCursor` before concluding that a +task is absent from the list. + +For a selected execution, record run and task IDs, `batchId`, project, target, +configuration, command, parameters, branch, commit, CI context, timestamps, +cache status, final hash, `cacheEnabled`, `cacheable`, and relevant CIPE or +run-group links. + +A task ID can repeat. Select the task-list row first. Follow its exact `links.self` +or asset URL because it preserves `batchId`. Do not use one row to explain another. +A task list row already has task fields. A detail read is optional. + +If the API reports `cacheable: false`, Nx replay was not expected for that +execution. Name a configuration cause only when the `nx show` target query shows +it. If `cacheEnabled: false`, that run did not use the Nx task cache. Do not +investigate hash inputs or artifacts in either case. + +Read a log only when its command output or error can answer the question. Tell the +user before you read CI log content. Read +[references/log-and-report-assets.md](references/log-and-report-assets.md) before +you decode a log or report. Quote only a redacted error signature. Treat +user-supplied asset content as provided evidence. An advertised asset or a later +404 does not prove historical availability. + +## Inspect the Nx target + +Use a matching checkout only for a configuration question or code change. Check out +the recorded commit. Record the workspace Nx version. Query the exact target with +the workspace-local Nx command: + +```sh +nx show project "$project" --json | jq \ + --arg target "$target" \ + --arg configuration "${configuration:-}" \ + '.targets[$target] | { + executor, + cache, + inputs, + outputs, + options, + selectedConfiguration: .configurations[$configuration] + }' +``` + +Use this fragment as the target evidence. Nx already includes inherited settings. +Do not merge `project.json`, `nx.json`, plugins, or `targetDefaults` yourself. A +missing project property proves nothing. If the query reports `cache: true`, do +not add another `cache: true`. If the command or target is unavailable, report +configuration as unavailable. + +Inspect returned `options` only for a tool-native cache question. Use +version-matched executor documentation. A target `cache` field cannot prove Vite +or ESLint native-cache state. + +## Classify before you explain + +### No cache failure established + +A terminal `remote-cache-hit` proves Nx replay worked for that task. Do not turn a +successful hit into a cache-miss investigation or configuration change. Use trend +triage only for a supplied time-bounded rate question. + +### Cache artifact retrieval or restoration failure + +Use this when the main-job or run-group error names artifact download, validation, +decompression, or extraction. A task can still show `remote-cache-hit`. Reconcile +the task with the critical error and later cancellations. Read +[references/artifact-integrity.md](references/artifact-integrity.md) before you +inspect an archive. + +### Insufficient task evidence + +A null hash or cache status, `NOT_STARTED`, or `SCHEDULED_IMPLICITLY` does not +prove a miss. Do not compare null hashes or inspect artifacts. Request a terminal +record or one controlled completed run. + +### Different computation + +Different non-null hashes prove only this: **Nx considered at least one computation +input different.** They do not name the input. Request two comparable controlled +runs with direct hash-detail output when supported. This is a **Needs diagnostic +run** result, not a configuration recommendation. + +### Same computation, replay not established + +For equal non-null hashes without later replay, confirm `cacheable`, +`cacheEnabled`, and the `cache` value from the exact target query. A returned +`cache: true` blocks a duplicate setting. Do not infer artifact absence from an +empty asset list or 404. Treat an unresolved upload or retrieval branch as +**Needs diagnostic run**. + +### Suspected unsafe replay + +A stale or wrong replay needs reproduction evidence. `inputs` decide a hash; +`outputs` decide restored files. Request task sandboxing evidence for undeclared +reads or writes, plus the target query and a controlled reproduction. Do not +narrow inputs from task data alone. + +## Change gate + +Recommend a configuration or code edit only after all applicable checks pass: + +1. Record the matching commit, Nx version, exact target query, and returned fragment. +2. Show that its `cache`, `inputs`, or `outputs` value needs a change. +3. Before enabling cache, establish a terminating, deterministic task with correct + replayable outputs. +4. Before removing an input, obtain direct evidence that names it. Prove that its + removal cannot affect correct output with a bounded controlled run. +5. Explain the correctness risk and get explicit approval before an edit. + +Do not recommend an input exclusion from hash differences, a cache-rate trend, or +apparent breadth. If evidence is missing, say `No configuration change recommended +yet.` + +## Report + +```md +# Nx cache investigation + +## Scope + +- Target and compared run/task/batch IDs: … +- Branch, commit, CI environment, command, API cache state, and missing fields: … +- Workspace Nx version: …, or `Not required for this API-only investigation.` +- Nx target query and returned `cache`, `inputs`, and `outputs`: …, or `Unavailable.` +- Tool-native cache: …, or `Unknown; not inspected.` +- Change gate: `Passed` or `Blocked`; include missing evidence. + +## Classification + +`No cache failure established` | `Cache artifact retrieval or restoration failure` | `Insufficient task evidence` | `Different computation` | `Same computation, replay not established` | `Suspected unsafe replay` + +## Confirmed facts + +- … + +## Assessment + +- **Confirmed** / **Likely** / **Needs diagnostic run:** … + +## Next diagnostic step + +- Exact query, controlled command, or evidence required. +- Result that confirms or rules out the hypothesis. + +## Safe recommendation + +- Exact `nx show` result and risk; or `No configuration change recommended yet.` +``` diff --git a/.agents/skills/nx-cloud-cache-investigator/references/artifact-integrity.md b/.agents/skills/nx-cloud-cache-investigator/references/artifact-integrity.md new file mode 100644 index 0000000..e8a70ca --- /dev/null +++ b/.agents/skills/nx-cloud-cache-investigator/references/artifact-integrity.md @@ -0,0 +1,25 @@ +# Cache artifact integrity + +Read this file only when a run-group or main-job error names artifact download, +validation, decompression, or extraction. + +Download the exact task-row artifact link with +`npx nx-cloud api "" -o .tar.gz`. Do not extract it in the +workspace. If the artifact is encrypted, decrypt a copy with +`npx nx-cloud decrypt-artifact` before you inspect its contents; run the byte and +stream checks below on the downloaded bytes first. + +1. Record byte count and SHA-256. +2. Detect the format from bytes, not the extension. +3. Validate the complete compression stream and member table. +4. Reject trailing bytes, truncation, checksum failure, or an unreadable table. +5. Compare the same artifact from another supplied failure when available. +6. Compare a known-good artifact from the same run before calling an unusual + encoding malformed. +7. Delete the download unless the user requests retention. + +Byte-identical malformed downloads across retries support a persistent bad cache +object. A later valid download does not prove that an earlier object was valid. +The API cannot identify an upload path, writer, storage event, or service mutation. +Recommend invalidation or replacement of the exact object. Preserve the CIPE, +run group, task ID, and hash for support. Do not recommend unchanged retries. diff --git a/.agents/skills/nx-cloud-cache-investigator/references/log-and-report-assets.md b/.agents/skills/nx-cloud-cache-investigator/references/log-and-report-assets.md new file mode 100644 index 0000000..67d6b9f --- /dev/null +++ b/.agents/skills/nx-cloud-cache-investigator/references/log-and-report-assets.md @@ -0,0 +1,18 @@ +# Log and report assets + +Read this file before you inspect an Nx Cloud task log, sandbox report, or other +report asset. Task assets are typed `logs`, `artifact`, or `sandbox-report`. + +These assets are compressed binary payloads. Treat each as an archive, not +terminal text. Download the exact row-provided link with +`npx nx-cloud api "" -o .tar.gz`. Identify its format +from bytes, not its URL or file name. Decode it with a matching local tool into a +second private file. Do not stream, print, or expand it in the workspace. + +Read only lines that answer the investigation. Quote a redacted error signature, +not the complete log or report. Delete both files unless the user requests +retention. + +A downloaded asset proves only that it resolves now. A 404 does not prove that it +never existed. Treat user-provided decoded content as provided evidence, not as a +successful API read. diff --git a/.agents/skills/nx-cloud-ci-failure-review/SKILL.md b/.agents/skills/nx-cloud-ci-failure-review/SKILL.md new file mode 100644 index 0000000..a15587a --- /dev/null +++ b/.agents/skills/nx-cloud-ci-failure-review/SKILL.md @@ -0,0 +1,133 @@ +--- +name: nx-cloud-ci-failure-review +description: Review failed Nx Cloud CI pipeline executions and group recurring, evidence-based failure patterns. Use this skill whenever a user asks about failed CI pipelines, recurring task failures, failed CIPEs, a CI failure review, or a last-24-hours CI report. Use the nx-cloud-api skill for every Nx Cloud read. This read-only skill separates task, workflow, agent, timeout, cancellation, and unknown cases. It suggests diagnostic next steps without changing systems. +--- + +# Nx Cloud CI failure review + +Requires the `nx-cloud-api` skill for all Nx Cloud reads. This workflow is read-only. + +Reduce failed pipelines to a small set of diagnostic groups. A failed pipeline +does not prove that an agent or platform caused the failure. Classify each group +only at the level the evidence supports. + +## Scope and collection + +Use **focused investigation mode** when the user supplies one or more CIPE or +run-group links. Fetch those exact records first. Follow their returned run-group, +run, task, and workflow links. Compare the supplied executions directly. Do not run a broad time +window or build a workspace-wide ranking unless the user asks for recurrence or +scope. Keep cancellations that follow the named critical error as consequences, +not separate root-cause groups. + +Use **review mode** when the user asks for a workspace failure review. Review +failures from the last 24 hours by default. CIPE and run-group list filters use +`createdAt`, not failure time. Query a 30-hour creation window to cover the maximum +normal six-hour CI duration. State the intended 24-hour review period and the +30-hour creation window. + +Query `statuses=FAILED`, `statuses=TIMED_OUT`, and `statuses=CANCELED` (the +`cipes` filter accepts only terminal statuses). State the +branches, CI contexts, statuses, endpoints, and record counts. Ask before widening +the window or mixing unrelated repositories/workspaces. + +Use **nx-cloud-api** (`npx nx-cloud api`) for every read. Inspect the live +schemas with `--describe` for `cipes`, `run-groups`, `run-groups/{runGroupId}`, +`runs`, `runs/{runId}/tasks`, and the linked `steps` and `instances` endpoints. +Use `--list-operations` to confirm the routes; the public API has no separate +workflow routes. Reach child records by following returned `links`. Start with supplied CIPEs in focused investigation mode. Start with failed CIPEs +and their linked run groups in review mode. Use only live documented filters and +fields. Fetch one narrow page first and check `nextCursor` before continuing. + +Collect in this order: + +1. Failed, timed-out, and canceled CIPEs with status, timestamps, branch, and CI + context. Use a small, stated `--pages` value. Rank groups workspace-wide + only after a zero exit with `nextCursor: null`; otherwise + report the data as incomplete. +2. Linked run groups and their documented critical-error fields. +3. Runs and terminal task rows for each selected group. +4. Workflow and instance status only when task data does not explain the group. +5. The smallest relevant task or instance log excerpt for representative cases. + +Use a semaphore of at most five narrow detail requests. Fetch logs only after a +group reaches the top five. Tell the user before reading CI log content. Quote +only redacted error lines. + +Treat cancellations as their own category until their reason and timing show that +they belong elsewhere. Do not call a cancellation a failure without that context. + +## Grouping method + +Build groups from stable evidence. Prefer a task identifier plus normalized error +signature. Normalize timestamps, GUIDs, retry counters, temporary paths, and +random ports. Keep stack context, command, and error code that distinguish two +otherwise similar messages. + +Use these categories only when their evidence exists: + +- Repeated task error. +- Task timeout. +- Cancellation. +- Workflow or agent failure. +- Unknown pipeline failure. + +Call a group **workflow or agent failure** only when workflow/instance status, +critical error, or agent evidence supports it and no task failure explains the +pipeline. Do not infer infrastructure from the absence of a task log. + +Reconcile the full pipeline picture before classification. A task can record +`SUCCEEDED` or a cache hit while the main job fails during artifact download, +validation, or restoration. Compare the run-group `criticalErrorMessage`, task +status, cache status, workflow status, and later cancellations. In that case, +classify the main-job cache restoration error as primary and the canceled runs as +consequences. + +For every group, record its CIPE count, run-group count, affected task count, +first and last occurrence, branches/contexts, and one or two representative IDs. +Rank first by affected pipeline count, then recurrence, then blocked duration when +it is documented. + +## Next action rules + +- Repeated task error: when a relevant workspace checkout exists, inspect + `CODEOWNERS` and project ownership metadata at the recorded commit. Suggest a + likely review owner. Do not assign work or claim ownership when that evidence is absent. +- Task timeout: compare duration and resource evidence. Request a focused + reproduction or resource report when it does not show a direct cause. +- Cancellation: identify the documented cancel source, or keep it separate as + unknown cancellation. +- Workflow or agent failure: retry or monitor only when the evidence supports a + transient event. Otherwise inspect the named workflow/agent asset. +- Unknown: request the smallest log or run detail that can separate the cases. + +Do not make code, workflow, or allocation changes without explicit approval. + +## Report format + +```md +# Failed CI review + +## Scope + +- Window: … +- Data: … + +## Failure groups + +### 1. — + +- **Confirmed facts:** affected CIPEs/runs/tasks; representative IDs; log excerpt. +- **Assessment:** **Confirmed** / **Likely** / **Needs diagnostic run** — … +- **Impact:** … +- **Highest-leverage next action:** … + +## Unclassified or incomplete data + +- … +``` + +Limit a review report to five groups. In focused investigation mode, report the +supplied executions as one comparison when they have the same normalized signature. Link each +finding to exact CIPEs, run groups, runs, and tasks where available. State the data +limit when pagination, missing assets, or missing context affects the conclusion. diff --git a/.agents/skills/nx-generate/SKILL.md b/.agents/skills/nx-generate/SKILL.md index af7ba80..b15e285 100644 --- a/.agents/skills/nx-generate/SKILL.md +++ b/.agents/skills/nx-generate/SKILL.md @@ -1,6 +1,6 @@ --- name: nx-generate -description: Generate code using nx generators. INVOKE IMMEDIATELY when user mentions scaffolding, setup, structure, creating apps/libs, or setting up project structure. Trigger words - scaffold, setup, create a ... app, create a ... lib, project structure, generate, add a new project. ALWAYS use this BEFORE calling nx_docs or exploring - this skill handles discovery internally. +description: Generate code using nx generators. INVOKE IMMEDIATELY when user mentions scaffolding, setup, structure, creating apps/libs, or setting up project structure. Trigger words - scaffold, setup, create a new app, create a new lib, project structure, generate, add a new project. ALWAYS use this BEFORE calling nx_docs or exploring - this skill handles discovery internally. --- # Run Nx Generator @@ -117,7 +117,7 @@ Before generating, examine the target area of the codebase: **Always run with `--dry-run` first** to verify files will be created in the correct location: ```bash -npx nx g @nx/react:library --name=my-lib --dry-run --no-interactive +npx nx g @nx/react:library --directory=libs/my-lib --dry-run --no-interactive ``` Review the output carefully. If files would be created in the wrong location, adjust your options based on what you learned from the generator source code. diff --git a/.agents/skills/nx-workspace/SKILL.md b/.agents/skills/nx-workspace/SKILL.md index 4b5110a..1616c50 100644 --- a/.agents/skills/nx-workspace/SKILL.md +++ b/.agents/skills/nx-workspace/SKILL.md @@ -188,16 +188,16 @@ Example output: "tags": ["type:app", "scope:client"], "targets": { "build": { - "executor": "@nx/vite:build", - "options": { "outputPath": "dist/apps/my-app" } + "command": "vite build", + "options": { "cwd": "apps/my-app" } }, "serve": { - "executor": "@nx/vite:dev-server", - "options": { "buildTarget": "my-app:build" } + "command": "vite", + "options": { "cwd": "apps/my-app" } }, "test": { - "executor": "@nx/vite:test", - "options": {} + "command": "vitest", + "options": { "cwd": "apps/my-app" } } }, "implicitDependencies": [] diff --git a/.claude/settings.json b/.claude/settings.json index 887af87..b0a18a0 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -9,5 +9,14 @@ }, "enabledPlugins": { "nx@nx-claude-plugins": true + }, + "sandbox": { + "filesystem": { + "allowRead": ["/tmp/.nx", "~/.nx"], + "allowWrite": ["/tmp/.nx", "~/.nx"] + }, + "network": { + "allowUnixSockets": ["/tmp/.nx", "~/.nx"] + } } } diff --git a/.codex/config.toml b/.codex/config.toml index 5e0026a..21d45ca 100644 --- a/.codex/config.toml +++ b/.codex/config.toml @@ -1,17 +1,17 @@ +approval_policy = "on-request" +sandbox_mode = "workspace-write" -approval_policy = 'on-request' -sandbox_mode = 'workspace-write' -mcp_servers.nx-mcp.command = 'npx' -mcp_servers.nx-mcp.args = [ - 'nx', - 'mcp', -] -features.multi_agent = true +[mcp_servers.nx-mcp] +command = "npx" +args = [ "nx", "mcp" ] + +[features] +multi_agent = true [sandbox_workspace_write] network_access = true -writable_roots = ['~/.npmrc'] +writable_roots = [ "~/.npmrc" ] [agents.ci-monitor-subagent] -description = 'CI helper for /monitor-ci. Fetches CI status, retrieves fix details, or updates self-healing fixes. Executes one MCP tool call and returns the result.' -config_file = 'agents/ci-monitor-subagent.toml' +description = "CI helper for /monitor-ci. Fetches CI status, retrieves fix details, or updates self-healing fixes. Executes one MCP tool call and returns the result." +config_file = "agents/ci-monitor-subagent.toml" diff --git a/.commitlintrc b/.commitlintrc index 6311d83..c30e5a9 100644 --- a/.commitlintrc +++ b/.commitlintrc @@ -1,3 +1,3 @@ { - "extends": ["@commitlint/config-angular"] + "extends": ["@commitlint/config-conventional"] } diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 17461e6..09d6180 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -26,7 +26,6 @@ jobs: cache: false - run: pnpm install --frozen-lockfile - run: pnpm exec commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose - - run: pnpm nx affected --target=format:check --parallel=2 - run: pnpm nx affected --target=lint --parallel=2 build-and-test: diff --git a/.gitignore b/.gitignore index 1ffd9eb..b2dd903 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,9 @@ yarn-error.log testem.log /typings +# Temporary agent working material, see AGENTS.md +/.scratch + # System Files .DS_Store Thumbs.db diff --git a/.releaserc b/.releaserc index 0dc2642..bdaced1 100644 --- a/.releaserc +++ b/.releaserc @@ -25,5 +25,5 @@ }], "@semantic-release/github" ], - "preset": "angular" + "preset": "conventionalcommits" } diff --git a/AGENTS.md b/AGENTS.md index 5c62cd6..b4fc15d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,32 +1,16 @@ # AGENTS.md -## Task Completion Requirements - -- Always review your work and verify the results of your work using the appropriate tools before considering tasks completed. - ## Project Snapshot [Nx plugin](https://nx.dev) for [Atlassian Forge](https://developer.atlassian.com/platform/forge/) that aims to assist in efficient, scalable app development and remove the mental overhead of how to set up a Forge project. -## Core Priorities - -1. Reliability first. -2. Simplicity and correctness. -3. Avoid accidental complexity. - -If a tradeoff is required, choose correctness and robustness over short-term convenience. - -## Maintainability - -Long-term maintainability is a core priority. If you add new functionality, first check if there is shared logic that can be extracted to a separate module. Duplicate logic across multiple files is a code smell and should be avoided. Don't be afraid to change existing code. Don't take shortcuts by just adding local logic to solve a problem. If you are not sure, research to find a good solution. - -## Technology Stack +## Commits -- Use pnpm +Use [Conventional Commits](https://www.conventionalcommits.org). Treat `.commitlintrc` as the source of truth for commit-message rules. -## Commits +## Code style -Use Angular Conventional Commits. Treat `.commitlintrc` as the source of truth for commit-message rules. +Write clean, functional, composable code. Prefer `const` and immutable data over `let` and mutation. Keep generators and executors close to the matching upstream Nx code, for example the `@nx/node` application generator, so the two are easy to compare. ## Agent skills diff --git a/docs/guides/getting-started.md b/docs/guides/getting-started.md index e4b81b9..1818d7e 100644 --- a/docs/guides/getting-started.md +++ b/docs/guides/getting-started.md @@ -3,7 +3,7 @@ sidebar_position: 10 --- # Getting started diff --git a/docs/guides/migrating-plugin-version.md b/docs/guides/migrating-plugin-version.md index eef971d..d7da3c7 100644 --- a/docs/guides/migrating-plugin-version.md +++ b/docs/guides/migrating-plugin-version.md @@ -2,10 +2,22 @@ As of plugin version 2.2.0, the plugin ships with migration scripts that allow you to use the [`nx migrate`](https://nx.dev/packages/nx/documents/migrate) to update your workspace to a newer version of `nx-forge`. -To update to the latest nx-forge version, run the command below and follow the instructions in the terminal output. +Each plugin version supports the Nx versions in its `nx` peer dependency, for example plugin version 9 requires Nx 24. `nx migrate` only updates the package you name, so if the new plugin version requires a newer Nx version, update Nx first and then the plugin. Run the migrations of each step and follow the instructions in the terminal output before you start the next step: ```shell +nx migrate 24 +nx migrate --run-migrations nx migrate @toolsplus/nx-forge@latest +nx migrate --run-migrations +``` + +Since plugin version 9.0.0, the plugin only ships migrations for plugin versions 7.0.0 and later. If your workspace uses an older plugin version, first update the plugin to the latest 8.x version, which requires Nx 23, and then follow the steps above: + +```shell +nx migrate 23 +nx migrate --run-migrations +nx migrate @toolsplus/nx-forge@8 +nx migrate --run-migrations ``` Refer to the [Nx migrate docs](https://nx.dev/packages/nx/documents/migrate) for more details on how to use `nx migrate`. diff --git a/docs/guides/migrating-to-inferred-tasks.md b/docs/guides/migrating-to-inferred-tasks.md index 8480e54..5f31ace 100644 --- a/docs/guides/migrating-to-inferred-tasks.md +++ b/docs/guides/migrating-to-inferred-tasks.md @@ -12,4 +12,6 @@ Staring with Nx Forge plugin version 4.0.0, the plugin could infer targets for F As of plugin version 5.1.0, all [targets provided by the plugin](../reference/executors.md) can be inferred. This means, to migrate to inferred tasks, you can simply remove those from your app's `project.json` files. +Nx 24 removed the `@nx/webpack:webpack`, `@nx/jest:jest` and `@nx/eslint:lint` executors. Since plugin version 9.0.0, which requires Nx 24, the app generator always relies on the `@nx/webpack/plugin`, `@nx/jest/plugin` and `@nx/eslint/plugin` inference plugins for the `build`, `test` and `lint` targets. When you update to Nx 24, `nx migrate` converts existing targets that use the removed executors where it can and reports the targets that need manual changes. The application generator option `setParserOptionsProject` was renamed to `enableTypedLinting`; the plugin migration updates generator defaults in `nx.json`, `project.json` and `package.json` files, but scripts that pass `--setParserOptionsProject` need to be updated. + From our experience, transitioning the configuration to inferred tasks can be tricky. If you run into issues, it often helps to [generate a clean Nx test workspace](./getting-started.md#prerequisites), run the app generators you are interested in and compare the generated configuration in `project.json` files and the `nx.json` with your existing workspace. diff --git a/docs/guides/migrating-to-package-executor.md b/docs/guides/migrating-to-package-executor.md index e3f4192..fba3435 100644 --- a/docs/guides/migrating-to-package-executor.md +++ b/docs/guides/migrating-to-package-executor.md @@ -14,8 +14,6 @@ For all the details and motivation of this change, refer to [the discussion on G Copy the generated `webpack.config.js` to your app's project directory and update the `outputPath`, `main`, `tsConfig`, and `assets` values to match your project layout. The generated app uses the `@nx/webpack/plugin` entry in `nx.json` to infer the `build` target, so you can delete the existing `build` target configuration from your app's `project.json`. - If your workspace has inferred plugins disabled, keep an explicit `build` target instead. In that case, copy the generated app's `build` target configuration from `project.json` and adjust the paths to match your project layout. - b) If you chose the esbuild bundler option: Copy the `build` target configuration from the generated app's `project.json` and replace the existing `build` target configuration in your app's `project.json`. Adjust the path configurations in the `build` target to match your project layout. diff --git a/e2e/nx-forge-e2e/project.json b/e2e/nx-forge-e2e/project.json index 3107257..5ec1ac1 100644 --- a/e2e/nx-forge-e2e/project.json +++ b/e2e/nx-forge-e2e/project.json @@ -3,15 +3,20 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "projectType": "application", "sourceRoot": "e2e/nx-forge-e2e/src", + "tags": [], + "implicitDependencies": ["nx-forge"], "targets": { "e2e": { - "executor": "@nx/jest:jest", + "dependsOn": ["^build"], "options": { - "jestConfig": "e2e/nx-forge-e2e/jest.config.js" + "passWithNoTests": true }, - "dependsOn": ["^build"] + "configurations": { + "ci": { + "ci": true, + "coverage": true + } + } } - }, - "tags": [], - "implicitDependencies": ["nx-forge"] + } } diff --git a/e2e/nx-forge-e2e/src/application.generator.spec.ts b/e2e/nx-forge-e2e/src/application.generator.spec.ts index e04b04d..1e19d94 100644 --- a/e2e/nx-forge-e2e/src/application.generator.spec.ts +++ b/e2e/nx-forge-e2e/src/application.generator.spec.ts @@ -81,41 +81,6 @@ const expectWebpackBuildOutput = async ( } }; -const configureWebpackTaskInference = ( - workspaceDirectory: string, - enabled: boolean -) => { - const nxJsonPath = join(workspaceDirectory, 'nx.json'); - const nxJson = JSON.parse(readFileSync(nxJsonPath, 'utf8')); - const plugins = (nxJson.plugins ?? []).filter((plugin) => - typeof plugin === 'string' - ? plugin !== '@nx/webpack/plugin' - : plugin.plugin !== '@nx/webpack/plugin' - ); - nxJson.useInferencePlugins = enabled; - - if (enabled) { - plugins.push('@nx/webpack/plugin'); - } - - nxJson.plugins = plugins; - writeFileSync(nxJsonPath, JSON.stringify(nxJson, null, 2) + '\n', 'utf8'); -}; - -const enableWebpackTaskInference = async (workspaceDirectory: string) => { - configureWebpackTaskInference(workspaceDirectory, true); - await runNxCommandAsync( - 'generate @nx/webpack:init --addPlugin=true --interactive=false', - { - cwd: workspaceDirectory, - } - ); -}; - -const disableWebpackTaskInference = (workspaceDirectory: string) => { - configureWebpackTaskInference(workspaceDirectory, false); -}; - describe('Forge application generator', () => { let workspaceDirectory: string; @@ -191,8 +156,6 @@ describe('Forge application generator', () => { }); it('should create expected output with inferred webpack plugin', async () => { - await enableWebpackTaskInference(workspaceDirectory); - const appName = await generateForgeApp({ cwd: workspaceDirectory, directory: 'apps', @@ -213,30 +176,28 @@ describe('Forge application generator', () => { expect(project.targets?.build).toBeUndefined(); await expectWebpackBuildOutput(workspaceDirectory, appName); + await runNxCommandAsync(`run ${appName}:lint`, { cwd: workspaceDirectory }); + await runNxCommandAsync(`run ${appName}:test`, { cwd: workspaceDirectory }); }); - it('should create expected output with legacy webpack executor', async () => { - disableWebpackTaskInference(workspaceDirectory); - + it('should set up vitest with --unitTestRunner=vitest', async () => { const appName = await generateForgeApp({ cwd: workspaceDirectory, directory: 'apps', - options: '--bundler=webpack', + options: '--unitTestRunner=vitest', }); - expect( - readFileSync( - join(workspaceDirectory, 'apps', appName, 'webpack.config.js'), - 'utf8' - ) - ).toContain('composePlugins'); - const project = JSON.parse( - readFileSync( - join(workspaceDirectory, 'apps', appName, 'project.json'), - 'utf8' - ) + const appDirectory = join(workspaceDirectory, 'apps', appName); + expect(existsSync(join(appDirectory, 'vitest.config.mts'))).toBe(true); + expect(existsSync(join(appDirectory, 'jest.config.cts'))).toBe(false); + writeFileSync( + join(appDirectory, 'src', 'index.spec.ts'), + `import { expect, it } from 'vitest';\n\nit('runs', () => {\n expect(1 + 1).toBe(2);\n});\n` ); - expect(project.targets?.build).toBeDefined(); + const testResult = await runNxCommandAsync(`run ${appName}:test`, { + cwd: workspaceDirectory, + }); + expect(testResult.stdout).toMatch(/1 passed/); await expectWebpackBuildOutput(workspaceDirectory, appName); }); }); diff --git a/e2e/nx-forge-e2e/src/utils/test-workspace.ts b/e2e/nx-forge-e2e/src/utils/test-workspace.ts index fa30c5f..6959190 100644 --- a/e2e/nx-forge-e2e/src/utils/test-workspace.ts +++ b/e2e/nx-forge-e2e/src/utils/test-workspace.ts @@ -1,7 +1,7 @@ import { execSync } from 'node:child_process'; import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; import { dirname, join } from 'node:path'; -import { workspaceRoot } from '@nx/devkit'; +import { NX_VERSION, workspaceRoot } from '@nx/devkit'; const TEST_WORKSPACES_ROOT = join(workspaceRoot, 'tmp'); @@ -41,7 +41,7 @@ export const createTestWorkspace = ( }); runCommand( - `npx -y create-nx-workspace@latest ${workspaceName} --preset=apps --nxCloud=skip --packageManager=npm --no-interactive`, + `npx -y create-nx-workspace@${NX_VERSION} ${workspaceName} --preset=apps --nxCloud=skip --skipGit --packageManager=npm --no-interactive`, TEST_WORKSPACES_ROOT ); diff --git a/e2e/nx-forge-e2e/tsconfig.json b/e2e/nx-forge-e2e/tsconfig.json index b9c9d95..6843a97 100644 --- a/e2e/nx-forge-e2e/tsconfig.json +++ b/e2e/nx-forge-e2e/tsconfig.json @@ -6,5 +6,8 @@ { "path": "./tsconfig.spec.json" } - ] + ], + "compilerOptions": { + "ignoreDeprecations": "6.0" + } } diff --git a/nx.json b/nx.json index 896809b..8e73f3f 100644 --- a/nx.json +++ b/nx.json @@ -6,69 +6,85 @@ "$schema": "./node_modules/nx/schemas/nx-schema.json", "targetDefaults": { "build": { - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], + "dependsOn": ["^build"], + "inputs": ["production", "^production"], "cache": true }, - "@nx/jest:jest": { - "inputs": [ - "default", - "^production", - "{workspaceRoot}/jest.preset.js" - ], + "@nx/js:tsc": { "cache": true, - "options": { - "passWithNoTests": true - }, - "configurations": { - "ci": { - "ci": true, - "codeCoverage": true + "dependsOn": ["^build"], + "inputs": ["production", "^production"] + }, + "test": [ + { + "filter": { + "plugin": "@nx/jest/plugin" + }, + "configurations": { + "ci": { + "ci": true, + "coverage": true + } + }, + "options": { + "passWithNoTests": true } } - }, - "@nx/eslint:lint": { - "inputs": [ - "default", - "^default", - "{workspaceRoot}/.eslintrc.json", - "{workspaceRoot}/eslint.config.mjs", - "{workspaceRoot}/tools/eslint-rules/**/*" - ], - "cache": true - }, - "@nx/js:tsc": { - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ] - } + ], + "lint": [ + { + "filter": { + "plugin": "@nx/eslint/plugin" + }, + "inputs": [ + "default", + "^default", + "{workspaceRoot}/.eslintrc.json", + "{workspaceRoot}/eslint.config.mjs", + "{workspaceRoot}/tools/eslint-rules/**/*", + { + "externalDependencies": ["eslint"] + } + ] + } + ] }, "namedInputs": { - "default": [ - "{projectRoot}/**/*", - "sharedGlobals" - ], + "default": ["{projectRoot}/**/*", "sharedGlobals"], "sharedGlobals": [], "production": [ "default", "!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)", "!{projectRoot}/tsconfig.spec.json", - "!{projectRoot}/jest.config.[jt]s", + "!{projectRoot}/jest.config.{cjs,mjs,js,cts,mts,ts}", "!{projectRoot}/.eslintrc.json", "!{projectRoot}/src/test-setup.[jt]s", "!{projectRoot}/eslint.config.mjs" ] }, "defaultBase": "main", - "analytics": false + "analytics": false, + "plugins": [ + { + "plugin": "@nx/jest/plugin", + "options": { + "targetName": "e2e" + }, + "include": ["e2e/nx-forge-e2e/**/*"] + }, + { + "plugin": "@nx/jest/plugin", + "options": { + "targetName": "test" + }, + "include": ["packages/nx-forge/**/*", "tools/docs/**/*"] + }, + { + "plugin": "@nx/eslint/plugin", + "options": { + "targetName": "lint" + }, + "include": ["packages/nx-forge/**/*", "tools/docs/**/*"] + } + ] } diff --git a/package.json b/package.json index a7dde18..3ddea2c 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ ], "devDependencies": { "@commitlint/cli": "catalog:", - "@commitlint/config-angular": "catalog:", + "@commitlint/config-conventional": "catalog:", "@eslint/eslintrc": "catalog:", "@eslint/js": "catalog:", "@forge/cli": "catalog:", @@ -29,6 +29,7 @@ "@nx/js": "catalog:nx", "@nx/node": "catalog:nx", "@nx/plugin": "catalog:nx", + "@nx/vitest": "catalog:nx", "@nx/webpack": "catalog:nx", "@nx/workspace": "catalog:nx", "@semantic-release/exec": "catalog:", @@ -42,6 +43,7 @@ "@types/node": "catalog:", "@typescript-eslint/eslint-plugin": "catalog:", "@typescript-eslint/parser": "catalog:", + "conventional-changelog-conventionalcommits": "catalog:", "dotenv": "catalog:", "eslint": "catalog:", "eslint-config-prettier": "catalog:", diff --git a/packages/nx-forge/eslint.config.mjs b/packages/nx-forge/eslint.config.mjs index 13107cc..463fc71 100644 --- a/packages/nx-forge/eslint.config.mjs +++ b/packages/nx-forge/eslint.config.mjs @@ -46,7 +46,17 @@ export default [ '@nx/dependency-checks': [ 'error', { - ignoredDependencies: ['nx'], + ignoredDependencies: [ + 'nx', + // Nx tooling packages that the application generator loads with + // `ensurePackage` at the workspace's Nx version. Declaring them + // would install a copy that can differ from the workspace's Nx + // version and write mismatched versions to its package.json. + '@nx/eslint', + '@nx/jest', + '@nx/vitest', + '@nx/webpack', + ], }, ], }, diff --git a/packages/nx-forge/generators.json b/packages/nx-forge/generators.json index 97a2d42..f25916e 100644 --- a/packages/nx-forge/generators.json +++ b/packages/nx-forge/generators.json @@ -4,7 +4,7 @@ "version": "0.0.1", "generators": { "application": { - "factory": "./src/generators/application/generator#applicationGeneratorInternal", + "factory": "./src/generators/application/generator#applicationGenerator", "schema": "./src/generators/application/schema.json", "description": "Create an Atlassian Forge application.", "x-type": "application", diff --git a/packages/nx-forge/jest.config.ts b/packages/nx-forge/jest.config.cts similarity index 94% rename from packages/nx-forge/jest.config.ts rename to packages/nx-forge/jest.config.cts index a796b4a..a848b56 100644 --- a/packages/nx-forge/jest.config.ts +++ b/packages/nx-forge/jest.config.cts @@ -1,4 +1,4 @@ -export default { +module.exports = { displayName: 'nx-forge', globals: {}, transform: { diff --git a/packages/nx-forge/migrations.json b/packages/nx-forge/migrations.json index 924b9ca..9cc9579 100644 --- a/packages/nx-forge/migrations.json +++ b/packages/nx-forge/migrations.json @@ -1,21 +1,9 @@ { "generators": { - "update-2-3-0-add-nx-forge-plugin": { - "version": "2.3.0-beta.0", - "description": "Adds @toolsplus/nx-forge plugin to workspace", - "cli": "nx", - "implementation": "./src/migrations/update-2-3-0/add-nx-forge-plugin" - }, - "update-2-3-0-remove-implicit-custom-ui-dependencies": { - "version": "2.3.0-beta.0", - "description": "Removes implicit Custom UI dependencies from Forge app projects", - "cli": "nx", - "implementation": "./src/migrations/update-2-3-0/remove-implicit-custom-ui-dependencies" - }, - "update-3-0-0-webpack-config-setup": { - "version": "3.0.0-beta.0", - "description": "Add webpack.config.js file when webpackConfig is not defined", - "implementation": "./src/migrations/update-3-0-0-webpack-config-setup/update-3-0-0-webpack-config-setup" + "update-9-0-0-replace-set-parser-options-project": { + "version": "9.0.0-beta.0", + "description": "Replaces the removed `setParserOptionsProject` application generator option with `enableTypedLinting` in generator defaults", + "implementation": "./src/migrations/update-9-0-0/replace-set-parser-options-project" } } } diff --git a/packages/nx-forge/package.json b/packages/nx-forge/package.json index 7e45c33..41f9d75 100644 --- a/packages/nx-forge/package.json +++ b/packages/nx-forge/package.json @@ -13,11 +13,8 @@ "executors": "./executors.json", "dependencies": { "@forge/manifest": "catalog:", - "@nx/devkit": "catalog:nx", - "@nx/eslint": "catalog:nx", - "@nx/jest": "catalog:nx", - "@nx/js": "catalog:nx", - "@nx/webpack": "catalog:nx", + "@nx/devkit": "^24.0.1", + "@nx/js": "^24.0.1", "cross-spawn": "catalog:", "fs-extra": "catalog:", "js-yaml": "catalog:", @@ -25,7 +22,7 @@ "tslib": "catalog:" }, "peerDependencies": { - "nx": ">=23 <24" + "nx": ">=24 <25" }, "type": "commonjs", "nx-migrations": { diff --git a/packages/nx-forge/project.json b/packages/nx-forge/project.json index 976ed35..6a90f6c 100644 --- a/packages/nx-forge/project.json +++ b/packages/nx-forge/project.json @@ -2,7 +2,6 @@ "name": "nx-forge", "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "packages/nx-forge/src", - "tags": [], "release": { "version": { "manifestRootsToUpdate": ["dist/{projectRoot}"], @@ -10,6 +9,7 @@ "fallbackCurrentVersionResolver": "disk" } }, + "tags": [], "targets": { "nx-release-publish": { "executor": "@nx/js:release-publish", @@ -54,17 +54,6 @@ } ] } - }, - "lint": { - "executor": "@nx/eslint:lint", - "outputs": ["{options.outputFile}"] - }, - "test": { - "executor": "@nx/jest:jest", - "outputs": ["{workspaceRoot}/coverage/packages/nx-forge"], - "options": { - "jestConfig": "packages/nx-forge/jest.config.ts" - } } } } diff --git a/packages/nx-forge/src/executors/package/lib/patch-manifest-yml.ts b/packages/nx-forge/src/executors/package/lib/patch-manifest-yml.ts index 3018686..defc063 100644 --- a/packages/nx-forge/src/executors/package/lib/patch-manifest-yml.ts +++ b/packages/nx-forge/src/executors/package/lib/patch-manifest-yml.ts @@ -2,7 +2,6 @@ import { existsSync } from 'fs'; import { join, resolve } from 'path'; import { joinPathFragments, logger } from '@nx/devkit'; import { ManifestSchema, Resources } from '@forge/manifest'; -import { HostedResourcesSchema } from '@forge/manifest/out/schema/manifest'; import { NormalizedOptions } from '../schema'; import { readManifestYml, @@ -10,6 +9,7 @@ import { } from '../../../utils/forge/manifest-yml'; import { getResourceTypeIndex, + HostedResourcesSchema, isResourceType, ResourceType, ResourceTypeIndex, diff --git a/packages/nx-forge/src/executors/package/lib/process-resource-dependencies.ts b/packages/nx-forge/src/executors/package/lib/process-resource-dependencies.ts index a159c48..93d2885 100644 --- a/packages/nx-forge/src/executors/package/lib/process-resource-dependencies.ts +++ b/packages/nx-forge/src/executors/package/lib/process-resource-dependencies.ts @@ -8,10 +8,12 @@ import { ProjectGraphProjectNode, } from '@nx/devkit'; import { Resources } from '@forge/manifest'; -import { HostedResourcesSchema } from '@forge/manifest/out/schema/manifest'; import { NormalizedOptions } from '../schema'; import { readManifestYml } from '../../../utils/forge/manifest-yml'; -import { isResourceType } from '../../../shared/manifest/util-manifest'; +import { + HostedResourcesSchema, + isResourceType, +} from '../../../shared/manifest/util-manifest'; import { directoryExists } from '../../../utils/util-fs'; type Options = Pick< diff --git a/packages/nx-forge/src/executors/tunnel/lib/extract-custom-ui-projects.ts b/packages/nx-forge/src/executors/tunnel/lib/extract-custom-ui-projects.ts index 97a894c..fe8910c 100644 --- a/packages/nx-forge/src/executors/tunnel/lib/extract-custom-ui-projects.ts +++ b/packages/nx-forge/src/executors/tunnel/lib/extract-custom-ui-projects.ts @@ -1,8 +1,10 @@ import { ExecutorContext, joinPathFragments } from '@nx/devkit'; import { Resources } from '@forge/manifest'; -import { HostedResourcesSchema } from '@forge/manifest/out/schema/manifest'; import { readManifestYml } from '../../../utils/forge/manifest-yml'; -import { isResourceType } from '../../../shared/manifest/util-manifest'; +import { + HostedResourcesSchema, + isResourceType, +} from '../../../shared/manifest/util-manifest'; type ResourceWithTunnelPort = Required; diff --git a/packages/nx-forge/src/generators/application/files/tsconfig.app.json b/packages/nx-forge/src/generators/application/files/tsconfig.app.json index 32c9367..0f44581 100644 --- a/packages/nx-forge/src/generators/application/files/tsconfig.app.json +++ b/packages/nx-forge/src/generators/application/files/tsconfig.app.json @@ -3,15 +3,9 @@ "compilerOptions": { "outDir": "<%= offset %>dist/out-tsc", "module": "commonjs", + "moduleResolution": "<%= moduleResolution %>", "sourceMap": true, - "moduleResolution": "node", "types": ["node"] }, - "exclude": [ - "jest.config.ts", - "jest.config.cts", - "src/**/*.spec.ts", - "src/**/*.test.ts" - ], "include": ["src/**/*.ts"] } diff --git a/packages/nx-forge/src/generators/application/files/webpack.config.js__tmpl__ b/packages/nx-forge/src/generators/application/files/webpack.config.js__tmpl__ index 5f636a1..12254d9 100644 --- a/packages/nx-forge/src/generators/application/files/webpack.config.js__tmpl__ +++ b/packages/nx-forge/src/generators/application/files/webpack.config.js__tmpl__ @@ -1,4 +1,3 @@ -<% if (webpackPluginOptions) { %> const { NxAppWebpackPlugin } = require('@nx/webpack/app-plugin'); module.exports = { @@ -24,18 +23,3 @@ module.exports = { }) ], }; -<% } else { %> -const { composePlugins, withNx } = require('@nx/webpack'); - -// Nx plugins for webpack. -module.exports = composePlugins( - withNx({ - target: 'node', - }), - (config) => { - // Update the webpack config as needed here. - // e.g. `config.plugins.push(new MyPlugin())` - return config; - } -); -<% } %> diff --git a/packages/nx-forge/src/generators/application/generator.legacy.spec.ts b/packages/nx-forge/src/generators/application/generator.legacy.spec.ts deleted file mode 100644 index 65595ab..0000000 --- a/packages/nx-forge/src/generators/application/generator.legacy.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - readNxJson, - readProjectConfiguration, - Tree, - updateNxJson, -} from '@nx/devkit'; -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; - -import { applicationGenerator } from './generator'; - -describe('application generator (legacy)', () => { - let tree: Tree; - - beforeEach(() => { - tree = createTreeWithEmptyWorkspace(); - const nxJson = readNxJson(tree); - updateNxJson(tree, nxJson); - }); - - it('should not skip the build target', async () => { - await applicationGenerator(tree, { - directory: 'my-forge-app', - bundler: 'webpack', - addPlugin: false, - }); - const project = readProjectConfiguration(tree, 'my-forge-app'); - expect(project.root).toEqual('my-forge-app'); - expect(project.targets.build).toMatchInlineSnapshot(` - { - "configurations": { - "development": {}, - "production": {}, - }, - "defaultConfiguration": "production", - "executor": "@nx/webpack:webpack", - "options": { - "assets": [ - "my-forge-app/src/assets", - ], - "compiler": "tsc", - "main": "my-forge-app/src/index.ts", - "outputFileName": "index.js", - "outputPath": "dist/my-forge-app/src", - "target": "node", - "tsConfig": "my-forge-app/tsconfig.app.json", - "webpackConfig": "my-forge-app/webpack.config.js", - }, - "outputs": [ - "{options.outputPath}", - ], - } - `); - - const webpackConfig = tree.read('my-forge-app/webpack.config.js', 'utf-8'); - expect(webpackConfig).toContain(`composePlugins`); - expect(webpackConfig).toContain(`target: 'node'`); - }); -}); diff --git a/packages/nx-forge/src/generators/application/generator.spec.ts b/packages/nx-forge/src/generators/application/generator.spec.ts index d13773a..5020ef9 100644 --- a/packages/nx-forge/src/generators/application/generator.spec.ts +++ b/packages/nx-forge/src/generators/application/generator.spec.ts @@ -1,74 +1,14 @@ +import '../../test-utils/mock-devkit'; import * as devkit from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { getProjects, readJson, + readNxJson, readProjectConfiguration, Tree, } from '@nx/devkit'; -/* - * Force lintProjectGenerator and configurationGenerator to run with addPlugin: false - * so these generator.spec.ts snapshots assert explicit generated targets instead of - * depending on Nx plugin inference. This keeps the outputs deterministic in tests. - * - * What we verified locally: - * - applicationGenerator() passes addPlugin through to lintProjectGenerator() and - * configurationGenerator() in generator.ts. - * - These tests use createTreeWithEmptyWorkspace(), so the Tree root is '/virtual'. - * - With addPlugin: true, current Nx does not stay inside the in-memory Tree. During a - * Jest test run, multiGlobWithWorkspaceContext('/virtual', ...) unexpectedly returns - * real workspace files such as e2e/nx-forge-e2e/project.json and - * e2e/nx-forge-e2e/jest.config.js. - * - @nx/jest/plugin then calls readdirSync(join('/virtual', projectRoot)), which crashes - * with ENOENT for '/virtual/e2e/nx-forge-e2e'. - * - Strangely, this bug only appeared after switching to pnpm. It is not clear why this - * bug was not surfaced under npm. - * - * Nx upstream usually takes a different approach: generator specs often keep addPlugin: true - * and import a private test helper that mocks the project graph, for example: - * - https://github.com/nrwl/nx/blob/master/packages/js/src/generators/library/library.spec.ts - * - https://github.com/nrwl/nx/blob/master/packages/jest/src/generators/configuration/configuration.spec.ts - * - https://github.com/nrwl/nx/blob/master/packages/eslint/src/generators/lint-project/lint-project.spec.ts - * - https://github.com/nrwl/nx/blob/master/packages/nx/src/internal-testing-utils/mock-project-graph.ts - * - * We tried that upstream-style alternative here, but it does not work cleanly in this repo. - * The helper is not published in the installed Nx package, and mirroring its - * createProjectGraphAsync mock locally still left the Jest test path above failing. - * - * Similar Nx issues: - * - https://github.com/nrwl/nx/issues/32588 - * - https://github.com/nrwl/nx/issues/29708 - * - https://github.com/nrwl/nx/issues/34474 - */ -jest.mock('@nx/eslint', () => { - const actual = jest.requireActual('@nx/eslint'); - - return { - ...actual, - lintProjectGenerator: jest.fn((tree, options) => - actual.lintProjectGenerator(tree, { - ...options, - addPlugin: false, - }) - ), - }; -}); - -jest.mock('@nx/jest', () => { - const actual = jest.requireActual('@nx/jest'); - - return { - ...actual, - configurationGenerator: jest.fn((tree, options) => - actual.configurationGenerator(tree, { - ...options, - addPlugin: false, - }) - ), - }; -}); - import { applicationGenerator } from './generator'; import { ApplicationGeneratorOptions } from './schema'; @@ -81,7 +21,9 @@ describe('application generator', () => { let tree: Tree; beforeEach(() => { - tree = createTreeWithEmptyWorkspace(); + // Nx defaults test workspaces to oxfmt, which the generator would install on + // demand. Prettier is already installed in this workspace. + tree = createTreeWithEmptyWorkspace({ formatter: 'prettier' }); jest.clearAllMocks(); }); @@ -90,7 +32,6 @@ describe('application generator', () => { await applicationGenerator(tree, { directory: 'my-forge-app', bundler: 'webpack', - addPlugin: true, }); const project = readProjectConfiguration(tree, 'my-forge-app'); @@ -103,17 +44,10 @@ describe('application generator', () => { "sourceRoot": "my-forge-app/src", "tags": [], "targets": { - "lint": { - "executor": "@nx/eslint:lint", - }, "test": { - "executor": "@nx/jest:jest", "options": { - "jestConfig": "my-forge-app/jest.config.cts", + "passWithNoTests": true, }, - "outputs": [ - "{workspaceRoot}/coverage/{projectRoot}", - ], }, }, } @@ -124,7 +58,6 @@ describe('application generator', () => { await applicationGenerator(tree, { directory: 'my-forge-app', bundler: 'esbuild', - addPlugin: true, }); const project = readProjectConfiguration(tree, 'my-forge-app'); @@ -176,17 +109,10 @@ describe('application generator', () => { "{options.outputPath}", ], }, - "lint": { - "executor": "@nx/eslint:lint", - }, "test": { - "executor": "@nx/jest:jest", "options": { - "jestConfig": "my-forge-app/jest.config.cts", + "passWithNoTests": true, }, - "outputs": [ - "{workspaceRoot}/coverage/{projectRoot}", - ], }, }, } @@ -197,7 +123,6 @@ describe('application generator', () => { await applicationGenerator(tree, { directory: 'my-forge-app', tags: 'one,two', - addPlugin: true, }); const projects = Object.fromEntries(getProjects(tree)); @@ -212,7 +137,6 @@ describe('application generator', () => { await applicationGenerator(tree, { directory: 'my-forge-app', bundler: 'webpack', - addPlugin: true, }); expect(tree.exists('my-forge-app/webpack.config.js')).toBeTruthy(); expect(tree.exists(jestConfigPath('my-forge-app'))).toBeTruthy(); @@ -242,6 +166,7 @@ describe('application generator', () => { const tsconfigApp = readJson(tree, 'my-forge-app/tsconfig.app.json'); expect(tsconfigApp.compilerOptions.outDir).toEqual('../dist/out-tsc'); + expect(tsconfigApp.compilerOptions.moduleResolution).toEqual('bundler'); expect(tsconfigApp.compilerOptions).not.toHaveProperty('jsx'); expect(tsconfigApp.compilerOptions).not.toHaveProperty('jsxFactory'); expect(tsconfigApp.extends).toEqual('./tsconfig.json'); @@ -266,12 +191,37 @@ describe('application generator', () => { `); }); + it('should infer build, lint and test targets', async () => { + await applicationGenerator(tree, { + directory: 'my-forge-app', + bundler: 'webpack', + }); + + const plugins = (readNxJson(tree).plugins ?? []).map((plugin) => + typeof plugin === 'string' ? plugin : plugin.plugin + ); + expect(plugins).toEqual( + expect.arrayContaining([ + '@nx/webpack/plugin', + '@nx/eslint/plugin', + '@nx/jest/plugin', + ]) + ); + + const webpackConfig = tree.read( + 'my-forge-app/webpack.config.js', + 'utf-8' + ); + expect(webpackConfig).toContain('new NxAppWebpackPlugin({'); + expect(webpackConfig).toContain(`outputPath: '../dist/my-forge-app/src'`); + expect(webpackConfig).toContain(`main: './src/index.ts'`); + }); + it('should extend from root tsconfig.json when no tsconfig.base.json', async () => { tree.rename('tsconfig.base.json', 'tsconfig.json'); await applicationGenerator(tree, { directory: 'my-forge-app', - addPlugin: true, }); const tsconfig = readJson(tree, 'my-forge-app/tsconfig.json'); @@ -284,7 +234,6 @@ describe('application generator', () => { await applicationGenerator(tree, { bundler: 'webpack', directory: 'my-dir/my-forge-app', - addPlugin: true, }); const project = readProjectConfiguration(tree, 'my-forge-app'); @@ -298,17 +247,10 @@ describe('application generator', () => { "sourceRoot": "my-dir/my-forge-app/src", "tags": [], "targets": { - "lint": { - "executor": "@nx/eslint:lint", - }, "test": { - "executor": "@nx/jest:jest", "options": { - "jestConfig": "my-dir/my-forge-app/jest.config.cts", + "passWithNoTests": true, }, - "outputs": [ - "{workspaceRoot}/coverage/{projectRoot}", - ], }, }, } @@ -319,7 +261,6 @@ describe('application generator', () => { await applicationGenerator(tree, { bundler: 'esbuild', directory: 'my-dir/my-forge-app', - addPlugin: true, }); const project = readProjectConfiguration(tree, 'my-forge-app'); @@ -372,17 +313,10 @@ describe('application generator', () => { "{options.outputPath}", ], }, - "lint": { - "executor": "@nx/eslint:lint", - }, "test": { - "executor": "@nx/jest:jest", "options": { - "jestConfig": "my-dir/my-forge-app/jest.config.cts", + "passWithNoTests": true, }, - "outputs": [ - "{workspaceRoot}/coverage/{projectRoot}", - ], }, }, } @@ -394,7 +328,6 @@ describe('application generator', () => { name: 'my-forge-app', directory: 'myDir', tags: 'one,two', - addPlugin: true, }); const projects = Object.fromEntries(getProjects(tree)); @@ -409,7 +342,6 @@ describe('application generator', () => { await applicationGenerator(tree, { name: 'my-forge-app', directory: 'my-dir/my-forge-app/', - addPlugin: true, }); [ @@ -472,17 +404,183 @@ describe('application generator', () => { }); }); + describe('TypeScript version', () => { + const setTypeScriptVersion = (version: string) => + devkit.updateJson(tree, 'package.json', (json) => ({ + ...json, + devDependencies: { ...json.devDependencies, typescript: version }, + })); + + it('should resolve modules with node10 on TypeScript 5', async () => { + setTypeScriptVersion('~5.9.2'); + + await applicationGenerator(tree, { directory: 'my-forge-app' }); + + expect( + readJson(tree, 'my-forge-app/tsconfig.app.json').compilerOptions + ).toEqual( + expect.objectContaining({ + module: 'commonjs', + moduleResolution: 'node10', + }) + ); + }); + + it('should resolve modules with bundler on TypeScript 6', async () => { + setTypeScriptVersion('~6.0.3'); + + await applicationGenerator(tree, { directory: 'my-forge-app' }); + + expect( + readJson(tree, 'my-forge-app/tsconfig.app.json').compilerOptions + ).toEqual( + expect.objectContaining({ + module: 'commonjs', + moduleResolution: 'bundler', + }) + ); + }); + }); + + describe('dependencies', () => { + it('should keep existing versions of Forge dependencies', async () => { + devkit.updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@forge/api': '^8.3.0', + '@forge/resolver': '^2.0.1', + }, + })); + + await applicationGenerator(tree, { directory: 'my-forge-app' }); + + expect(readJson(tree, 'package.json').dependencies).toEqual( + expect.objectContaining({ + '@forge/api': '^8.3.0', + '@forge/resolver': '^2.0.1', + }) + ); + }); + }); + describe('--unit-test-runner none', () => { it('should not generate test configuration', async () => { await applicationGenerator(tree, { directory: 'my-forge-app', unitTestRunner: 'none', - addPlugin: true, }); expect(tree.exists('jest.config.ts')).toBeFalsy(); expect(tree.exists('my-forge-app/tsconfig.spec.json')).toBeFalsy(); + expect( + readJson(tree, 'my-forge-app/tsconfig.app.json') + ).not.toHaveProperty('exclude'); expect(tree.exists('my-forge-app/jest.config.ts')).toBeFalsy(); expect(tree.exists(jestConfigPath('my-forge-app'))).toBeFalsy(); + expect( + readProjectConfiguration(tree, 'my-forge-app').targets?.test + ).toBeUndefined(); + expect(readNxJson(tree).plugins ?? []).not.toContainEqual( + expect.objectContaining({ plugin: '@nx/jest/plugin' }) + ); + }); + }); + + describe('--unit-test-runner vitest', () => { + it('should set up vitest instead of jest', async () => { + await applicationGenerator(tree, { + directory: 'my-forge-app', + unitTestRunner: 'vitest', + }); + + expect(tree.exists('my-forge-app/vitest.config.mts')).toBeTruthy(); + expect(tree.exists(jestConfigPath('my-forge-app'))).toBeFalsy(); + expect( + readJson(tree, 'my-forge-app/tsconfig.spec.json').compilerOptions.types + ).toContain('vitest'); + const { exclude } = readJson(tree, 'my-forge-app/tsconfig.app.json'); + expect(exclude).toEqual( + expect.arrayContaining(['vitest.config.mts', 'src/**/*.spec.ts']) + ); + expect(exclude).not.toEqual( + expect.arrayContaining([expect.stringMatching(/^jest\.config/)]) + ); + expect(readNxJson(tree).plugins).toContainEqual( + expect.objectContaining({ plugin: '@nx/vitest' }) + ); + expect(readNxJson(tree).plugins ?? []).not.toContainEqual( + expect.objectContaining({ plugin: '@nx/jest/plugin' }) + ); + expect(readJson(tree, 'package.json').devDependencies).toEqual( + expect.objectContaining({ '@nx/vitest': expect.any(String) }) + ); + expect(readJson(tree, 'package.json').devDependencies).not.toHaveProperty( + '@nx/jest' + ); + }); + + it('should pass with no tests', async () => { + await applicationGenerator(tree, { + directory: 'my-forge-app', + unitTestRunner: 'vitest', + }); + + expect(tree.read('my-forge-app/vitest.config.mts', 'utf-8')).toContain( + 'passWithNoTests: true' + ); + }); + }); + + describe('--linter', () => { + it('should not set up linting with --linter=none', async () => { + await applicationGenerator(tree, { + directory: 'my-forge-app', + linter: 'none', + }); + + expect(tree.exists(eslintConfigPath('my-forge-app'))).toBeFalsy(); + expect(readNxJson(tree).plugins ?? []).not.toContainEqual( + expect.objectContaining({ plugin: '@nx/eslint/plugin' }) + ); + }); + + it('should enable typed linting with --enableTypedLinting', async () => { + await applicationGenerator(tree, { + directory: 'my-forge-app', + enableTypedLinting: true, + }); + + const eslintConfig = tree.read(eslintConfigPath('my-forge-app'), 'utf-8'); + expect(eslintConfig).toContain('projectService: true'); + expect(eslintConfig).toContain('tsconfigRootDir: import.meta.dirname'); + }); + }); + + describe('--rootProject', () => { + it('should build root projects into the Forge output path', async () => { + await applicationGenerator(tree, { + directory: '.', + name: 'my-forge-app', + rootProject: true, + }); + + expect(tree.read('webpack.config.js', 'utf-8')).toContain( + `outputPath: './dist/src'` + ); + }); + + it('should build root esbuild projects into the Forge output path', async () => { + await applicationGenerator(tree, { + directory: '.', + name: 'my-forge-app', + rootProject: true, + bundler: 'esbuild', + }); + + expect( + readProjectConfiguration(tree, 'my-forge-app').targets?.build?.options + ?.outputPath + ).toEqual('dist/src'); }); }); @@ -492,7 +590,6 @@ describe('application generator', () => { directory: 'my-forge-app', tags: 'one,two', swcJest: true, - addPlugin: true, } as ApplicationGeneratorOptions); expect(tree.read(jestConfigPath('my-forge-app'), 'utf-8')) @@ -518,7 +615,6 @@ describe('application generator', () => { directory: 'my-forge-app', tags: 'one,two', babelJest: true, - addPlugin: true, } as ApplicationGeneratorOptions); expect(tree.read(jestConfigPath('my-forge-app'), 'utf-8')) @@ -543,7 +639,6 @@ describe('application generator', () => { await applicationGenerator(tree, { directory: 'my-forge-app', js: true, - addPlugin: true, } as ApplicationGeneratorOptions); expect(tree.exists(`my-forge-app/jest.config.js`)).toBeTruthy(); @@ -557,17 +652,13 @@ describe('application generator', () => { const tsConfigApp = readJson(tree, 'my-forge-app/tsconfig.app.json'); expect(tsConfigApp.include).toEqual(['src/**/*.ts', 'src/**/*.js']); - expect(tsConfigApp.exclude.sort()).toEqual( - [ - 'jest.config.ts', - 'jest.config.cts', - 'src/**/*.spec.ts', - 'src/**/*.test.ts', - 'jest.config.js', - 'src/**/*.spec.js', - 'src/**/*.test.js', - ].sort() - ); + expect(tsConfigApp.exclude).toEqual([ + 'jest.config.js', + 'src/**/*.spec.ts', + 'src/**/*.test.ts', + 'src/**/*.spec.js', + 'src/**/*.test.js', + ]); }); it('should generate js files for nested libs as well', async () => { @@ -575,7 +666,6 @@ describe('application generator', () => { name: 'my-forge-app', directory: 'my-dir/my-forge-app/', js: true, - addPlugin: true, } as ApplicationGeneratorOptions); expect(tree.exists(`my-dir/my-forge-app/jest.config.js`)).toBeTruthy(); expect(tree.exists('my-dir/my-forge-app/src/index.js')).toBeTruthy(); @@ -584,23 +674,17 @@ describe('application generator', () => { describe('--skipFormat', () => { it('should format files by default', async () => { - jest.spyOn(devkit, 'formatFiles'); - await applicationGenerator(tree, { directory: 'my-forge-app', - addPlugin: true, }); expect(devkit.formatFiles).toHaveBeenCalled(); }); it('should not format files when --skipFormat=true', async () => { - jest.spyOn(devkit, 'formatFiles'); - await applicationGenerator(tree, { directory: 'my-forge-app', skipFormat: true, - addPlugin: true, }); expect(devkit.formatFiles).not.toHaveBeenCalled(); diff --git a/packages/nx-forge/src/generators/application/generator.ts b/packages/nx-forge/src/generators/application/generator.ts index d06faec..1a7195c 100644 --- a/packages/nx-forge/src/generators/application/generator.ts +++ b/packages/nx-forge/src/generators/application/generator.ts @@ -4,14 +4,15 @@ import { GeneratorCallback, joinPathFragments, NX_VERSION, + readProjectConfiguration, runTasksInSerial, Tree, updateJson, + updateProjectConfiguration, updateTsConfigsToJs, } from '@nx/devkit'; -import { lintProjectGenerator } from '@nx/eslint'; -import { configurationGenerator } from '@nx/jest'; -import { initGenerator as jsInitGenerator, tsConfigBaseOptions } from '@nx/js'; +import { initGenerator as jsInitGenerator } from '@nx/js'; +import { addLintingToProject, getTsConfigBaseOptions } from '@nx/js/internal'; import initGenerator from '../init/generator'; import { ApplicationGeneratorOptions, NormalizedOptions } from './schema'; import { addProject, addAppFiles, normalizeOptions } from './lib'; @@ -23,7 +24,7 @@ function updateTsConfigOptions(tree: Tree, options: NormalizedOptions) { if (options.rootProject) { return { compilerOptions: { - ...tsConfigBaseOptions, + ...getTsConfigBaseOptions(tree), ...json.compilerOptions, esModuleInterop: true, }, @@ -43,17 +44,25 @@ function updateTsConfigOptions(tree: Tree, options: NormalizedOptions) { }); } -export async function applicationGenerator( - tree: Tree, - schema: ApplicationGeneratorOptions -) { - return await applicationGeneratorInternal(tree, { - addPlugin: false, - ...schema, +// There are no tests by default, so set `--passWithNoTests` to avoid test failure on new project. +function addPassWithNoTests(tree: Tree, projectName: string) { + const projectConfig = readProjectConfiguration(tree, projectName); + updateProjectConfiguration(tree, projectName, { + ...projectConfig, + targets: { + ...projectConfig.targets, + test: { + ...projectConfig.targets?.test, + options: { + ...projectConfig.targets?.test?.options, + passWithNoTests: true, + }, + }, + }, }); } -export async function applicationGeneratorInternal( +export async function applicationGenerator( tree: Tree, rawOptions: ApplicationGeneratorOptions ): Promise { @@ -63,9 +72,7 @@ export async function applicationGeneratorInternal( const jsInitTask = await jsInitGenerator(tree, { ...rawOptions, - tsConfigName: rawOptions.rootProject - ? 'tsconfig.json' - : 'tsconfig.base.json', + tsConfigName: options.rootProject ? 'tsconfig.json' : 'tsconfig.base.json', skipFormat: true, }); tasks.push(jsInitTask); @@ -85,7 +92,6 @@ export async function applicationGeneratorInternal( const webpackInitTask = await webpackInitGenerator(tree, { skipPackageJson: options.skipPackageJson, skipFormat: true, - addPlugin: options.addPlugin, }); tasks.push(webpackInitTask); } @@ -95,24 +101,24 @@ export async function applicationGeneratorInternal( updateTsConfigOptions(tree, options); - if (options.linter === 'eslint') { - const lintTask = await lintProjectGenerator(tree, { + if (options.linter !== 'none') { + const lintTask = await addLintingToProject(tree, { linter: options.linter, project: options.name, tsConfigPaths: [ joinPathFragments(options.appProjectRoot, 'tsconfig.app.json'), ], unitTestRunner: options.unitTestRunner, - skipFormat: true, - setParserOptionsProject: options.setParserOptionsProject, + enableTypedLinting: options.enableTypedLinting, rootProject: options.rootProject, - addPlugin: options.addPlugin, }); tasks.push(lintTask); } if (options.unitTestRunner === 'jest') { - const jestTask = await configurationGenerator(tree, { + const { configurationGenerator: jestConfigurationGenerator } = + ensurePackage('@nx/jest', NX_VERSION); + const jestTask = await jestConfigurationGenerator(tree, { ...options, project: options.name, setupFile: 'none', @@ -123,6 +129,26 @@ export async function applicationGeneratorInternal( skipFormat: true, }); tasks.push(jestTask); + addPassWithNoTests(tree, options.name); + } else if (options.unitTestRunner === 'vitest') { + ensurePackage('@nx/vitest', NX_VERSION); + // CommonJS `require` instead of dynamic ESM `import`: `ensurePackage` + // exposes the temp install via `Module._initPaths`, which ESM ignores. + const { + configurationGenerator: vitestConfigurationGenerator, + }: typeof import('@nx/vitest/generators') = require('@nx/vitest/generators'); + const vitestTask = await vitestConfigurationGenerator(tree, { + project: options.name, + uiFramework: 'none', + coverageProvider: 'v8', + testEnvironment: 'node', + runtimeTsconfigFileName: 'tsconfig.app.json', + // There are no tests by default, so avoid failing `nx test` on a new app. + passWithNoTests: true, + skipPackageJson: options.skipPackageJson, + skipFormat: true, + }); + tasks.push(vitestTask); } if (options.js) { diff --git a/packages/nx-forge/src/generators/application/lib/add-app-files.ts b/packages/nx-forge/src/generators/application/lib/add-app-files.ts index fd7d136..8f70735 100644 --- a/packages/nx-forge/src/generators/application/lib/add-app-files.ts +++ b/packages/nx-forge/src/generators/application/lib/add-app-files.ts @@ -6,8 +6,8 @@ import { toJS, } from '@nx/devkit'; import { getRelativePathToRootTsConfig } from '@nx/js'; +import { getTsConfigModuleResolution } from '@nx/js/internal'; import type { NormalizedOptions } from '../schema'; -import { hasWebpackPlugin } from '../../../utils/has-webpack-plugin'; export function addAppFiles(tree: Tree, options: NormalizedOptions): void { generateFiles( @@ -19,24 +19,19 @@ export function addAppFiles(tree: Tree, options: NormalizedOptions): void { name: options.name, root: options.appProjectRoot, offset: offsetFromRoot(options.appProjectRoot), + // `bundler` requires an ES `module` before TypeScript 6, which rejects + // the `node10` resolution that `commonjs` apps need on TypeScript 5. + moduleResolution: getTsConfigModuleResolution(tree), rootTsConfigPath: getRelativePathToRootTsConfig( tree, options.appProjectRoot ), - webpackPluginOptions: - hasWebpackPlugin(tree) && options.addPlugin - ? { - outputPath: joinPathFragments( - 'dist', - (options.rootProject ? options.name : options.appProjectRoot) ?? - '', - 'src' - ), - main: './src/index' + (options.js ? '.js' : '.ts'), - tsConfig: './tsconfig.app.json', - assets: ['./src/assets'], - } - : null, + webpackPluginOptions: { + outputPath: joinPathFragments(options.outputPath, 'src'), + main: './src/index' + (options.js ? '.js' : '.ts'), + tsConfig: './tsconfig.app.json', + assets: ['./src/assets'], + }, } ); diff --git a/packages/nx-forge/src/generators/application/lib/add-project-dependencies.ts b/packages/nx-forge/src/generators/application/lib/add-project-dependencies.ts index 2b4011e..5eb0119 100644 --- a/packages/nx-forge/src/generators/application/lib/add-project-dependencies.ts +++ b/packages/nx-forge/src/generators/application/lib/add-project-dependencies.ts @@ -75,8 +75,11 @@ export async function addProjectDependencies( tslib: tsLibVersion, }, { - ...bundlers[options.bundler ?? 'webpack'], + ...bundlers[options.bundler], '@types/node': typesNodeVersion, - } + }, + undefined, + // Keep the versions of dependencies that the workspace already uses. + true ); } diff --git a/packages/nx-forge/src/generators/application/lib/add-project.ts b/packages/nx-forge/src/generators/application/lib/add-project.ts index 3a1330e..3b6f710 100644 --- a/packages/nx-forge/src/generators/application/lib/add-project.ts +++ b/packages/nx-forge/src/generators/application/lib/add-project.ts @@ -7,42 +7,6 @@ import { } from '@nx/devkit'; import { NormalizedOptions } from '../schema'; import { addBuildTargetDefaults } from '@nx/devkit/internal'; -import { hasWebpackPlugin } from '../../../utils/has-webpack-plugin'; - -function getWebpackBuildConfig( - project: ProjectConfiguration, - options: NormalizedOptions -): TargetConfiguration { - return { - executor: `@nx/webpack:webpack`, - outputs: ['{options.outputPath}'], - defaultConfiguration: 'production', - options: { - target: 'node', - compiler: 'tsc', - outputPath: joinPathFragments( - 'dist', - (options.rootProject ? options.name : options.appProjectRoot) ?? '', - 'src' - ), - main: joinPathFragments( - project.sourceRoot ?? '', - 'index' + (options.js ? '.js' : '.ts') - ), - outputFileName: 'index.js', - tsConfig: joinPathFragments(options.appProjectRoot, 'tsconfig.app.json'), - assets: [joinPathFragments(project.sourceRoot ?? '', 'assets')], - webpackConfig: joinPathFragments( - options.appProjectRoot, - 'webpack.config.js' - ), - }, - configurations: { - development: {}, - production: {}, - }, - }; -} function getEsBuildConfig( project: ProjectConfiguration, @@ -54,11 +18,7 @@ function getEsBuildConfig( defaultConfiguration: 'production', options: { platform: 'node', - outputPath: joinPathFragments( - 'dist', - (options.rootProject ? options.name : options.appProjectRoot) ?? '', - 'src' - ), + outputPath: joinPathFragments(options.outputPath, 'src'), // Use CJS for Node apps for widest compatibility. format: ['cjs'], bundle: true, @@ -98,21 +58,17 @@ export function addProject(tree: Tree, options: NormalizedOptions) { root: options.appProjectRoot, sourceRoot: joinPathFragments(options.appProjectRoot, 'src'), projectType: 'application', - targets: {}, tags: options.parsedTags, }; if (options.bundler === 'esbuild') { addBuildTargetDefaults(tree, '@nx/esbuild:esbuild', 'build'); - project.targets ??= {}; - project.targets.build = getEsBuildConfig(project, options); - } else if (options.bundler === 'webpack') { - if (!hasWebpackPlugin(tree) && !options.addPlugin) { - addBuildTargetDefaults(tree, `@nx/webpack:webpack`, 'build'); - project.targets ??= {}; - project.targets.build = getWebpackBuildConfig(project, options); - } } - addProjectConfiguration(tree, options.name, project); + const targets: ProjectConfiguration['targets'] = + options.bundler === 'esbuild' + ? { build: getEsBuildConfig(project, options) } + : {}; + + addProjectConfiguration(tree, options.name, { ...project, targets }); } diff --git a/packages/nx-forge/src/generators/application/lib/normalize-options.ts b/packages/nx-forge/src/generators/application/lib/normalize-options.ts index 5672518..b97a4ad 100644 --- a/packages/nx-forge/src/generators/application/lib/normalize-options.ts +++ b/packages/nx-forge/src/generators/application/lib/normalize-options.ts @@ -1,6 +1,7 @@ -import { readNxJson, Tree } from '@nx/devkit'; +import { Tree } from '@nx/devkit'; import type { ApplicationGeneratorOptions, NormalizedOptions } from '../schema'; import { determineProjectNameAndRootOptions } from '@nx/devkit/internal'; +import { getForgeOutputPath } from '../../../shared/forge-output-path'; export async function normalizeOptions( tree: Tree, @@ -13,28 +14,20 @@ export async function normalizeOptions( directory: options.directory, rootProject: options.rootProject, }); - options.rootProject = appProjectRoot === '.'; - - options.bundler = options.bundler ?? 'webpack'; const parsedTags = options.tags ? options.tags.split(',').map((s) => s.trim()) : []; - const nxJson = readNxJson(tree); - const addPlugin = - options.addPlugin ?? - (process.env.NX_ADD_PLUGINS !== 'false' && - nxJson?.useInferencePlugins !== false); - return { ...options, - addPlugin, name: appProjectName, appProjectRoot, + outputPath: getForgeOutputPath(appProjectRoot), parsedTags, + bundler: options.bundler ?? 'webpack', linter: options.linter ?? 'eslint', unitTestRunner: options.unitTestRunner ?? 'jest', - rootProject: options.rootProject ?? false, + rootProject: appProjectRoot === '.', }; } diff --git a/packages/nx-forge/src/generators/application/schema.d.ts b/packages/nx-forge/src/generators/application/schema.d.ts index 5f0800c..56818dc 100644 --- a/packages/nx-forge/src/generators/application/schema.d.ts +++ b/packages/nx-forge/src/generators/application/schema.d.ts @@ -1,28 +1,28 @@ -import type { LinterType } from '@nx/eslint'; - -interface ApplicationGeneratorOptions { +export interface ApplicationGeneratorOptions { directory: string; name?: string; skipFormat?: boolean; skipPackageJson?: boolean; - linter?: LinterType; + linter?: 'eslint' | 'none'; tags?: string; bundler?: 'esbuild' | 'webpack'; - unitTestRunner?: 'jest' | 'none'; + unitTestRunner?: 'jest' | 'vitest' | 'none'; swcJest?: boolean; /** @deprecated use `swcJest` instead */ babelJest?: boolean; js?: boolean; - setParserOptionsProject?: boolean; + enableTypedLinting?: boolean; rootProject?: boolean; - addPlugin?: boolean; } -interface NormalizedOptions extends ApplicationGeneratorOptions { +export interface NormalizedOptions extends ApplicationGeneratorOptions { name: string; - addPlugin: boolean; appProjectRoot: string; - linter: LinterType; - unitTestRunner: 'jest' | 'none'; + /** Workspace-relative directory that the Forge app is packaged into. */ + outputPath: string; + bundler: 'esbuild' | 'webpack'; + linter: 'eslint' | 'none'; + unitTestRunner: 'jest' | 'vitest' | 'none'; + rootProject: boolean; parsedTags: string[]; } diff --git a/packages/nx-forge/src/generators/application/schema.json b/packages/nx-forge/src/generators/application/schema.json index e042912..6efab9a 100644 --- a/packages/nx-forge/src/generators/application/schema.json +++ b/packages/nx-forge/src/generators/application/schema.json @@ -43,7 +43,7 @@ "unitTestRunner": { "description": "Test runner to use for unit tests.", "type": "string", - "enum": ["jest", "none"], + "enum": ["jest", "vitest", "none"], "default": "jest", "x-priority": "important", "x-prompt": "Which unit test runner would you like to use?" @@ -76,9 +76,9 @@ "description": "Generate JavaScript files rather than TypeScript files.", "default": false }, - "setParserOptionsProject": { + "enableTypedLinting": { "type": "boolean", - "description": "Whether or not to configure the ESLint `parserOptions.project` option. We do not do this by default for lint performance reasons.", + "description": "Whether to enable typed linting. For flat configs, this configures the recommended `parserOptions.projectService` and `tsconfigRootDir`. For legacy `.eslintrc` configs, this configures `parserOptions.project`. We do not enable this by default for lint performance reasons.", "default": false }, "rootProject": { diff --git a/packages/nx-forge/src/graph/create-dependencies.ts b/packages/nx-forge/src/graph/create-dependencies.ts index 78b6811..060e920 100644 --- a/packages/nx-forge/src/graph/create-dependencies.ts +++ b/packages/nx-forge/src/graph/create-dependencies.ts @@ -74,7 +74,9 @@ export const createDependencies: CreateDependencies = async ( for (const manifestFile of changed.filter((f) => f.file.endsWith('manifest.yml') )) { - logger.info(`[nx-forge] Processing ${projectName}:${manifestFile.file}`); + logger.verbose( + `[nx-forge] Processing ${projectName}:${manifestFile.file}` + ); const uiResourceDependencies = await getUIResourceDependencies( [projectName, manifestFile], context diff --git a/packages/nx-forge/src/graph/create-nodes.spec.ts b/packages/nx-forge/src/graph/create-nodes.spec.ts new file mode 100644 index 0000000..e3c2be9 --- /dev/null +++ b/packages/nx-forge/src/graph/create-nodes.spec.ts @@ -0,0 +1,88 @@ +import { CreateNodesContextV2, CreateNodesResult } from '@nx/devkit'; +import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'fs'; +import { tmpdir } from 'os'; +import { join } from 'path'; +import { createNodesV2 } from './create-nodes'; + +describe('createNodesV2', () => { + let workspaceRoot: string; + + const addForgeProject = (projectRoot: string, files: string[]) => { + mkdirSync(join(workspaceRoot, projectRoot), { recursive: true }); + files.forEach((file) => + writeFileSync(join(workspaceRoot, projectRoot, file), '') + ); + }; + + const createNodes = async ( + manifestFilePath: string + ): Promise => { + const context: CreateNodesContextV2 = { + workspaceRoot, + nxJsonConfiguration: {}, + }; + const [[, result]] = await createNodesV2[1]( + [manifestFilePath], + undefined, + context + ); + return result; + }; + + const forgeOutputPaths = ( + result: CreateNodesResult | undefined, + projectRoot: string + ) => + Object.fromEntries( + Object.entries(result?.projects?.[projectRoot]?.targets ?? {}).map( + ([targetName, target]) => [ + targetName, + target.options?.outputPath ?? target.options?.cwd, + ] + ) + ); + + beforeEach(() => { + workspaceRoot = mkdtempSync(join(tmpdir(), 'nx-forge-create-nodes-')); + }); + + afterEach(() => { + rmSync(workspaceRoot, { recursive: true, force: true }); + }); + + it('should package nested Forge apps into dist/', async () => { + addForgeProject('apps/my-app', ['manifest.yml', 'project.json']); + + const result = await createNodes('apps/my-app/manifest.yml'); + + expect(forgeOutputPaths(result, 'apps/my-app')).toEqual({ + register: '{workspaceRoot}/dist/apps/my-app', + package: '{workspaceRoot}/dist/apps/my-app', + tunnel: '{workspaceRoot}/dist/apps/my-app', + deploy: '{workspaceRoot}/dist/apps/my-app', + forge: '{workspaceRoot}/dist/apps/my-app', + }); + }); + + it('should package root Forge apps into dist', async () => { + addForgeProject('.', ['manifest.yml', 'project.json']); + + const result = await createNodes('manifest.yml'); + + expect(forgeOutputPaths(result, '.')).toEqual({ + register: '{workspaceRoot}/dist', + package: '{workspaceRoot}/dist', + tunnel: '{workspaceRoot}/dist', + deploy: '{workspaceRoot}/dist', + forge: '{workspaceRoot}/dist', + }); + }); + + it('should not create a project without a project.json', async () => { + addForgeProject('apps/my-app', ['manifest.yml']); + + const result = await createNodes('apps/my-app/manifest.yml'); + + expect(result).toEqual({}); + }); +}); diff --git a/packages/nx-forge/src/graph/create-nodes.ts b/packages/nx-forge/src/graph/create-nodes.ts index d0db2b3..b8b4e05 100644 --- a/packages/nx-forge/src/graph/create-nodes.ts +++ b/packages/nx-forge/src/graph/create-nodes.ts @@ -1,29 +1,30 @@ import { readdirSync } from 'fs'; import { dirname, join } from 'path'; -import { CreateNodesContext, createNodesFromFiles, CreateNodes, ProjectConfiguration } from '@nx/devkit'; +import { + CreateNodesContext, + createNodesFromFiles, + CreateNodes, + ProjectConfiguration, +} from '@nx/devkit'; import { getRegisterConfig } from '../shared/targets/get-register-config'; import { getTunnelConfig } from '../shared/targets/get-tunnel-config'; import { getDeployConfig } from '../shared/targets/get-deploy-config'; import { getForgeCliConfig } from '../shared/targets/get-forge-cli-config'; import { getPackageConfig } from '../shared/targets/get-package-config'; +import { getForgeOutputPath } from '../shared/forge-output-path'; -type ForgeProjectTargets = Pick; +const buildForgeProjectTargets = ( + projectRoot: string +): ProjectConfiguration['targets'] => { + const outputPath = `{workspaceRoot}/${getForgeOutputPath(projectRoot)}`; -const buildForgeProjectTargets = (projectRoot: string): ForgeProjectTargets => { - const outputPath = - projectRoot === '.' - ? `{projectRoot}/dist}` - : `{workspaceRoot}/dist/{projectRoot}`; - - const targets: ProjectConfiguration['targets'] = {}; - - targets.register = getRegisterConfig({ outputPath }); - targets.package = getPackageConfig({ outputPath }); - targets.tunnel = getTunnelConfig({ outputPath }); - targets.deploy = getDeployConfig({ outputPath }); - targets.forge = getForgeCliConfig({ outputPath }); - - return targets; + return { + register: getRegisterConfig({ outputPath }), + package: getPackageConfig({ outputPath }), + tunnel: getTunnelConfig({ outputPath }), + deploy: getDeployConfig({ outputPath }), + forge: getForgeCliConfig({ outputPath }), + }; }; const forgeManifestGlob = '**/manifest.yml'; diff --git a/packages/nx-forge/src/migrations/update-2-3-0/add-nx-forge-plugin.spec.ts b/packages/nx-forge/src/migrations/update-2-3-0/add-nx-forge-plugin.spec.ts deleted file mode 100644 index f4941c7..0000000 --- a/packages/nx-forge/src/migrations/update-2-3-0/add-nx-forge-plugin.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import { readJson, Tree, writeJson } from '@nx/devkit'; - -import update from './add-nx-forge-plugin'; - -describe('update 2.2.0 migration: add-nx-forge-plugin', () => { - let tree: Tree; - - beforeEach(() => { - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - }); - - it('should add plugin if it does not exist', async () => { - const nxJsonBefore = readJson(tree, 'nx.json'); - expect(nxJsonBefore.plugins).toBeUndefined(); - - await update(tree); - - const nxJsonAfter = readJson(tree, 'nx.json'); - expect(nxJsonAfter.plugins).toContain('@toolsplus/nx-forge'); - }); - - it('should do nothing if plugin exists', async () => { - const existingPlugins = ['plugin-1', '@toolsplus/nx-forge', 'plugin-2']; - const nxJsonBefore = readJson(tree, 'nx.json'); - nxJsonBefore.plugins = nxJsonBefore.plugins || []; - nxJsonBefore.plugins = existingPlugins; - writeJson(tree, 'nx.json', nxJsonBefore); - - expect(nxJsonBefore.plugins).toContain('@toolsplus/nx-forge'); - - await update(tree); - - const nxJsonAfter = readJson(tree, 'nx.json'); - expect(nxJsonAfter.plugins).toEqual(existingPlugins); - }); -}); diff --git a/packages/nx-forge/src/migrations/update-2-3-0/add-nx-forge-plugin.ts b/packages/nx-forge/src/migrations/update-2-3-0/add-nx-forge-plugin.ts deleted file mode 100644 index 4e650cf..0000000 --- a/packages/nx-forge/src/migrations/update-2-3-0/add-nx-forge-plugin.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NxJsonConfiguration, readJson, Tree, writeJson } from '@nx/devkit'; - -export default function update(host: Tree) { - const nxJson: NxJsonConfiguration = readJson(host, 'nx.json'); - nxJson.plugins = nxJson.plugins || []; - if (!nxJson.plugins.some((x) => x === '@toolsplus/nx-forge')) { - nxJson.plugins.push('@toolsplus/nx-forge'); - writeJson(host, 'nx.json', nxJson); - } -} diff --git a/packages/nx-forge/src/migrations/update-2-3-0/remove-implicit-custom-ui-dependencies.spec.ts b/packages/nx-forge/src/migrations/update-2-3-0/remove-implicit-custom-ui-dependencies.spec.ts deleted file mode 100644 index d1ddb8a..0000000 --- a/packages/nx-forge/src/migrations/update-2-3-0/remove-implicit-custom-ui-dependencies.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import { - joinPathFragments, - readProjectConfiguration, - Tree, - updateProjectConfiguration, -} from '@nx/devkit'; -import update from './remove-implicit-custom-ui-dependencies'; -import generator from '../../generators/application/generator'; -import { readManifestYml, writeManifestYml } from './utils/manifest'; -import { ManifestSchema } from '@forge/manifest'; -describe('update 2.2.0 migration: remove-implicit-custom-ui-dependencies.spec', () => { - let tree: Tree; - - beforeEach(() => { - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - }); - - it('should remove Custom UI dependencies if they exist', async () => { - await generator(tree, { name: 'my-app', directory: 'myApp' }); - const project = readProjectConfiguration(tree, 'my-app'); - - const customUIProjectName = 'custom-ui-project-1'; - - const manifestPath = joinPathFragments(project.root, 'manifest.yml'); - const manifest = await readManifestYml(tree, manifestPath); - const patchedManifest = { - ...manifest, - modules: { - ...manifest.modules, - 'jira:globalPage': [ - { - key: 'global-page', - title: 'global page', - resource: 'custom-ui-resource-key', - resolver: { - function: 'resolver', - }, - }, - ], - }, - resources: [ - ...(manifest.resources || []), - { - key: 'custom-ui-resource-key', - path: customUIProjectName, - }, - ], - }; - writeManifestYml(tree, manifestPath, patchedManifest as ManifestSchema); - - const nonCustomUIImplicitDependencies = ['dep-1', 'dep-2']; - updateProjectConfiguration(tree, project.name, { - ...project, - implicitDependencies: [ - ...nonCustomUIImplicitDependencies, - customUIProjectName, - ], - }); - - await update(tree); - - const projectConfigurationAfter = readProjectConfiguration(tree, 'my-app'); - expect(projectConfigurationAfter.implicitDependencies).toEqual( - nonCustomUIImplicitDependencies - ); - }); -}); diff --git a/packages/nx-forge/src/migrations/update-2-3-0/remove-implicit-custom-ui-dependencies.ts b/packages/nx-forge/src/migrations/update-2-3-0/remove-implicit-custom-ui-dependencies.ts deleted file mode 100644 index ce01bbf..0000000 --- a/packages/nx-forge/src/migrations/update-2-3-0/remove-implicit-custom-ui-dependencies.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { - getProjects, - joinPathFragments, - ProjectConfiguration, - Tree, - updateProjectConfiguration, -} from '@nx/devkit'; -import { extractUIResourceProjectNames } from '../../utils/forge/manifest-yml'; -import { readManifestYml } from './utils/manifest'; - -export default async function update(host: Tree) { - const projects = getProjects(host); - - const isForgeProject = (config: ProjectConfiguration): boolean => { - return ( - config.projectType === 'application' && - host.exists(joinPathFragments(config.root, 'manifest.yml')) - ); - }; - - for (const [name, config] of projects.entries()) { - if (config && isForgeProject(config)) { - if ( - config.implicitDependencies && - config.implicitDependencies.length > 0 - ) { - const manifest = await readManifestYml( - host, - joinPathFragments(config.root, 'manifest.yml') - ); - const customUIProjectNames = extractUIResourceProjectNames(manifest); - config.implicitDependencies = config.implicitDependencies.filter( - (d) => !customUIProjectNames.includes(d) - ); - updateProjectConfiguration(host, name, config); - } - } - } -} diff --git a/packages/nx-forge/src/migrations/update-2-3-0/utils/manifest.ts b/packages/nx-forge/src/migrations/update-2-3-0/utils/manifest.ts deleted file mode 100644 index 90e16bb..0000000 --- a/packages/nx-forge/src/migrations/update-2-3-0/utils/manifest.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Tree } from '@nx/devkit'; -import { readYaml, writeYaml } from './yml'; -import { ManifestSchema, SchemaValidator } from '@forge/manifest'; -import * as FULL_SCHEMA from '@forge/manifest/out/schema/manifest-schema.json'; - -const manifestSchemaValidator = new SchemaValidator( - FULL_SCHEMA -); - -export const readManifestYml = async ( - tree: Tree, - path: string -): Promise => { - const result = await manifestSchemaValidator.validate({ - yamlContent: readYaml(tree, path), - }); - - if (result.success && result.manifestObject?.typedContent) { - return result.manifestObject.typedContent; - } - - throw new Error(`Cannot validate manifest ${path}: ${result.errors}`); -}; - -export const writeManifestYml = ( - tree: Tree, - path: string, - value: ManifestSchema -) => { - writeYaml(tree, path, value); -}; diff --git a/packages/nx-forge/src/migrations/update-2-3-0/utils/yml.ts b/packages/nx-forge/src/migrations/update-2-3-0/utils/yml.ts deleted file mode 100644 index 48399d5..0000000 --- a/packages/nx-forge/src/migrations/update-2-3-0/utils/yml.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Tree } from '@nx/devkit'; -import { ManifestSchema } from '@forge/manifest'; -import { dump, DumpOptions, load, LoadOptions } from 'js-yaml'; - -/** - * Reads a yaml file and parses YAML. - * - * @param tree - file system tree - * @param path - file path - * @param options - Optional YAML load options - */ -export const readYaml = ( - tree: Tree, - path: string, - options?: LoadOptions -): ManifestSchema => { - if (!tree.exists(path)) { - throw new Error(`Cannot find ${path}`); - } - try { - return load(tree.read(path, 'utf-8') ?? '', options) as ManifestSchema; - } catch (e) { - throw new Error( - `Cannot parse ${path}: ${e instanceof Error ? e.message : String(e)}` - ); - } -}; - -/** - * Writes a YAML value to the file system tree - - * @param tree File system tree - * @param path Path of YAML file in the Tree - * @param value Serializable value to write - * @param options Optional YAML serialize options - */ -export const writeYaml = ( - tree: Tree, - path: string, - value: T, - options?: DumpOptions -): void => { - tree.write(path, dump(value, options || {})); -}; diff --git a/packages/nx-forge/src/migrations/update-3-0-0-webpack-config-setup/update-3-0-0-webpack-config-setup.spec.ts b/packages/nx-forge/src/migrations/update-3-0-0-webpack-config-setup/update-3-0-0-webpack-config-setup.spec.ts deleted file mode 100644 index 721f370..0000000 --- a/packages/nx-forge/src/migrations/update-3-0-0-webpack-config-setup/update-3-0-0-webpack-config-setup.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import { addProjectConfiguration, Tree } from '@nx/devkit'; - -import webpackConfigSetup from './update-3-0-0-webpack-config-setup'; - -describe('3.0.0 migration (setup webpack.config file)', () => { - let tree: Tree; - - const executor = '@toolsplus/nx-forge:build'; - - beforeEach(() => { - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - }); - - it('should create webpack.config.js for projects that did not set webpackConfig', async () => { - addProjectConfiguration(tree, 'myapp', { - root: 'apps/myapp', - targets: { - build: { - executor, - options: {}, - }, - }, - }); - - await webpackConfigSetup(tree); - - expect(tree.read('apps/myapp/webpack.config.js', 'utf-8')).toEqual( - `const { composePlugins, withNx } = require('@nx/webpack'); - -// Nx plugins for webpack. -module.exports = composePlugins(withNx(), (config) => { - // Note: This was added by an Nx Forge migration. Webpack builds are required to have a corresponding Webpack config file. - // See: https://nx.dev/recipes/webpack/webpack-config-setup - return config; -}); -` - ); - }); - - it('should not create webpack.config.js when webpackConfig is already set', async () => { - tree.write( - `apps/myapp/webpack.config.js`, - ` - module.exports = { /* CUSTOM */ }; - ` - ); - addProjectConfiguration(tree, 'myapp', { - root: 'apps/myapp', - targets: { - build: { - executor, - options: { - webpackConfig: 'apps/myapp/webpack.config.js', - }, - }, - }, - }); - - await webpackConfigSetup(tree); - - expect(tree.read('apps/myapp/webpack.config.js', 'utf-8')).toContain( - '/* CUSTOM */' - ); - }); -}); diff --git a/packages/nx-forge/src/migrations/update-3-0-0-webpack-config-setup/update-3-0-0-webpack-config-setup.ts b/packages/nx-forge/src/migrations/update-3-0-0-webpack-config-setup/update-3-0-0-webpack-config-setup.ts deleted file mode 100644 index 84a33c6..0000000 --- a/packages/nx-forge/src/migrations/update-3-0-0-webpack-config-setup/update-3-0-0-webpack-config-setup.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { - formatFiles, - readProjectConfiguration, - Tree, - updateProjectConfiguration, -} from '@nx/devkit'; -import { forEachExecutorOptions } from '@nx/devkit/internal'; - -interface LegacyBuildExecutorOptions { - webpackConfig?: string; -} - -export default async function (tree: Tree) { - const update = ( - options: LegacyBuildExecutorOptions, - projectName: string, - targetName: string, - configurationName?: string - ) => { - // There should not be any configurations, if there are skip the update - only handle the default config - if (configurationName) return; - - const projectConfiguration = readProjectConfiguration(tree, projectName); - - if (!options.webpackConfig) { - options.webpackConfig = `${projectConfiguration.root}/webpack.config.js`; - tree.write( - options.webpackConfig, - `const { composePlugins, withNx } = require('@nx/webpack'); - -// Nx plugins for webpack. -module.exports = composePlugins(withNx(), (config) => { - // Note: This was added by an Nx Forge migration. Webpack builds are required to have a corresponding Webpack config file. - // See: https://nx.dev/recipes/webpack/webpack-config-setup - return config; -}); -` - ); - - const targets = (projectConfiguration.targets ??= {}); - targets[targetName] = { ...targets[targetName], options }; - updateProjectConfiguration(tree, projectName, projectConfiguration); - } - }; - - forEachExecutorOptions( - tree, - '@toolsplus/nx-forge:build', - update - ); - - await formatFiles(tree); -} diff --git a/packages/nx-forge/src/migrations/update-9-0-0/replace-set-parser-options-project.spec.ts b/packages/nx-forge/src/migrations/update-9-0-0/replace-set-parser-options-project.spec.ts new file mode 100644 index 0000000..73a0617 --- /dev/null +++ b/packages/nx-forge/src/migrations/update-9-0-0/replace-set-parser-options-project.spec.ts @@ -0,0 +1,104 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { + addProjectConfiguration, + readJson, + readNxJson, + Tree, + updateNxJson, + writeJson, +} from '@nx/devkit'; + +import update from './replace-set-parser-options-project'; + +describe('9.0.0 migration (replace setParserOptionsProject)', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + }); + + it('should rename the option in flat and nested nx.json generator defaults', async () => { + updateNxJson(tree, { + ...readNxJson(tree), + generators: { + '@toolsplus/nx-forge:application': { + setParserOptionsProject: true, + linter: 'eslint', + }, + '@toolsplus/nx-forge': { + app: { setParserOptionsProject: false }, + }, + }, + }); + + await update(tree); + + expect(readNxJson(tree).generators).toEqual({ + '@toolsplus/nx-forge:application': { + enableTypedLinting: true, + linter: 'eslint', + }, + '@toolsplus/nx-forge': { + app: { enableTypedLinting: false }, + }, + }); + }); + + it('should rename the option in project.json generator defaults', async () => { + addProjectConfiguration(tree, 'myapp', { + root: 'apps/myapp', + generators: { + '@toolsplus/nx-forge:app': { setParserOptionsProject: true }, + }, + }); + + await update(tree); + + expect(readJson(tree, 'apps/myapp/project.json').generators).toEqual({ + '@toolsplus/nx-forge:app': { enableTypedLinting: true }, + }); + }); + + it('should rename the option in package.json generator defaults', async () => { + writeJson(tree, 'apps/myapp/package.json', { + name: 'myapp', + nx: { + tags: ['scope:myapp'], + generators: { + '@toolsplus/nx-forge': { + application: { setParserOptionsProject: true }, + }, + }, + }, + }); + + await update(tree); + + expect(readJson(tree, 'apps/myapp/package.json')).toEqual({ + name: 'myapp', + nx: { + tags: ['scope:myapp'], + generators: { + '@toolsplus/nx-forge': { + application: { enableTypedLinting: true }, + }, + }, + }, + }); + }); + + it('should not change defaults of other generators', async () => { + const generators = { + '@nx/node:application': { setParserOptionsProject: true }, + '@toolsplus/nx-forge': { + init: { setParserOptionsProject: true }, + app: null, + }, + }; + updateNxJson(tree, { ...readNxJson(tree), generators }); + + await update(tree); + + expect(readNxJson(tree).generators).toEqual(generators); + }); +}); diff --git a/packages/nx-forge/src/migrations/update-9-0-0/replace-set-parser-options-project.ts b/packages/nx-forge/src/migrations/update-9-0-0/replace-set-parser-options-project.ts new file mode 100644 index 0000000..f634924 --- /dev/null +++ b/packages/nx-forge/src/migrations/update-9-0-0/replace-set-parser-options-project.ts @@ -0,0 +1,136 @@ +import { + formatFiles, + getProjects, + joinPathFragments, + NxJsonConfiguration, + ProjectConfiguration, + readJson, + readNxJson, + Tree, + updateNxJson, + writeJson, +} from '@nx/devkit'; + +const COLLECTION = '@toolsplus/nx-forge'; +const GENERATOR_NAMES = ['application', 'app']; +const FLAT_GENERATOR_KEYS = GENERATOR_NAMES.map( + (name) => `${COLLECTION}:${name}` +); +const REMOVED = 'setParserOptionsProject'; +const REPLACEMENT = 'enableTypedLinting'; + +/** + * Generator defaults keyed either by flat generator name + * (`@toolsplus/nx-forge:application`) or by collection + * (`{ "@toolsplus/nx-forge": { "application": {} } }`). `nx.json` and + * `project.json` share this shape. + */ +type Generators = NonNullable; +type GeneratorDefaults = Generators[string]; + +const applicationGeneratorDefaults = (generators: Generators): unknown[] => [ + ...FLAT_GENERATOR_KEYS.map((key) => generators[key]), + ...GENERATOR_NAMES.map((name) => generators[COLLECTION]?.[name]), +]; + +const isRecord = (value: unknown): value is GeneratorDefaults => + typeof value === 'object' && value !== null && !Array.isArray(value); + +const hasRemovedOption = (defaults: unknown): defaults is GeneratorDefaults => + isRecord(defaults) && REMOVED in defaults; + +const usesRemovedOption = (generators: Generators): boolean => + applicationGeneratorDefaults(generators).some(hasRemovedOption); + +const renameOption = (defaults: GeneratorDefaults): GeneratorDefaults => { + if (!hasRemovedOption(defaults)) { + return defaults; + } + const { [REMOVED]: removedValue, ...rest } = defaults; + return { ...rest, [REPLACEMENT]: removedValue }; +}; + +const renameOptionInEntries = ( + entries: Generators, + keys: string[] +): Generators => + Object.fromEntries( + Object.entries(entries).map(([key, value]) => [ + key, + keys.includes(key) ? renameOption(value) : value, + ]) + ); + +const migrateGenerators = (generators: Generators): Generators => { + const migrated = renameOptionInEntries(generators, FLAT_GENERATOR_KEYS); + const nested = migrated[COLLECTION]; + return isRecord(nested) + ? { + ...migrated, + [COLLECTION]: renameOptionInEntries(nested, GENERATOR_NAMES), + } + : migrated; +}; + +/** + * `nx.json`, a `project.json`, or the `nx` key of a project's `package.json`. + */ +interface GeneratorsOwner { + generators?: Generators; +} + +interface PackageJsonWithNx { + nx?: GeneratorsOwner; +} + +/** + * Returns the owner with the option renamed, or `undefined` when its + * application generator defaults do not use the removed option. + */ +const migrateOwner = (owner: T): T | undefined => + owner.generators && usesRemovedOption(owner.generators) + ? { ...owner, generators: migrateGenerators(owner.generators) } + : undefined; + +const migrateProjectJson = (tree: Tree, path: string): void => { + const migrated = migrateOwner(readJson(tree, path)); + if (migrated) { + writeJson(tree, path, migrated); + } +}; + +const migratePackageJson = (tree: Tree, path: string): void => { + const packageJson = readJson(tree, path); + const migratedNx = packageJson.nx && migrateOwner(packageJson.nx); + if (migratedNx) { + writeJson(tree, path, { ...packageJson, nx: migratedNx }); + } +}; + +/** + * Nx 24 replaced the `setParserOptionsProject` generator option with + * `enableTypedLinting`. Rename it in the application generator defaults so + * that schema validation keeps accepting them and typed linting resolves as + * before. Each file is renamed in place, which keeps the precedence of + * `nx.json`, `package.json` and `project.json` defaults unchanged. + */ +export default async function update(tree: Tree) { + const nxJson = readNxJson(tree); + const migratedNxJson = nxJson && migrateOwner(nxJson); + if (migratedNxJson) { + updateNxJson(tree, migratedNxJson); + } + + Array.from(getProjects(tree).values()).forEach(({ root }) => { + const projectJsonPath = joinPathFragments(root, 'project.json'); + const packageJsonPath = joinPathFragments(root, 'package.json'); + if (tree.exists(projectJsonPath)) { + migrateProjectJson(tree, projectJsonPath); + } + if (tree.exists(packageJsonPath)) { + migratePackageJson(tree, packageJsonPath); + } + }); + + await formatFiles(tree); +} diff --git a/packages/nx-forge/src/shared/forge-output-path.ts b/packages/nx-forge/src/shared/forge-output-path.ts new file mode 100644 index 0000000..5d795c2 --- /dev/null +++ b/packages/nx-forge/src/shared/forge-output-path.ts @@ -0,0 +1,10 @@ +import { joinPathFragments } from '@nx/devkit'; + +/** + * Workspace-relative directory that a Forge app is packaged into. The build + * writes the app bundle to its `src` subdirectory. + * + * @param projectRoot Root of the Forge app project, `.` for a root project. + */ +export const getForgeOutputPath = (projectRoot: string): string => + joinPathFragments('dist', projectRoot); diff --git a/packages/nx-forge/src/shared/manifest/manifest-schema.ts b/packages/nx-forge/src/shared/manifest/manifest-schema.ts new file mode 100644 index 0000000..19b7738 --- /dev/null +++ b/packages/nx-forge/src/shared/manifest/manifest-schema.ts @@ -0,0 +1,9 @@ +import { readJsonFile } from '@nx/devkit'; + +/** + * Full Forge manifest JSON schema, resolved through the `./schema.json` entry + * of the `@forge/manifest` exports map, which blocks deep imports into `out/`. + */ +export const FULL_MANIFEST_SCHEMA: object = readJsonFile( + require.resolve('@forge/manifest/schema.json') +); diff --git a/packages/nx-forge/src/shared/manifest/util-manifest.spec.ts b/packages/nx-forge/src/shared/manifest/util-manifest.spec.ts index d3e24b6..3d50020 100644 --- a/packages/nx-forge/src/shared/manifest/util-manifest.spec.ts +++ b/packages/nx-forge/src/shared/manifest/util-manifest.spec.ts @@ -1,10 +1,10 @@ import { App, ManifestSchema } from '@forge/manifest'; import { + HostedResourcesSchema, resourceTypeByResourceDefinition, isResourceType, ResourceType, } from './util-manifest'; -import { HostedResourcesSchema } from '@forge/manifest/out/schema/manifest'; /** * The following test defines a manifest with resource definitions and verifies diff --git a/packages/nx-forge/src/shared/manifest/util-manifest.ts b/packages/nx-forge/src/shared/manifest/util-manifest.ts index 59da6b7..26ca3ca 100644 --- a/packages/nx-forge/src/shared/manifest/util-manifest.ts +++ b/packages/nx-forge/src/shared/manifest/util-manifest.ts @@ -1,7 +1,12 @@ -import { ManifestSchema, Modules } from '@forge/manifest'; -import { HostedResourcesSchema } from '@forge/manifest/out/schema/manifest'; +import { ManifestSchema, Modules, Resources } from '@forge/manifest'; import { logger } from '@nx/devkit'; +/** + * A single entry of the manifest `resources` list. `@forge/manifest` only + * exports the list type from its public entry point. + */ +export type HostedResourcesSchema = Resources[number]; + // https://stackoverflow.com/a/8511350/5115898 const isObject = (v: unknown): v is Record => typeof v === 'object' && v !== null && !Array.isArray(v); diff --git a/packages/nx-forge/src/test-utils/mock-devkit.ts b/packages/nx-forge/src/test-utils/mock-devkit.ts new file mode 100644 index 0000000..8595c13 --- /dev/null +++ b/packages/nx-forge/src/test-utils/mock-devkit.ts @@ -0,0 +1,21 @@ +/* + * Import this module before any other module in specs that run generators. + * + * Keeps the project graph empty while generators run against a virtual Tree, + * like @nx/devkit/internal-testing-utils/mock-project-graph, which is not + * included in the published @nx/devkit package. Without it, adding inference + * plugins reads the real workspace graph. formatFiles is wrapped so that specs + * can assert on it. + */ +jest.mock('@nx/devkit', () => { + const actual = jest.requireActual('@nx/devkit'); + return { + ...actual, + createProjectGraphAsync: jest + .fn() + .mockResolvedValue({ nodes: {}, dependencies: {} }), + formatFiles: jest.fn(actual.formatFiles), + }; +}); + +export {}; diff --git a/packages/nx-forge/src/utils/forge/manifest-yml.ts b/packages/nx-forge/src/utils/forge/manifest-yml.ts index a8cb1e4..e93b202 100644 --- a/packages/nx-forge/src/utils/forge/manifest-yml.ts +++ b/packages/nx-forge/src/utils/forge/manifest-yml.ts @@ -2,12 +2,12 @@ import { AbstractValidationProcessor, FileValidator, ManifestSchema, + ManifestValidationResult, SchemaValidator, } from '@forge/manifest'; -import * as FULL_SCHEMA from '@forge/manifest/out/schema/manifest-schema.json'; +import { FULL_MANIFEST_SCHEMA } from '../../shared/manifest/manifest-schema'; import { dump } from 'js-yaml'; import { writeFileSync } from 'fs'; -import { ManifestValidationResult } from '@forge/manifest/out/types'; import { isResourceType } from '../../shared/manifest/util-manifest'; import YamlValidator from './yaml-validator'; @@ -16,7 +16,7 @@ class ManifestYmlValidator extends AbstractValidationProcessor { super([ new FileValidator(), new YamlValidator(options), - new SchemaValidator(FULL_SCHEMA), + new SchemaValidator(FULL_MANIFEST_SCHEMA), ]); } } @@ -33,7 +33,7 @@ const schemaAndFileValidator = const schemaContentValidator: ManifestSchemaValidator = ( manifestContent: ManifestSchema ) => - new SchemaValidator(FULL_SCHEMA).validate({ + new SchemaValidator(FULL_MANIFEST_SCHEMA).validate({ yamlContent: manifestContent, }); diff --git a/packages/nx-forge/src/utils/forge/yaml-validator.ts b/packages/nx-forge/src/utils/forge/yaml-validator.ts index 5420099..4c59e9c 100644 --- a/packages/nx-forge/src/utils/forge/yaml-validator.ts +++ b/packages/nx-forge/src/utils/forge/yaml-validator.ts @@ -1,12 +1,12 @@ import { ManifestObject, ManifestParserBuilder, + ManifestValidationResult, + ValidatorInterface, errors, References, } from '@forge/manifest'; import { readFileSync } from 'node:fs'; -import { ValidatorInterface } from '@forge/manifest/out/validators/validator-interface'; -import { ManifestValidationResult } from '@forge/manifest/out/types'; /** * Copy of @forge/manifest YamlValidator with the only difference that the diff --git a/packages/nx-forge/src/utils/has-webpack-plugin.ts b/packages/nx-forge/src/utils/has-webpack-plugin.ts deleted file mode 100644 index 7b3dc5e..0000000 --- a/packages/nx-forge/src/utils/has-webpack-plugin.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { readNxJson, Tree } from '@nx/devkit'; - -export function hasWebpackPlugin(tree: Tree) { - const nxJson = readNxJson(tree); - return !!nxJson?.plugins?.some((p) => - typeof p === 'string' - ? p === '@nx/webpack/plugin' - : p.plugin === '@nx/webpack/plugin' - ); -} diff --git a/packages/nx-forge/tsconfig.json b/packages/nx-forge/tsconfig.json index 61243f9..eb23074 100644 --- a/packages/nx-forge/tsconfig.json +++ b/packages/nx-forge/tsconfig.json @@ -3,7 +3,8 @@ "compilerOptions": { "module": "commonjs", "resolveJsonModule": true, - "esModuleInterop": true + "esModuleInterop": true, + "ignoreDeprecations": "6.0" }, "files": [], "include": [], diff --git a/packages/nx-forge/tsconfig.lib.json b/packages/nx-forge/tsconfig.lib.json index f6be4d3..53ed42f 100644 --- a/packages/nx-forge/tsconfig.lib.json +++ b/packages/nx-forge/tsconfig.lib.json @@ -7,5 +7,10 @@ "strict": true }, "include": ["**/*.ts"], - "exclude": ["**/*.spec.ts", "**/*.test.ts", "jest.config.ts"] + "exclude": [ + "**/*.spec.ts", + "**/*.test.ts", + "src/test-utils/**", + "jest.config.cts" + ] } diff --git a/packages/nx-forge/tsconfig.spec.json b/packages/nx-forge/tsconfig.spec.json index f95b08f..cd6b8c4 100644 --- a/packages/nx-forge/tsconfig.spec.json +++ b/packages/nx-forge/tsconfig.spec.json @@ -5,5 +5,11 @@ "module": "commonjs", "types": ["jest", "node"] }, - "include": ["**/*.test.ts", "**/*.spec.ts", "**/*.d.ts", "jest.config.ts"] + "include": [ + "**/*.test.ts", + "**/*.spec.ts", + "**/*.d.ts", + "src/test-utils/**/*.ts", + "jest.config.cts" + ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e4a7c6b..8952df2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ catalogs: '@commitlint/cli': specifier: ^20.2.0 version: 20.5.3 - '@commitlint/config-angular': + '@commitlint/config-conventional': specifier: ^20.2.0 version: 20.5.3 '@eslint/eslintrc': @@ -22,8 +22,8 @@ catalogs: specifier: ^13.4.0 version: 13.4.0 '@forge/manifest': - specifier: ^13.3.1 - version: 13.3.1 + specifier: ^13.8.0 + version: 13.8.0 '@semantic-release/exec': specifier: ^7.1.0 version: 7.1.0 @@ -57,6 +57,9 @@ catalogs: '@typescript-eslint/parser': specifier: ^8.40.0 version: 8.62.0 + conventional-changelog-conventionalcommits: + specifier: ^9.3.1 + version: 9.3.1 cross-spawn: specifier: 7.0.6 version: 7.0.6 @@ -112,8 +115,8 @@ catalogs: specifier: ^6.0.1 version: 6.0.1 ts-jest: - specifier: 29.4.6 - version: 29.4.6 + specifier: 29.4.15 + version: 29.4.15 ts-node: specifier: 10.9.1 version: 10.9.1 @@ -121,8 +124,8 @@ catalogs: specifier: ^2.8.1 version: 2.8.1 typescript: - specifier: 5.9.3 - version: 5.9.3 + specifier: 6.0.3 + version: 6.0.3 typescript-eslint: specifier: ^8.62.0 version: 8.62.0 @@ -146,35 +149,38 @@ catalogs: version: 3.25.76 nx: '@nx/devkit': - specifier: 23.0.1 - version: 23.0.1 + specifier: 24.0.1 + version: 24.0.1 '@nx/eslint': - specifier: 23.0.1 - version: 23.0.1 + specifier: 24.0.1 + version: 24.0.1 '@nx/eslint-plugin': - specifier: 23.0.1 - version: 23.0.1 + specifier: 24.0.1 + version: 24.0.1 '@nx/jest': - specifier: 23.0.1 - version: 23.0.1 + specifier: 24.0.1 + version: 24.0.1 '@nx/js': - specifier: 23.0.1 - version: 23.0.1 + specifier: 24.0.1 + version: 24.0.1 '@nx/node': - specifier: 23.0.1 - version: 23.0.1 + specifier: 24.0.1 + version: 24.0.1 '@nx/plugin': - specifier: 23.0.1 - version: 23.0.1 + specifier: 24.0.1 + version: 24.0.1 + '@nx/vitest': + specifier: 24.0.1 + version: 24.0.1 '@nx/webpack': - specifier: 23.0.1 - version: 23.0.1 + specifier: 24.0.1 + version: 24.0.1 '@nx/workspace': - specifier: 23.0.1 - version: 23.0.1 + specifier: 24.0.1 + version: 24.0.1 nx: - specifier: 23.0.1 - version: 23.0.1 + specifier: 24.0.1 + version: 24.0.1 importers: @@ -182,7 +188,7 @@ importers: dependencies: '@forge/manifest': specifier: 'catalog:' - version: 13.3.1(typescript@5.9.3) + version: 13.8.0(typescript@6.0.3) cross-spawn: specifier: 'catalog:' version: 7.0.6 @@ -198,8 +204,8 @@ importers: devDependencies: '@commitlint/cli': specifier: 'catalog:' - version: 20.5.3(@types/node@18.19.21)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@5.9.3) - '@commitlint/config-angular': + version: 20.5.3(@types/node@18.19.21)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@6.0.3) + '@commitlint/config-conventional': specifier: 'catalog:' version: 20.5.3 '@eslint/eslintrc': @@ -210,40 +216,43 @@ importers: version: 9.39.4 '@forge/cli': specifier: 'catalog:' - version: 13.4.0(@swc/core@1.15.8)(@types/express@4.17.25)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@5.9.3)(webpack-cli@7.0.3)(webpack@5.108.0) + version: 13.4.0(@swc/core@1.15.8)(@types/express@4.17.25)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@6.0.3)(webpack-cli@7.0.3)(webpack@5.108.0) '@nx/devkit': specifier: catalog:nx - version: 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) + version: 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) '@nx/eslint': specifier: catalog:nx - version: 23.0.1(27194105918b1f64ab713fdfe0eab99b) + version: 24.0.1(ada27c3ff0281fd0d6b8ac13c0ffadc8) '@nx/eslint-plugin': specifier: catalog:nx - version: 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0)) + version: 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0)) '@nx/jest': specifier: catalog:nx - version: 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0)) + version: 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(ts-jest@29.4.15(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(typescript@6.0.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0)) '@nx/js': specifier: catalog:nx - version: 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) + version: 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) '@nx/node': specifier: catalog:nx - version: 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.39.4(jiti@2.7.0))(express@4.22.2)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0)) + version: 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.39.4(jiti@2.7.0))(express@4.22.2)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(ts-jest@29.4.15(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(typescript@6.0.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0)) '@nx/plugin': specifier: catalog:nx - version: 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.39.4(jiti@2.7.0))(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0)) + version: 24.0.1(adf1e0eb187ca1ac5c6b2f8d53e0d2ac) + '@nx/vitest': + specifier: catalog:nx + version: 24.0.1(@babel/traverse@7.29.7)(@nx/eslint@24.0.1(ada27c3ff0281fd0d6b8ac13c0ffadc8))(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0))(vite@5.4.21(@types/node@18.19.21)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)) '@nx/webpack': specifier: catalog:nx - version: 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(html-webpack-plugin@5.6.7(webpack@5.108.0))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0))(webpack-cli@7.0.3)(webpack-dev-server@5.2.5)(webpack@5.108.0) + version: 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(html-webpack-plugin@5.6.7(webpack@5.108.0))(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0))(webpack-cli@7.0.3)(webpack-dev-server@5.2.5)(webpack@5.108.0) '@nx/workspace': specifier: catalog:nx - version: 23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8) + version: 24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8) '@semantic-release/exec': specifier: 'catalog:' - version: 7.1.0(semantic-release@25.0.5(typescript@5.9.3)) + version: 7.1.0(semantic-release@25.0.5(typescript@6.0.3)) '@swc-node/register': specifier: 'catalog:' - version: 1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3) + version: 1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3) '@swc/cli': specifier: 'catalog:' version: 0.8.1(@swc/core@1.15.8)(chokidar@5.0.0) @@ -267,10 +276,13 @@ importers: version: 18.19.21 '@typescript-eslint/eslint-plugin': specifier: 'catalog:' - version: 8.62.0(@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + version: 8.62.0(@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/parser': specifier: 'catalog:' - version: 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + version: 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + conventional-changelog-conventionalcommits: + specifier: 'catalog:' + version: 9.3.1 dotenv: specifier: 'catalog:' version: 16.6.1 @@ -291,7 +303,7 @@ importers: version: 7.0.4 jest: specifier: 'catalog:' - version: 30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)) + version: 30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)) jest-environment-jsdom: specifier: 'catalog:' version: 30.0.5 @@ -306,31 +318,31 @@ importers: version: 2.4.2 nx: specifier: catalog:nx - version: 23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8) + version: 24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8) prettier: specifier: 'catalog:' version: 2.8.0 semantic-release: specifier: 'catalog:' - version: 25.0.5(typescript@5.9.3) + version: 25.0.5(typescript@6.0.3) strip-ansi: specifier: 'catalog:' version: 6.0.1 ts-jest: specifier: 'catalog:' - version: 29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.15(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(typescript@6.0.3) ts-node: specifier: 'catalog:' - version: 10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3) + version: 10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3) tslib: specifier: 'catalog:' version: 2.8.1 typescript: specifier: 'catalog:' - version: 5.9.3 + version: 6.0.3 typescript-eslint: specifier: 'catalog:' - version: 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + version: 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) verdaccio: specifier: 'catalog:' version: 6.7.4(typanion@3.14.0) @@ -351,28 +363,19 @@ importers: devDependencies: vitepress: specifier: 'catalog:' - version: 1.6.4(@algolia/client-search@5.55.1)(@types/node@18.19.21)(axios@1.16.0)(fuse.js@7.3.0)(less@4.5.1)(postcss@8.5.15)(sass-embedded@1.100.0)(sass@1.101.0)(search-insights@2.17.3)(terser@5.48.0)(typescript@5.9.3) + version: 1.6.4(@algolia/client-search@5.55.1)(@types/node@18.19.21)(axios@1.16.0)(fuse.js@7.3.0)(less@4.5.1)(postcss@8.5.15)(sass-embedded@1.100.0)(sass@1.101.0)(search-insights@2.17.3)(terser@5.48.0)(typescript@6.0.3) packages/nx-forge: dependencies: '@forge/manifest': specifier: 'catalog:' - version: 13.3.1(typescript@5.9.3) + version: 13.8.0(typescript@6.0.3) '@nx/devkit': - specifier: catalog:nx - version: 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - '@nx/eslint': - specifier: catalog:nx - version: 23.0.1(6d25d9fb9db583c14f895211a20da91c) - '@nx/jest': - specifier: catalog:nx - version: 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.4.1)(jest@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0)) + specifier: ^24.0.1 + version: 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) '@nx/js': - specifier: catalog:nx - version: 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) - '@nx/webpack': - specifier: catalog:nx - version: 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(html-webpack-plugin@5.6.7(webpack@5.108.0))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0))(webpack-cli@7.0.3)(webpack-dev-server@5.2.5)(webpack@5.108.0) + specifier: ^24.0.1 + version: 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) cross-spawn: specifier: 'catalog:' version: 7.0.6 @@ -386,8 +389,8 @@ importers: specifier: 'catalog:' version: 2.2.1 nx: - specifier: '>=23 <24' - version: 23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8) + specifier: '>=24 <25' + version: 24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8) tslib: specifier: 'catalog:' version: 2.8.1 @@ -1130,6 +1133,14 @@ packages: '@bufbuild/protobuf@2.12.1': resolution: {integrity: sha512-BvAMfS6LrgZiryOAZ4pBYucu4wG/Ei/9o9DZ9akbREnMLbPJiom2i8b9C8IsKErQoiKqVhrerzt3kOT/RrzLHg==} + '@clack/core@1.4.3': + resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.7.0': + resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} + engines: {node: '>= 20.12.0'} + '@colordx/core@5.5.0': resolution: {integrity: sha512-3PxTH8itZzltK0U9jTwVVnjLXvnDYuq3m+QXsHkENxWiPRh4WaoLcs1SQjqgZ55kS+QyirpH5BVwzP2gMVG6EQ==} @@ -1142,12 +1153,8 @@ packages: engines: {node: '>=v18'} hasBin: true - '@commitlint/config-angular-type-enum@20.0.0': - resolution: {integrity: sha512-6HAMnXyUl3EUBgECjvfLzlghbkMfZx28YBPDry3pPWR0+xpzqSbUY19VIkmdetqYKeawFViudvkqD4VH93gKKg==} - engines: {node: '>=v18'} - - '@commitlint/config-angular@20.5.3': - resolution: {integrity: sha512-j0TTWt4EKyC15cKZi4ebYlzKsbcaGUKfZ8FLEDaaSiGhXY0sCoqMu9K3NPYRB/qQuygduLjEnWKE3X028JP+Gw==} + '@commitlint/config-conventional@20.5.3': + resolution: {integrity: sha512-j34Qqeaa152chJgz2ysyk0BCpHenJn1lV0Rx0VXf8k3ccQcED+48EZrzMvo9jLmJUyBrrBwvu89I+2er4gW7QQ==} engines: {node: '>=v18'} '@commitlint/config-validator@20.5.0': @@ -1550,6 +1557,14 @@ packages: typescript: optional: true + '@forge/i18n@1.0.1': + resolution: {integrity: sha512-iZqAOvaq0MwMPplC0U0HLpQ/cOYUumxH3D6OO3PoSBDm6P1tD2Bdb8lND0CmL1+SZhsp7GS5DDd265/sVyMMDA==} + peerDependencies: + typescript: '>=5.0.0' + peerDependenciesMeta: + typescript: + optional: true + '@forge/lint@6.2.0': resolution: {integrity: sha512-ibra5lVW2R52/gdvHo6tHXk4w7WFIvTwTGSZ0l6r0cDp5rppQTEGVyiCuBD+bRF+GN4woTNC7aGCOAGAocdyrA==} peerDependencies: @@ -1566,6 +1581,14 @@ packages: typescript: optional: true + '@forge/manifest@13.8.0': + resolution: {integrity: sha512-MBIHQN0Y/AFpjd12sBlVaMAcnmRtg+g8lhX3A2Sk/I18AAfKePL+WdH8jaubmBFdQUXAc+t6AkBR2Jor/vRPSw==} + peerDependencies: + typescript: '>=5.0.0' + peerDependenciesMeta: + typescript: + optional: true + '@forge/runtime@7.0.0': resolution: {integrity: sha512-Xu4QJkTGWJs3KfQ4OatS9hpfrFre8gXk01vV6NAOe0mL5bieMltddLR9WbLeyQWelBXMEQGc61V06kcIRDjEEw==} peerDependencies: @@ -1754,15 +1777,6 @@ packages: node-notifier: optional: true - '@jest/reporters@30.4.1': - resolution: {integrity: sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - '@jest/schemas@30.0.5': resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2153,16 +2167,16 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nx/devkit@23.0.1': - resolution: {integrity: sha512-A/chuNS1RZwdbRe/Nf+w0qtPEFHLcZNPzo8Abw5mBxyXmy9yvHZpuZuqDbt/lASFU+TEb74xExL1AnKWwqpOIg==} + '@nx/devkit@24.0.1': + resolution: {integrity: sha512-/mkW5soMCX/dQxJySdTHrgBCl4NkGKByNvXkm7K6e1FCOmCnd3toF9EVJq5Rn7gQbfT+dXVSa8vTK8z2nhcKFg==} peerDependencies: - nx: '>= 22 <= 24 || ^23.0.0-0' + nx: '>= 23 <= 25 || ^24.0.0-0' - '@nx/docker@23.0.1': - resolution: {integrity: sha512-H2/wGZa10X2KhM+BzUkZLCI9wDG1kGqDGco1tDWZczKwk9ViOcwV23ljjt5RtIQIson6B7L56pO2F/8WKJ+1CQ==} + '@nx/docker@24.0.1': + resolution: {integrity: sha512-thSZRXXUu30X7oq71wHj9gVc1WiYb2PxgwyCD9DA/6JqYAbK3noRbPjkzc91BToBQ62bIJp+FTHZ9GQBhxi4Fg==} - '@nx/eslint-plugin@23.0.1': - resolution: {integrity: sha512-fZ4fU4fYxvmHYUtiPuh9vg6KItjqaz4c8SHeqOCRvDsbm7NwQidWsGiruk853No5KnmCHfj/En87v/qGOguoGw==} + '@nx/eslint-plugin@24.0.1': + resolution: {integrity: sha512-IeeIaOfKjVAW5rOll6woh6VhnUKQ5p4VnhpRI0eFSFGUqoKPErpS0xrma6/7cQMrCuzgoSs1748OyI3zM6zEdw==} peerDependencies: '@typescript-eslint/parser': ^8.0.0 eslint-config-prettier: ^10.0.0 @@ -2172,20 +2186,20 @@ packages: eslint-config-prettier: optional: true - '@nx/eslint@23.0.1': - resolution: {integrity: sha512-/P+iXDUsXHeqU7NMDviE/tjJkaVWssc7TLcCoJ6TRy/p+U7HaigLx57VAogBIznldHiyL7KbM7Y0fzqo/hPofw==} + '@nx/eslint@24.0.1': + resolution: {integrity: sha512-z0H+I9/ErN6acZ76uTJlRnALD/X4U3BUQylW2LbGdWFYQkqlFMyvYmaIrRXeUrGeuvSJDlLPZUr5uzN4Jpndfw==} peerDependencies: - '@nx/jest': 23.0.1 + '@nx/jest': 24.0.1 '@zkochan/js-yaml': 0.0.7 - eslint: ^8.0.0 || ^9.0.0 || ^10.0.0 + eslint: ^9.0.0 || ^10.0.0 peerDependenciesMeta: '@nx/jest': optional: true '@zkochan/js-yaml': optional: true - '@nx/jest@23.0.1': - resolution: {integrity: sha512-F5lhjttIExH8hEJ09cqv3Ac1o8GyGTHpD1OLLWnNAYaN/CPpbI16Ix8VLY/fuwJYf6wcm1/vBL3knbv6LABODA==} + '@nx/jest@24.0.1': + resolution: {integrity: sha512-GDiVpiA51P/+vdJh1b5cpDWe9lfNMKmeAoavDF1nXCiSqSZy52OwMqXkxVUbuOPdA/zgHyVhj2VYvxqcfK/3mQ==} peerDependencies: jest: ^29.0.0 || ^30.0.0 ts-jest: ^29.0.0 @@ -2195,8 +2209,8 @@ packages: ts-jest: optional: true - '@nx/js@23.0.1': - resolution: {integrity: sha512-H8jw1gk7hA8PCXBFC9ocTBpzuXOTvVQ1gA+OlEBMyKqmUaOLNm7yuoOYozwvLsLlCVY27onohSIS8xIdAR/Zow==} + '@nx/js@24.0.1': + resolution: {integrity: sha512-zxtHbHXxVPmNCz7da7qvDhe7Ik0sg4a5+EMqSyhrw6sKqJVibgyU9eSV3Iw4zrjzWxO3AjarlTS2EzEOMcL5KQ==} peerDependencies: '@swc/cli': '>=0.6.0 <0.9.0' verdaccio: ^6.0.5 @@ -2206,8 +2220,8 @@ packages: verdaccio: optional: true - '@nx/node@23.0.1': - resolution: {integrity: sha512-s13ja7MITncR4M/uTGM786Jqco8lJs/9Kvo7jrKFg0Ct8d5XHbu+JFpulmCGPatsBhFA0E/JHSSfR+D9E7MWxA==} + '@nx/node@24.0.1': + resolution: {integrity: sha512-pifqs8mL8Ks4FwUWoE4CCtIW/7DYEUX3R2Kxsds9jXyjjdi6WzCeOOcK+ggFM/N6ZQH0sIc6dKNUX7sanrQzqw==} peerDependencies: express: '>=4.0.0 <6.0.0' fastify: '>=4.0.0 <6.0.0' @@ -2220,65 +2234,84 @@ packages: koa: optional: true - '@nx/nx-darwin-arm64@23.0.1': - resolution: {integrity: sha512-gQJvgPnbI91DBe23Th2CqD9R/S54cPS3C1f0DhyQ8YEf9rR7EEc+sVGjhgVxlhfOk2W7I1Gy6EkXwpN4aDoW4w==} + '@nx/nx-darwin-arm64@24.0.1': + resolution: {integrity: sha512-6ODLtFQ1v9Em8lSqTezTXRX5W5QVeqyIxwcUmBWwNWskQ10hFGscoyPihENmZipj1xMRq7Z8qTfkMOoxGhNi4Q==} cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@23.0.1': - resolution: {integrity: sha512-e/lvzHKN6gpuD7MqEtfH1fOfnR75E55ytYNt8jaRxKI6EvpCq+Q3MunDuh9GQYAkqDrUqE7AhHrHc+eKATVEHw==} + '@nx/nx-darwin-x64@24.0.1': + resolution: {integrity: sha512-NFeB9hVPR9OE4duwyRS4de75+DzYh2aPsenL9VkTDCBj4QBCMBFWPe++E58Ak8QeT/IU4xhjZme0ICO4qmoq8w==} cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@23.0.1': - resolution: {integrity: sha512-f582OhSYN9qHpA9Ox9qnr3kZSZ7gQHs7crmBUutmbXmZQB2TDS/TlhvYSNnxudpwHR/tuWGi2IOQqa7zGOZj1Q==} + '@nx/nx-freebsd-x64@24.0.1': + resolution: {integrity: sha512-muKwDfORGxxQY0IXt5gqC0a5kuwHWnhFiPAddbBhfbHVhZMryhsZlEQfgCTpB1fYAmBmBU7DXDCZZG7ibNckCw==} cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@23.0.1': - resolution: {integrity: sha512-VjhqPc6E7aiI0e+lowrkVbdyulsmP9fgMdcX1mCzXCEu/XZDcUbZ5qveR964cMhvm5qKn0ILJtJOUqZgmOT3Xg==} + '@nx/nx-linux-arm-gnueabihf@24.0.1': + resolution: {integrity: sha512-j5ZW6McnC0IZ7Nb5EtR41ZqBsv3U2naSug8Xmz2VPSaA7vNTo+A7MmunYvQyz2B7NSwSdZp+d+powfyIN8/owQ==} cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@23.0.1': - resolution: {integrity: sha512-zX2JdHQejZWB3DRgNsh77qOVYaSSjSLuBP2qIqc7EWVlCUnR7Aj3e65PTIps4LxMMmUp4twZA2ezS0rtyK2A4w==} + '@nx/nx-linux-arm64-gnu@24.0.1': + resolution: {integrity: sha512-9pqRs9H/LgbR84TKlgWTw3giZlLL6rhlRfsA8X4DyW2zKqvTquEpoNGGKplQUQ4oB6OTBi95Uav4ia95TwpmSQ==} cpu: [arm64] os: [linux] libc: [glibc] - '@nx/nx-linux-arm64-musl@23.0.1': - resolution: {integrity: sha512-9lyhxRNBgNYwHt6paq0OLzoKNoEGF5LnNW2YYrgFY8Cjtsg/Q4pcfZ1vB5o9FX9OmUgUQs3t2d4tU8YDukRUWg==} + '@nx/nx-linux-arm64-musl@24.0.1': + resolution: {integrity: sha512-75mxGC7JYmvjMERA7Hw4B3UDqW+Bl/BjiYiFGTETZHbaK0NhgMf4e8LYJo6KtHNGjqBRuQN1EMwmDeY0BvyiSg==} cpu: [arm64] os: [linux] libc: [musl] - '@nx/nx-linux-x64-gnu@23.0.1': - resolution: {integrity: sha512-kVszY2xRyyrCXgdCdM1qG1WUhDjNPZxtdWq86a0TyIRJjfJTP9NHqpyhmvj9c2RdZxKVWHotx6fBJzY6Vn2ZrA==} + '@nx/nx-linux-x64-gnu@24.0.1': + resolution: {integrity: sha512-m2kfeJ6YRLeOnbOd68M0DiPcgSKyuSa51vFlJS0WFnlb9YuE2BVEhi2WAtwZyUJUbudzA6QXhg1ezJbCJYt2Gg==} cpu: [x64] os: [linux] libc: [glibc] - '@nx/nx-linux-x64-musl@23.0.1': - resolution: {integrity: sha512-co71K2n4zcS1SYR8EBRlCvIko7M1YycO2tZL0nrCrga87AF5dzCwx+wEclpyCR/4tNOY3FrACk4gIkVskh3CdA==} + '@nx/nx-linux-x64-musl@24.0.1': + resolution: {integrity: sha512-lpFLA/T7BdfzDfA1135kbtk1Td20xAH8KAsujhuyxdXYz4Rh916etAlzyNGveK8qzUlCU0St1HKgNpm4y1L+PA==} cpu: [x64] os: [linux] libc: [musl] - '@nx/nx-win32-arm64-msvc@23.0.1': - resolution: {integrity: sha512-7oma7iy5fbnn+x5AP7SFGMuleAA2R5RZm26dn+faikyQ4PXjoRAikWJJNiOWAeCA0BaMAeVedI6fJeAsVeDUKg==} + '@nx/nx-win32-arm64-msvc@24.0.1': + resolution: {integrity: sha512-4abQqdo2lGtFAhDFVxiNcpnz5lFfztbm7EYYeZI2EIcAJQQ19csTfvDl+/d2yv54mjWXhB8dgiTvExN0c/mZzg==} cpu: [arm64] os: [win32] - '@nx/nx-win32-x64-msvc@23.0.1': - resolution: {integrity: sha512-TE/wvBa2cpkVXmk/AXUQAneong4JReS2hyNpAUONKG1yXU7TDKe0wvn1xQXxAbyspudT9NuCnVtpVuEkRz8S+Q==} + '@nx/nx-win32-x64-msvc@24.0.1': + resolution: {integrity: sha512-mnqxwUN5ofMs5UctpdhR5GIsZkQbzKMElqP37dzW/hLos/ki9Q9Fpz9z+6sAx/pnxhUC0Yl7bz+tFy1j2lGwVQ==} cpu: [x64] os: [win32] - '@nx/plugin@23.0.1': - resolution: {integrity: sha512-NrofpW4qMVgCV3X0X70gHgXf3FYO/zM7QQG8SVIG0gGGd4NJC+ZghexTaXwZZiJsQAmj2KJBcrU3qwv136Pmfw==} + '@nx/plugin@24.0.1': + resolution: {integrity: sha512-LXlejwS+6Reet0PxhM0VJOw7TXIuNccA2RqlbrBEI4PAQYL/x91uodder3UrpTwKq4eyCnoaB7/9k8lo3Pz/cg==} + peerDependencies: + '@nx/vitest': 24.0.1 + peerDependenciesMeta: + '@nx/vitest': + optional: true - '@nx/webpack@23.0.1': - resolution: {integrity: sha512-0ELnKItRtIlcHAN8AaSY4uwabA62aAFDCvYFqadQCTeN5eBYl1VGfzenWMvGyVZoU7K9dYtPVSkZSUhltvHQgw==} + '@nx/vitest@24.0.1': + resolution: {integrity: sha512-spY1fd5qm5wxPRC9duZ3fgLHqATcK4CCVjEScVVcxS3NO5ghYhpBUrrnjW3+bEv4a1UXLPqyQ6nCudlOmF+xtw==} + peerDependencies: + '@nx/eslint': 24.0.1 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vitest: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + '@nx/eslint': + optional: true + vite: + optional: true + vitest: + optional: true + + '@nx/webpack@24.0.1': + resolution: {integrity: sha512-nfsC09b6a3824Jma4JAz1mc3gtfBD+48OcnbTAYZLh3X6s9WNX6jCayVi1QK9bvAU09CfXiNtCCznPKh8QzVVg==} peerDependencies: webpack: ^5.0.0 webpack-cli: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -2291,8 +2324,8 @@ packages: webpack-dev-server: optional: true - '@nx/workspace@23.0.1': - resolution: {integrity: sha512-VdbvMTSEzp3ONZwiy83XEu8ktykC8aEI7M4mqKs5RNKHBFg3jtao2NFo3wDqHqnn1q9Fdaj8EbyUn08BUR5L3w==} + '@nx/workspace@24.0.1': + resolution: {integrity: sha512-mXg/U1j1uR3PD/sOOu1sd1NlsXhWfJ+mfxvqvXVREv7MtRYRB6qyTOpcpbRVpx9TEDy/NYFQ8qf6O6mSYBIBhA==} '@octokit/auth-token@6.0.0': resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} @@ -3710,10 +3743,6 @@ packages: resolution: {integrity: sha512-FyaFnnsbVPtevQwqSj/SdxE3jAsSsY0BEH8IVLf9rXxEBdAhAmT6VKCVSMWoaPIHVN1Eufh/1w8q6k8URpIkWw==} engines: {node: '>= 14.0.0'} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -4062,6 +4091,10 @@ packages: brace-expansion@2.1.1: resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} + brace-expansion@5.0.6: resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} @@ -4435,6 +4468,10 @@ packages: resolution: {integrity: sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==} engines: {node: '>=18'} + conventional-changelog-conventionalcommits@9.3.1: + resolution: {integrity: sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==} + engines: {node: '>=18'} + conventional-changelog-writer@8.4.0: resolution: {integrity: sha512-HHBFkk1EECxxmCi4CTu091iuDpQv5/OavuCUAuZmrkWpmYfyD816nom1CvtfXJ/uYfAAjavgHvXHX291tSLK8g==} engines: {node: '>=18'} @@ -4548,12 +4585,12 @@ packages: peerDependencies: postcss: ^8.0.9 - css-loader@6.11.0: - resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} - engines: {node: '>= 12.13.0'} + css-loader@7.1.5: + resolution: {integrity: sha512-Q7iAfQkU2twNBryKX/vGAlE+GAmkF7quhSzAGNK8fBimxk3+tqg245rH52UPb9dioBolBc8rP0ihmHBaDTJQBA==} + engines: {node: '>= 18.12.0'} peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.0.0 + '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 + webpack: ^5.27.0 peerDependenciesMeta: '@rspack/core': optional: true @@ -4749,10 +4786,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -4942,10 +4975,6 @@ packages: resolution: {integrity: sha512-7DdUaTjmNwMcH2gLr1qycesKII3BK4RLy/mdAb7x10Lq7bR4aNKHt1BR1ZALSv0rPM/hF5wYF0PhGop/rJm8vw==} engines: {node: '>=10.13.0'} - enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} - entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -5223,9 +5252,18 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + fast-uri@3.1.2: resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fast-wrap-ansi@0.2.0: + resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -5600,6 +5638,11 @@ packages: handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + handlebars@4.7.10: + resolution: {integrity: sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==} + engines: {node: '>=0.4.7'} + hasBin: true + handlebars@4.7.9: resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} engines: {node: '>=0.4.7'} @@ -5818,6 +5861,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.12: + resolution: {integrity: sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg==} + engines: {node: '>= 4'} + ignore@7.0.5: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} @@ -5956,11 +6003,6 @@ packages: is-deflate@1.0.0: resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6122,10 +6164,6 @@ packages: resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} engines: {node: '>=18'} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -7214,8 +7252,8 @@ packages: nwsapi@2.2.24: resolution: {integrity: sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==} - nx@23.0.1: - resolution: {integrity: sha512-HnK0Ke8FcPeVQffYm1oyzkLNn7khrI8SeDeC3iyLhw/UEMCB24hjI5JSs6Amlyeb0/GaeiuQuts8NkQKd/NpGA==} + nx@24.0.1: + resolution: {integrity: sha512-znPLIZed09YJeJHXcWVSbBLqfbQs6S8cRcCkfBhp/V1ROYGHqooNjnCamAli8imZC9J5gD7DttpwjX7Qw5p4jQ==} hasBin: true peerDependencies: '@swc-node/register': ^1.11.1 @@ -7279,10 +7317,6 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true @@ -8461,6 +8495,9 @@ packages: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + skin-tone@2.0.0: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} @@ -8469,8 +8506,8 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - smol-toml@1.6.1: - resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} + smol-toml@1.9.0: + resolution: {integrity: sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==} engines: {node: '>= 18'} sockjs@0.3.24: @@ -8934,19 +8971,19 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-jest@29.4.6: - resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} + ts-jest@29.4.15: + resolution: {integrity: sha512-s2qmEUYFRqbjz1wv0EmccNPVOb45HOFpFuhzQJLKShYVisuTbCFPIIAIV2EuK5rIxb4BejLDbH7dnBZfYjybUQ==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' + '@babel/core': '>=7.0.0-beta.0 <9' '@jest/transform': ^29.0.0 || ^30.0.0 '@jest/types': ^29.0.0 || ^30.0.0 babel-jest: ^29.0.0 || ^30.0.0 esbuild: '*' jest: ^29.0.0 || ^30.0.0 jest-util: ^29.0.0 || ^30.0.0 - typescript: '>=4.3 <6' + typescript: '>=4.3 <7' peerDependenciesMeta: '@babel/core': optional: true @@ -9089,8 +9126,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -10583,16 +10620,28 @@ snapshots: '@bufbuild/protobuf@2.12.1': {} + '@clack/core@1.4.3': + dependencies: + fast-wrap-ansi: 0.2.0 + sisteransi: 1.0.5 + + '@clack/prompts@1.7.0': + dependencies: + '@clack/core': 1.4.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.0 + sisteransi: 1.0.5 + '@colordx/core@5.5.0': {} '@colors/colors@1.5.0': optional: true - '@commitlint/cli@20.5.3(@types/node@18.19.21)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@5.9.3)': + '@commitlint/cli@20.5.3(@types/node@18.19.21)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@6.0.3)': dependencies: '@commitlint/format': 20.5.0 '@commitlint/lint': 20.5.3 - '@commitlint/load': 20.5.3(@types/node@18.19.21)(typescript@5.9.3) + '@commitlint/load': 20.5.3(@types/node@18.19.21)(typescript@6.0.3) '@commitlint/read': 20.5.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) '@commitlint/types': 20.5.0 tinyexec: 1.2.4 @@ -10603,11 +10652,10 @@ snapshots: - conventional-commits-parser - typescript - '@commitlint/config-angular-type-enum@20.0.0': {} - - '@commitlint/config-angular@20.5.3': + '@commitlint/config-conventional@20.5.3': dependencies: - '@commitlint/config-angular-type-enum': 20.0.0 + '@commitlint/types': 20.5.0 + conventional-changelog-conventionalcommits: 9.3.1 '@commitlint/config-validator@20.5.0': dependencies: @@ -10638,14 +10686,14 @@ snapshots: '@commitlint/rules': 20.5.3 '@commitlint/types': 20.5.0 - '@commitlint/load@20.5.3(@types/node@18.19.21)(typescript@5.9.3)': + '@commitlint/load@20.5.3(@types/node@18.19.21)(typescript@6.0.3)': dependencies: '@commitlint/config-validator': 20.5.0 '@commitlint/execute-rule': 20.0.0 '@commitlint/resolve-extends': 20.5.3 '@commitlint/types': 20.5.0 - cosmiconfig: 9.0.2(typescript@5.9.3) - cosmiconfig-typescript-loader: 6.3.0(@types/node@18.19.21)(cosmiconfig@9.0.2(typescript@5.9.3))(typescript@5.9.3) + cosmiconfig: 9.0.2(typescript@6.0.3) + cosmiconfig-typescript-loader: 6.3.0(@types/node@18.19.21)(cosmiconfig@9.0.2(typescript@6.0.3))(typescript@6.0.3) es-toolkit: 1.48.1 is-plain-obj: 4.1.0 picocolors: 1.1.1 @@ -10791,7 +10839,6 @@ snapshots: dependencies: '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 - optional: true '@emnapi/core@1.4.5': dependencies: @@ -10806,7 +10853,6 @@ snapshots: '@emnapi/runtime@1.11.0': dependencies: tslib: 2.8.1 - optional: true '@emnapi/runtime@1.4.5': dependencies: @@ -10824,7 +10870,6 @@ snapshots: '@emnapi/wasi-threads@1.2.2': dependencies: tslib: 2.8.1 - optional: true '@esbuild/aix-ppc64@0.21.5': optional: true @@ -10955,7 +11000,7 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@forge/bundler@7.2.0(@swc/core@1.15.8)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@5.9.3)(webpack-cli@7.0.3)': + '@forge/bundler@7.2.0(@swc/core@1.15.8)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@6.0.3)(webpack-cli@7.0.3)': dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.28.0 @@ -10966,10 +11011,10 @@ snapshots: '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 - '@forge/cli-shared': 9.4.0(@types/node@18.19.21)(typescript@5.9.3) - '@forge/i18n': 1.0.0(typescript@5.9.3) - '@forge/lint': 6.2.0(@types/node@18.19.21)(cheerio@1.2.0)(typescript@5.9.3) - '@forge/manifest': 13.3.1(typescript@5.9.3) + '@forge/cli-shared': 9.4.0(@types/node@18.19.21)(typescript@6.0.3) + '@forge/i18n': 1.0.0(typescript@6.0.3) + '@forge/lint': 6.2.0(@types/node@18.19.21)(cheerio@1.2.0)(typescript@6.0.3) + '@forge/manifest': 13.3.1(typescript@6.0.3) babel-loader: 8.4.1(@babel/core@7.29.7)(webpack@5.108.0) cheerio: 1.2.0 chokidar: 4.0.3 @@ -10979,12 +11024,12 @@ snapshots: html-webpack-plugin: 5.6.7(webpack@5.108.0) nock: 13.5.6 tmp: 0.2.7 - ts-loader: 9.6.2(loader-utils@2.0.4)(typescript@5.9.3)(webpack@5.108.0) + ts-loader: 9.6.2(loader-utils@2.0.4)(typescript@6.0.3)(webpack@5.108.0) type-fest: 4.10.2 webpack: 5.108.0(@swc/core@1.15.8)(postcss@8.5.15)(webpack-cli@7.0.3) webpack-bundle-analyzer: 4.10.2 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - '@minify-html/node' - '@rspack/core' @@ -11009,11 +11054,11 @@ snapshots: - utf-8-validate - webpack-cli - '@forge/cli-shared@9.4.0(@types/node@18.19.21)(typescript@5.9.3)': + '@forge/cli-shared@9.4.0(@types/node@18.19.21)(typescript@6.0.3)': dependencies: - '@forge/i18n': 1.0.0(typescript@5.9.3) - '@forge/manifest': 13.3.1(typescript@5.9.3) - '@forge/util': 3.0.0(typescript@5.9.3) + '@forge/i18n': 1.0.0(typescript@6.0.3) + '@forge/manifest': 13.3.1(typescript@6.0.3) + '@forge/util': 3.0.0(typescript@6.0.3) '@sentry/node': 7.106.0 '@vercel/detect-agent': 1.2.3 adm-zip: 0.6.0 @@ -11046,24 +11091,24 @@ snapshots: tslib: 2.8.1 yaml: 2.9.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - '@types/node' - bare-abort-controller - bare-buffer - react-native-b4a - '@forge/cli@13.4.0(@swc/core@1.15.8)(@types/express@4.17.25)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@5.9.3)(webpack-cli@7.0.3)(webpack@5.108.0)': - dependencies: - '@forge/bundler': 7.2.0(@swc/core@1.15.8)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@5.9.3)(webpack-cli@7.0.3) - '@forge/cli-shared': 9.4.0(@types/node@18.19.21)(typescript@5.9.3) - '@forge/egress': 3.0.0(typescript@5.9.3) - '@forge/i18n': 1.0.0(typescript@5.9.3) - '@forge/lint': 6.2.0(@types/node@18.19.21)(cheerio@1.2.0)(typescript@5.9.3) - '@forge/manifest': 13.3.1(typescript@5.9.3) - '@forge/runtime': 7.0.0(typescript@5.9.3) - '@forge/tunnel': 7.1.1(@swc/core@1.15.8)(@types/express@4.17.25)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@5.9.3)(webpack-cli@7.0.3)(webpack@5.108.0) - '@forge/util': 3.0.0(typescript@5.9.3) + '@forge/cli@13.4.0(@swc/core@1.15.8)(@types/express@4.17.25)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@6.0.3)(webpack-cli@7.0.3)(webpack@5.108.0)': + dependencies: + '@forge/bundler': 7.2.0(@swc/core@1.15.8)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@6.0.3)(webpack-cli@7.0.3) + '@forge/cli-shared': 9.4.0(@types/node@18.19.21)(typescript@6.0.3) + '@forge/egress': 3.0.0(typescript@6.0.3) + '@forge/i18n': 1.0.0(typescript@6.0.3) + '@forge/lint': 6.2.0(@types/node@18.19.21)(cheerio@1.2.0)(typescript@6.0.3) + '@forge/manifest': 13.3.1(typescript@6.0.3) + '@forge/runtime': 7.0.0(typescript@6.0.3) + '@forge/tunnel': 7.1.1(@swc/core@1.15.8)(@types/express@4.17.25)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@6.0.3)(webpack-cli@7.0.3)(webpack@5.108.0) + '@forge/util': 3.0.0(typescript@6.0.3) '@sentry/node': 7.106.0 ajv: 8.20.0 case: 1.6.3 @@ -11098,7 +11143,7 @@ snapshots: v8-compile-cache: 2.4.0 yaml: 2.9.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - '@minify-html/node' - '@rspack/core' @@ -11126,37 +11171,43 @@ snapshots: - webpack - webpack-cli - '@forge/csp@6.3.1(cheerio@1.2.0)(typescript@5.9.3)': + '@forge/csp@6.3.1(cheerio@1.2.0)(typescript@6.0.3)': dependencies: content-security-policy-parser: 0.6.0 optionalDependencies: cheerio: 1.2.0 - typescript: 5.9.3 + typescript: 6.0.3 - '@forge/egress@3.0.0(typescript@5.9.3)': + '@forge/egress@3.0.0(typescript@6.0.3)': optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 - '@forge/i18n@1.0.0(typescript@5.9.3)': + '@forge/i18n@1.0.0(typescript@6.0.3)': dependencies: lodash: 4.18.1 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 - '@forge/lint@6.2.0(@types/node@18.19.21)(cheerio@1.2.0)(typescript@5.9.3)': + '@forge/i18n@1.0.1(typescript@6.0.3)': + dependencies: + lodash: 4.18.1 + optionalDependencies: + typescript: 6.0.3 + + '@forge/lint@6.2.0(@types/node@18.19.21)(cheerio@1.2.0)(typescript@6.0.3)': dependencies: '@atlassian/atlassian-openapi': 1.0.6 - '@forge/cli-shared': 9.4.0(@types/node@18.19.21)(typescript@5.9.3) - '@forge/csp': 6.3.1(cheerio@1.2.0)(typescript@5.9.3) - '@forge/egress': 3.0.0(typescript@5.9.3) - '@forge/manifest': 13.3.1(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) + '@forge/cli-shared': 9.4.0(@types/node@18.19.21)(typescript@6.0.3) + '@forge/csp': 6.3.1(cheerio@1.2.0)(typescript@6.0.3) + '@forge/egress': 3.0.0(typescript@6.0.3) + '@forge/manifest': 13.3.1(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@6.0.3) archiver: 8.0.0 array.prototype.flatmap: 1.3.3 cross-spawn: 7.0.6 tmp: 0.2.7 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - '@types/node' - bare-abort-controller @@ -11165,9 +11216,9 @@ snapshots: - react-native-b4a - supports-color - '@forge/manifest@13.3.1(typescript@5.9.3)': + '@forge/manifest@13.3.1(typescript@6.0.3)': dependencies: - '@forge/i18n': 1.0.0(typescript@5.9.3) + '@forge/i18n': 1.0.0(typescript@6.0.3) '@sentry/node': 7.106.0 ajv: 8.20.0 ajv-formats: 2.1.1(ajv@8.20.0) @@ -11177,19 +11228,33 @@ snapshots: mime-types: 2.1.35 yaml: 2.9.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 - '@forge/runtime@7.0.0(typescript@5.9.3)': + '@forge/manifest@13.8.0(typescript@6.0.3)': + dependencies: + '@forge/i18n': 1.0.1(typescript@6.0.3) + '@sentry/node': 7.106.0 + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + cheerio: 1.2.0 + glob: 13.0.6 + lodash: 4.18.1 + mime-types: 2.1.35 + yaml: 2.9.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 - '@forge/tunnel@7.1.1(@swc/core@1.15.8)(@types/express@4.17.25)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@5.9.3)(webpack-cli@7.0.3)(webpack@5.108.0)': + '@forge/runtime@7.0.0(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@forge/tunnel@7.1.1(@swc/core@1.15.8)(@types/express@4.17.25)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@6.0.3)(webpack-cli@7.0.3)(webpack@5.108.0)': dependencies: - '@forge/bundler': 7.2.0(@swc/core@1.15.8)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@5.9.3)(webpack-cli@7.0.3) - '@forge/cli-shared': 9.4.0(@types/node@18.19.21)(typescript@5.9.3) - '@forge/csp': 6.3.1(cheerio@1.2.0)(typescript@5.9.3) - '@forge/runtime': 7.0.0(typescript@5.9.3) - '@forge/util': 3.0.0(typescript@5.9.3) + '@forge/bundler': 7.2.0(@swc/core@1.15.8)(@types/node@18.19.21)(loader-utils@2.0.4)(postcss@8.5.15)(typescript@6.0.3)(webpack-cli@7.0.3) + '@forge/cli-shared': 9.4.0(@types/node@18.19.21)(typescript@6.0.3) + '@forge/csp': 6.3.1(cheerio@1.2.0)(typescript@6.0.3) + '@forge/runtime': 7.0.0(typescript@6.0.3) + '@forge/util': 3.0.0(typescript@6.0.3) cheerio: 1.2.0 chokidar: 4.0.3 cloudflared: 0.7.1 @@ -11205,7 +11270,7 @@ snapshots: webpack-dev-server: 5.2.5(tslib@2.8.1)(webpack-cli@7.0.3)(webpack@5.108.0) which: 3.0.1 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - '@minify-html/node' - '@rspack/core' @@ -11233,9 +11298,9 @@ snapshots: - webpack - webpack-cli - '@forge/util@3.0.0(typescript@5.9.3)': + '@forge/util@3.0.0(typescript@6.0.3)': optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 '@graphql-typed-document-node/core@3.2.0(graphql@16.14.2)': dependencies: @@ -11307,7 +11372,7 @@ snapshots: jest-util: 30.4.1 slash: 3.0.0 - '@jest/core@30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3))': + '@jest/core@30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3))': dependencies: '@jest/console': 30.3.0 '@jest/pattern': 30.0.1 @@ -11322,7 +11387,7 @@ snapshots: exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.3.0 - jest-config: 30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)) + jest-config: 30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)) jest-haste-map: 30.3.0 jest-message-util: 30.3.0 jest-regex-util: 30.0.1 @@ -11342,42 +11407,6 @@ snapshots: - supports-color - ts-node - '@jest/core@30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3))': - dependencies: - '@jest/console': 30.3.0 - '@jest/pattern': 30.0.1 - '@jest/reporters': 30.3.0 - '@jest/test-result': 30.3.0 - '@jest/transform': 30.3.0 - '@jest/types': 30.3.0 - '@types/node': 26.0.1 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 4.4.0 - exit-x: 0.2.2 - graceful-fs: 4.2.11 - jest-changed-files: 30.3.0 - jest-config: 30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)) - jest-haste-map: 30.3.0 - jest-message-util: 30.3.0 - jest-regex-util: 30.0.1 - jest-resolve: 30.3.0 - jest-resolve-dependencies: 30.3.0 - jest-runner: 30.3.0 - jest-runtime: 30.3.0 - jest-snapshot: 30.3.0 - jest-util: 30.3.0 - jest-validate: 30.3.0 - jest-watcher: 30.3.0 - pretty-format: 30.3.0 - slash: 3.0.0 - transitivePeerDependencies: - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - optional: true - '@jest/diff-sequences@30.0.1': {} '@jest/diff-sequences@30.3.0': {} @@ -11525,34 +11554,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/reporters@30.4.1': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 26.0.1 - chalk: 4.1.2 - collect-v8-coverage: 1.0.3 - exit-x: 0.2.2 - glob: 10.5.0 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.2.0 - jest-message-util: 30.4.1 - jest-util: 30.4.1 - jest-worker: 30.4.1 - slash: 3.0.0 - string-length: 4.0.2 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color - '@jest/schemas@30.0.5': dependencies: '@sinclair/typebox': 0.34.49 @@ -11967,8 +11968,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.4': dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 + '@emnapi/core': 1.11.0 + '@emnapi/runtime': 1.11.0 '@tybys/wasm-util': 0.9.0 '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': @@ -11999,151 +12000,86 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@nx/devkit@23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))': + '@nx/devkit@24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))': dependencies: - '@zkochan/js-yaml': 0.0.7 ejs: 5.0.1 - enquirer: 2.3.6 minimatch: 10.2.5 - nx: 23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8) + nx: 24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8) semver: 7.8.5 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/docker@23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))': + '@nx/docker@24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))': dependencies: - '@nx/devkit': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - enquirer: 2.3.6 + '@nx/devkit': 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) tslib: 2.8.1 transitivePeerDependencies: - nx - '@nx/eslint-plugin@23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0))': + '@nx/eslint-plugin@24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0))': dependencies: - '@nx/devkit': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - '@nx/js': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) - '@typescript-eslint/type-utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - chalk: 4.1.2 + '@nx/devkit': 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) + '@nx/js': 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 6.2.0(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) confusing-browser-globals: 1.0.11 globals: 17.7.0 jsonc-eslint-parser: 2.4.2 + picocolors: 1.1.1 semver: 7.8.5 tslib: 2.8.1 optionalDependencies: - '@typescript-eslint/parser': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) eslint-config-prettier: 10.1.8(eslint@9.39.4(jiti@2.7.0)) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' - '@swc/cli' - '@swc/core' - - debug - eslint - nx - supports-color - typescript - verdaccio - '@nx/eslint@23.0.1(27194105918b1f64ab713fdfe0eab99b)': + '@nx/eslint@24.0.1(ada27c3ff0281fd0d6b8ac13c0ffadc8)': dependencies: - '@nx/devkit': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - '@nx/js': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) + '@nx/devkit': 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) + '@nx/js': 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) eslint: 9.39.4(jiti@2.7.0) semver: 7.8.5 tslib: 2.8.1 - typescript: 5.9.3 + typescript: 6.0.3 optionalDependencies: - '@nx/jest': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0)) + '@nx/jest': 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(ts-jest@29.4.15(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(typescript@6.0.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0)) '@zkochan/js-yaml': 0.0.7 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' - '@swc/cli' - '@swc/core' - - debug - - nx - - supports-color - - verdaccio - - '@nx/eslint@23.0.1(6d25d9fb9db583c14f895211a20da91c)': - dependencies: - '@nx/devkit': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - '@nx/js': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) - eslint: 9.39.4(jiti@2.7.0) - semver: 7.8.5 - tslib: 2.8.1 - typescript: 5.9.3 - optionalDependencies: - '@nx/jest': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.4.1)(jest@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0)) - '@zkochan/js-yaml': 0.0.7 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/cli' - - '@swc/core' - - debug - - nx - - supports-color - - verdaccio - - '@nx/jest@23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0))': - dependencies: - '@jest/reporters': 30.4.1 - '@jest/test-result': 30.4.1 - '@nx/devkit': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - '@nx/js': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) - identity-obj-proxy: 3.0.0 - jest-config: 30.4.2(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)) - jest-resolve: 30.4.1 - jest-util: 30.0.5 - minimatch: 10.2.5 - picocolors: 1.1.1 - resolve.exports: 2.0.3 - semver: 7.8.5 - tslib: 2.8.1 - yargs-parser: 21.1.1 - optionalDependencies: - jest: 30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)) - ts-jest: 29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3) - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/cli' - - '@swc/core' - - '@types/node' - - babel-plugin-macros - - debug - - esbuild-register - - node-notifier - nx - supports-color - - ts-node - - typescript - verdaccio - '@nx/jest@23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.4.1)(jest@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0))': + '@nx/jest@24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(ts-jest@29.4.15(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(typescript@6.0.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0))': dependencies: - '@jest/reporters': 30.4.1 - '@jest/test-result': 30.4.1 - '@nx/devkit': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - '@nx/js': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) + '@nx/devkit': 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) + '@nx/js': 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 6.2.0(typescript@6.0.3) identity-obj-proxy: 3.0.0 - jest-config: 30.4.2(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)) + jest-config: 30.4.2(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)) jest-resolve: 30.4.1 - jest-util: 30.0.5 + jsonc-parser: 3.3.1 minimatch: 10.2.5 - picocolors: 1.1.1 resolve.exports: 2.0.3 semver: 7.8.5 tslib: 2.8.1 yargs-parser: 21.1.1 optionalDependencies: - jest: 30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)) - ts-jest: 29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.4.1)(jest@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)))(typescript@5.9.3) + jest: 30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)) + ts-jest: 29.4.15(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(typescript@6.0.3) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -12151,26 +12087,27 @@ snapshots: - '@swc/core' - '@types/node' - babel-plugin-macros - - debug - esbuild-register - - node-notifier - nx - supports-color - ts-node - typescript - verdaccio - '@nx/js@23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0))': + '@nx/js@24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) '@babel/preset-env': 7.29.7(@babel/core@7.29.7) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) '@babel/runtime': 7.29.7 - '@nx/devkit': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - '@nx/workspace': 23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8) + '@nx/devkit': 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) + '@nx/workspace': 24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8) '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.29.7) babel-plugin-macros: 3.1.0 @@ -12195,17 +12132,16 @@ snapshots: - '@babel/traverse' - '@swc-node/register' - '@swc/core' - - debug - nx - supports-color - '@nx/node@23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.39.4(jiti@2.7.0))(express@4.22.2)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0))': + '@nx/node@24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.39.4(jiti@2.7.0))(express@4.22.2)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(ts-jest@29.4.15(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(typescript@6.0.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0))': dependencies: - '@nx/devkit': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - '@nx/docker': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - '@nx/eslint': 23.0.1(27194105918b1f64ab713fdfe0eab99b) - '@nx/jest': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0)) - '@nx/js': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) + '@nx/devkit': 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) + '@nx/docker': 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) + '@nx/eslint': 24.0.1(ada27c3ff0281fd0d6b8ac13c0ffadc8) + '@nx/jest': 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(ts-jest@29.4.15(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(typescript@6.0.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0)) + '@nx/js': 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) kill-port: 1.6.1 semver: 7.8.5 tcp-port-used: 1.0.3 @@ -12220,11 +12156,9 @@ snapshots: - '@types/node' - '@zkochan/js-yaml' - babel-plugin-macros - - debug - esbuild-register - eslint - jest - - node-notifier - nx - supports-color - ts-jest @@ -12232,43 +12166,45 @@ snapshots: - typescript - verdaccio - '@nx/nx-darwin-arm64@23.0.1': + '@nx/nx-darwin-arm64@24.0.1': optional: true - '@nx/nx-darwin-x64@23.0.1': + '@nx/nx-darwin-x64@24.0.1': optional: true - '@nx/nx-freebsd-x64@23.0.1': + '@nx/nx-freebsd-x64@24.0.1': optional: true - '@nx/nx-linux-arm-gnueabihf@23.0.1': + '@nx/nx-linux-arm-gnueabihf@24.0.1': optional: true - '@nx/nx-linux-arm64-gnu@23.0.1': + '@nx/nx-linux-arm64-gnu@24.0.1': optional: true - '@nx/nx-linux-arm64-musl@23.0.1': + '@nx/nx-linux-arm64-musl@24.0.1': optional: true - '@nx/nx-linux-x64-gnu@23.0.1': + '@nx/nx-linux-x64-gnu@24.0.1': optional: true - '@nx/nx-linux-x64-musl@23.0.1': + '@nx/nx-linux-x64-musl@24.0.1': optional: true - '@nx/nx-win32-arm64-msvc@23.0.1': + '@nx/nx-win32-arm64-msvc@24.0.1': optional: true - '@nx/nx-win32-x64-msvc@23.0.1': + '@nx/nx-win32-x64-msvc@24.0.1': optional: true - '@nx/plugin@23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.39.4(jiti@2.7.0))(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0))': + '@nx/plugin@24.0.1(adf1e0eb187ca1ac5c6b2f8d53e0d2ac)': dependencies: - '@nx/devkit': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - '@nx/eslint': 23.0.1(27194105918b1f64ab713fdfe0eab99b) - '@nx/jest': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0)) - '@nx/js': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) + '@nx/devkit': 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) + '@nx/eslint': 24.0.1(ada27c3ff0281fd0d6b8ac13c0ffadc8) + '@nx/jest': 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(ts-jest@29.4.15(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(typescript@6.0.3))(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0)) + '@nx/js': 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) tslib: 2.8.1 + optionalDependencies: + '@nx/vitest': 24.0.1(@babel/traverse@7.29.7)(@nx/eslint@24.0.1(ada27c3ff0281fd0d6b8ac13c0ffadc8))(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0))(vite@5.4.21(@types/node@18.19.21)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -12277,11 +12213,9 @@ snapshots: - '@types/node' - '@zkochan/js-yaml' - babel-plugin-macros - - debug - esbuild-register - eslint - jest - - node-notifier - nx - supports-color - ts-jest @@ -12289,20 +12223,40 @@ snapshots: - typescript - verdaccio - '@nx/webpack@23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(html-webpack-plugin@5.6.7(webpack@5.108.0))(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(typescript@5.9.3)(verdaccio@6.7.4(typanion@3.14.0))(webpack-cli@7.0.3)(webpack-dev-server@5.2.5)(webpack@5.108.0)': + '@nx/vitest@24.0.1(@babel/traverse@7.29.7)(@nx/eslint@24.0.1(ada27c3ff0281fd0d6b8ac13c0ffadc8))(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0))(vite@5.4.21(@types/node@18.19.21)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0))': + dependencies: + '@nx/devkit': 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) + '@nx/js': 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 6.2.0(typescript@6.0.3) + semver: 7.8.5 + tslib: 2.8.1 + optionalDependencies: + '@nx/eslint': 24.0.1(ada27c3ff0281fd0d6b8ac13c0ffadc8) + vite: 5.4.21(@types/node@18.19.21)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0) + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/cli' + - '@swc/core' + - nx + - supports-color + - typescript + - verdaccio + + '@nx/webpack@24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(html-webpack-plugin@5.6.7(webpack@5.108.0))(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(typescript@6.0.3)(verdaccio@6.7.4(typanion@3.14.0))(webpack-cli@7.0.3)(webpack-dev-server@5.2.5)(webpack@5.108.0)': dependencies: '@babel/core': 7.29.7 - '@nx/devkit': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) - '@nx/js': 23.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) + '@nx/devkit': 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) + '@nx/js': 24.0.1(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/cli@0.8.1(@swc/core@1.15.8)(chokidar@5.0.0))(@swc/core@1.15.8)(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8))(verdaccio@6.7.4(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 6.2.0(typescript@6.0.3) ajv: 8.20.0 autoprefixer: 10.5.2(postcss@8.5.15) babel-loader: 9.2.1(@babel/core@7.29.7)(webpack@5.108.0) browserslist: 4.28.4 copy-webpack-plugin: 14.0.0(webpack@5.108.0) - css-loader: 6.11.0(webpack@5.108.0) + css-loader: 7.1.5(webpack@5.108.0) css-minimizer-webpack-plugin: 8.0.0(webpack@5.108.0) - fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.108.0) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@6.0.3)(webpack@5.108.0) less: 4.5.1 less-loader: 12.3.3(less@4.5.1)(webpack@5.108.0) license-webpack-plugin: 4.0.2(webpack@5.108.0) @@ -12312,7 +12266,7 @@ snapshots: picocolors: 1.1.1 postcss: 8.5.15 postcss-import: 14.1.0(postcss@8.5.15) - postcss-loader: 8.2.1(postcss@8.5.15)(typescript@5.9.3)(webpack@5.108.0) + postcss-loader: 8.2.1(postcss@8.5.15)(typescript@6.0.3)(webpack@5.108.0) rxjs: 7.8.2 sass: 1.101.0 sass-embedded: 1.100.0 @@ -12320,7 +12274,7 @@ snapshots: source-map-loader: 5.0.0(webpack@5.108.0) style-loader: 3.3.4(webpack@5.108.0) terser-webpack-plugin: 5.6.1(@swc/core@1.15.8)(postcss@8.5.15)(webpack@5.108.0) - ts-loader: 9.6.2(loader-utils@2.0.4)(typescript@5.9.3)(webpack@5.108.0) + ts-loader: 9.6.2(loader-utils@2.0.4)(typescript@6.0.3)(webpack@5.108.0) tsconfig-paths-webpack-plugin: 4.2.0 tslib: 2.8.1 webpack-node-externals: 3.0.0 @@ -12342,7 +12296,6 @@ snapshots: - clean-css - cssnano - csso - - debug - esbuild - html-minifier-terser - html-webpack-plugin @@ -12354,13 +12307,12 @@ snapshots: - uglify-js - verdaccio - '@nx/workspace@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)': + '@nx/workspace@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)': dependencies: - '@nx/devkit': 23.0.1(nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8)) + '@nx/devkit': 24.0.1(nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8)) '@zkochan/js-yaml': 0.0.7 chalk: 4.1.2 - enquirer: 2.3.6 - nx: 23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8) + nx: 24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8) picomatch: 4.0.4 semver: 7.8.5 tslib: 2.8.1 @@ -12368,7 +12320,6 @@ snapshots: transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - - debug '@octokit/auth-token@6.0.0': {} @@ -12646,11 +12597,11 @@ snapshots: tslib: 2.8.1 tsyringe: 4.10.0 - '@phenomnomnominal/tsquery@6.2.0(typescript@5.9.3)': + '@phenomnomnominal/tsquery@6.2.0(typescript@6.0.3)': dependencies: '@types/esquery': 1.5.4 esquery: 1.7.0 - typescript: 5.9.3 + typescript: 6.0.3 '@pinojs/redact@0.4.0': {} @@ -12750,7 +12701,7 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@semantic-release/commit-analyzer@13.0.1(semantic-release@25.0.5(typescript@5.9.3))': + '@semantic-release/commit-analyzer@13.0.1(semantic-release@25.0.5(typescript@6.0.3))': dependencies: conventional-changelog-angular: 8.3.1 conventional-changelog-writer: 8.4.0 @@ -12760,13 +12711,13 @@ snapshots: import-from-esm: 2.0.0 lodash-es: 4.18.1 micromatch: 4.0.8 - semantic-release: 25.0.5(typescript@5.9.3) + semantic-release: 25.0.5(typescript@6.0.3) transitivePeerDependencies: - supports-color '@semantic-release/error@4.0.0': {} - '@semantic-release/exec@7.1.0(semantic-release@25.0.5(typescript@5.9.3))': + '@semantic-release/exec@7.1.0(semantic-release@25.0.5(typescript@6.0.3))': dependencies: '@semantic-release/error': 4.0.0 aggregate-error: 3.1.0 @@ -12774,11 +12725,11 @@ snapshots: execa: 9.6.1 lodash-es: 4.18.1 parse-json: 8.3.0 - semantic-release: 25.0.5(typescript@5.9.3) + semantic-release: 25.0.5(typescript@6.0.3) transitivePeerDependencies: - supports-color - '@semantic-release/github@12.0.8(semantic-release@25.0.5(typescript@5.9.3))': + '@semantic-release/github@12.0.8(semantic-release@25.0.5(typescript@6.0.3))': dependencies: '@octokit/core': 7.0.6 '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) @@ -12794,7 +12745,7 @@ snapshots: lodash-es: 4.18.1 mime: 4.1.0 p-filter: 4.1.0 - semantic-release: 25.0.5(typescript@5.9.3) + semantic-release: 25.0.5(typescript@6.0.3) tinyglobby: 0.2.17 undici: 7.28.0 url-join: 5.0.0 @@ -12802,7 +12753,7 @@ snapshots: - kerberos - supports-color - '@semantic-release/npm@13.1.5(semantic-release@25.0.5(typescript@5.9.3))': + '@semantic-release/npm@13.1.5(semantic-release@25.0.5(typescript@6.0.3))': dependencies: '@actions/core': 3.0.1 '@semantic-release/error': 4.0.0 @@ -12817,11 +12768,11 @@ snapshots: rc: 1.2.8 read-pkg: 10.1.0 registry-auth-token: 5.1.1 - semantic-release: 25.0.5(typescript@5.9.3) + semantic-release: 25.0.5(typescript@6.0.3) semver: 7.8.5 tempy: 3.2.0 - '@semantic-release/release-notes-generator@14.1.1(semantic-release@25.0.5(typescript@5.9.3))': + '@semantic-release/release-notes-generator@14.1.1(semantic-release@25.0.5(typescript@6.0.3))': dependencies: conventional-changelog-angular: 8.3.1 conventional-changelog-writer: 8.4.0 @@ -12831,7 +12782,7 @@ snapshots: import-from-esm: 2.0.0 lodash-es: 4.18.1 read-package-up: 11.0.0 - semantic-release: 25.0.5(typescript@5.9.3) + semantic-release: 25.0.5(typescript@6.0.3) transitivePeerDependencies: - supports-color @@ -12932,7 +12883,7 @@ snapshots: '@swc/core': 1.15.8 '@swc/types': 0.1.27 - '@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3)': + '@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3)': dependencies: '@swc-node/core': 1.14.1(@swc/core@1.15.8)(@swc/types@0.1.27) '@swc-node/sourcemap-support': 0.6.1 @@ -12942,7 +12893,7 @@ snapshots: oxc-resolver: 11.21.3 pirates: 4.0.7 tslib: 2.8.1 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - '@swc/types' - supports-color @@ -13241,40 +13192,40 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.62.0(@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.62.0(@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.62.0 - '@typescript-eslint/type-utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.62.0 eslint: 9.39.4(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.62.0 '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.62.0 debug: 4.4.3 eslint: 9.39.4(jiti@2.7.0) - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.62.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.62.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@6.0.3) '@typescript-eslint/types': 8.62.0 debug: 4.4.3 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -13283,19 +13234,19 @@ snapshots: '@typescript-eslint/types': 8.62.0 '@typescript-eslint/visitor-keys': 8.62.0 - '@typescript-eslint/tsconfig-utils@8.62.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.62.0(typescript@6.0.3)': dependencies: - typescript: 5.9.3 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3 eslint: 9.39.4(jiti@2.7.0) - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -13303,7 +13254,7 @@ snapshots: '@typescript-eslint/types@8.62.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -13311,35 +13262,35 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.8.5 - tsutils: 3.21.0(typescript@5.9.3) + tsutils: 3.21.0(typescript@6.0.3) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.62.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.62.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.62.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@5.9.3) + '@typescript-eslint/project-service': 8.62.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@6.0.3) '@typescript-eslint/types': 8.62.0 '@typescript-eslint/visitor-keys': 8.62.0 debug: 4.4.3 minimatch: 10.2.5 semver: 7.8.5 tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/utils@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.62.0 '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) eslint: 9.39.4(jiti@2.7.0) - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -13589,10 +13540,10 @@ snapshots: lodash: 4.18.1 minimatch: 7.4.9 - '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@18.19.21)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0))(vue@3.5.38(typescript@5.9.3))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@18.19.21)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0))(vue@3.5.38(typescript@6.0.3))': dependencies: vite: 5.4.21(@types/node@18.19.21)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0) - vue: 3.5.38(typescript@5.9.3) + vue: 3.5.38(typescript@6.0.3) '@vue/compiler-core@3.5.38': dependencies: @@ -13658,28 +13609,28 @@ snapshots: '@vue/shared': 3.5.38 csstype: 3.2.3 - '@vue/server-renderer@3.5.38(vue@3.5.38(typescript@5.9.3))': + '@vue/server-renderer@3.5.38(vue@3.5.38(typescript@6.0.3))': dependencies: '@vue/compiler-ssr': 3.5.38 '@vue/shared': 3.5.38 - vue: 3.5.38(typescript@5.9.3) + vue: 3.5.38(typescript@6.0.3) '@vue/shared@3.5.38': {} - '@vueuse/core@12.8.2(typescript@5.9.3)': + '@vueuse/core@12.8.2(typescript@6.0.3)': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 12.8.2 - '@vueuse/shared': 12.8.2(typescript@5.9.3) - vue: 3.5.38(typescript@5.9.3) + '@vueuse/shared': 12.8.2(typescript@6.0.3) + vue: 3.5.38(typescript@6.0.3) transitivePeerDependencies: - typescript - '@vueuse/integrations@12.8.2(axios@1.16.0)(focus-trap@7.8.0)(fuse.js@7.3.0)(typescript@5.9.3)': + '@vueuse/integrations@12.8.2(axios@1.16.0)(focus-trap@7.8.0)(fuse.js@7.3.0)(typescript@6.0.3)': dependencies: - '@vueuse/core': 12.8.2(typescript@5.9.3) - '@vueuse/shared': 12.8.2(typescript@5.9.3) - vue: 3.5.38(typescript@5.9.3) + '@vueuse/core': 12.8.2(typescript@6.0.3) + '@vueuse/shared': 12.8.2(typescript@6.0.3) + vue: 3.5.38(typescript@6.0.3) optionalDependencies: axios: 1.16.0 focus-trap: 7.8.0 @@ -13689,9 +13640,9 @@ snapshots: '@vueuse/metadata@12.8.2': {} - '@vueuse/shared@12.8.2(typescript@5.9.3)': + '@vueuse/shared@12.8.2(typescript@6.0.3)': dependencies: - vue: 3.5.38(typescript@5.9.3) + vue: 3.5.38(typescript@6.0.3) transitivePeerDependencies: - typescript @@ -13977,8 +13928,6 @@ snapshots: '@algolia/requester-fetch': 5.55.1 '@algolia/requester-node-http': 5.55.1 - ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -14116,6 +14065,7 @@ snapshots: proxy-from-env: 2.1.0 transitivePeerDependencies: - debug + optional: true b4a@1.8.1: {} @@ -14373,6 +14323,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.12: + dependencies: + balanced-match: 4.0.3 + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.3 @@ -14545,7 +14499,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.28.0 + undici: 7.29.0 whatwg-mimetype: 4.0.0 chokidar@3.6.0: @@ -14767,6 +14721,10 @@ snapshots: dependencies: compare-func: 2.0.0 + conventional-changelog-conventionalcommits@9.3.1: + dependencies: + compare-func: 2.0.0 + conventional-changelog-writer@8.4.0: dependencies: '@simple-libs/stream-utils': 1.2.0 @@ -14820,12 +14778,12 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig-typescript-loader@6.3.0(@types/node@18.19.21)(cosmiconfig@9.0.2(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@6.3.0(@types/node@18.19.21)(cosmiconfig@9.0.2(typescript@6.0.3))(typescript@6.0.3): dependencies: '@types/node': 18.19.21 - cosmiconfig: 9.0.2(typescript@5.9.3) + cosmiconfig: 9.0.2(typescript@6.0.3) jiti: 2.6.1 - typescript: 5.9.3 + typescript: 6.0.3 cosmiconfig@7.1.0: dependencies: @@ -14835,23 +14793,23 @@ snapshots: path-type: 4.0.0 yaml: 1.10.3 - cosmiconfig@8.3.6(typescript@5.9.3): + cosmiconfig@8.3.6(typescript@6.0.3): dependencies: import-fresh: 3.3.1 js-yaml: 4.2.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 - cosmiconfig@9.0.2(typescript@5.9.3): + cosmiconfig@9.0.2(typescript@6.0.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.2.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 crc-32@1.2.2: {} @@ -14882,7 +14840,7 @@ snapshots: dependencies: postcss: 8.5.15 - css-loader@6.11.0(webpack@5.108.0): + css-loader@7.1.5(webpack@5.108.0): dependencies: icss-utils: 5.1.0(postcss@8.5.15) postcss: 8.5.15 @@ -15080,8 +15038,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - define-lazy-prop@2.0.0: {} - define-lazy-prop@3.0.0: {} define-properties@1.2.1: @@ -15257,10 +15213,6 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.3 - enquirer@2.3.6: - dependencies: - ansi-colors: 4.1.3 - entities@2.2.0: {} entities@4.5.0: {} @@ -15701,8 +15653,18 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + fast-uri@3.1.2: {} + fast-wrap-ansi@0.2.0: + dependencies: + fast-string-width: 3.0.2 + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -15833,12 +15795,12 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.108.0): + fork-ts-checker-webpack-plugin@9.1.0(typescript@6.0.3)(webpack@5.108.0): dependencies: '@babel/code-frame': 7.29.7 chalk: 4.1.2 chokidar: 4.0.3 - cosmiconfig: 8.3.6(typescript@5.9.3) + cosmiconfig: 8.3.6(typescript@6.0.3) deepmerge: 4.3.1 fs-extra: 10.1.0 memfs: 3.5.3 @@ -15847,7 +15809,7 @@ snapshots: schema-utils: 3.3.0 semver: 7.8.5 tapable: 2.3.3 - typescript: 5.9.3 + typescript: 6.0.3 webpack: 5.108.0(@swc/core@1.15.8)(postcss@8.5.15)(webpack-cli@7.0.3) form-data-encoder@1.7.2: {} @@ -16131,6 +16093,15 @@ snapshots: handle-thing@2.0.1: {} + handlebars@4.7.10: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + handlebars@4.7.9: dependencies: minimist: 1.2.8 @@ -16381,6 +16352,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.12: {} + ignore@7.0.5: {} image-size@0.5.5: @@ -16525,8 +16498,6 @@ snapshots: is-deflate@1.0.0: {} - is-docker@2.2.1: {} - is-docker@3.0.0: {} is-document.all@1.0.0: @@ -16649,10 +16620,6 @@ snapshots: is-what@5.5.0: {} - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -16780,34 +16747,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)): - dependencies: - '@jest/core': 30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)) - '@jest/test-result': 30.3.0 - '@jest/types': 30.3.0 - chalk: 4.1.2 - exit-x: 0.2.2 - import-local: 3.2.0 - jest-config: 30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)) - jest-util: 30.3.0 - jest-validate: 30.3.0 - yargs: 17.7.3 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - - jest-cli@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)): + jest-cli@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)): dependencies: - '@jest/core': 30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)) + '@jest/core': 30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)) '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)) + jest-config: 30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)) jest-util: 30.3.0 jest-validate: 30.3.0 yargs: 17.7.3 @@ -16817,9 +16765,8 @@ snapshots: - esbuild-register - supports-color - ts-node - optional: true - jest-config@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)): + jest-config@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)): dependencies: '@babel/core': 7.29.7 '@jest/get-type': 30.1.0 @@ -16846,44 +16793,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.21 - ts-node: 10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)): - dependencies: - '@babel/core': 7.29.7 - '@jest/get-type': 30.1.0 - '@jest/pattern': 30.0.1 - '@jest/test-sequencer': 30.3.0 - '@jest/types': 30.3.0 - babel-jest: 30.3.0(@babel/core@7.29.7) - chalk: 4.1.2 - ci-info: 4.4.0 - deepmerge: 4.3.1 - glob: 10.5.0 - graceful-fs: 4.2.11 - jest-circus: 30.3.0(babel-plugin-macros@3.1.0) - jest-docblock: 30.2.0 - jest-environment-node: 30.3.0 - jest-regex-util: 30.0.1 - jest-resolve: 30.3.0 - jest-runner: 30.3.0 - jest-util: 30.3.0 - jest-validate: 30.3.0 - parse-json: 5.2.0 - pretty-format: 30.3.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 26.0.1 - ts-node: 10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3) + ts-node: 10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)): + jest-config@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)): dependencies: '@babel/core': 7.29.7 '@jest/get-type': 30.1.0 @@ -16910,13 +16825,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 26.0.1 - ts-node: 10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3) + ts-node: 10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - optional: true - jest-config@30.4.2(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)): + jest-config@30.4.2(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)): dependencies: '@babel/core': 7.29.7 '@jest/get-type': 30.1.0 @@ -16943,39 +16857,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.21 - ts-node: 10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@30.4.2(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)): - dependencies: - '@babel/core': 7.29.7 - '@jest/get-type': 30.1.0 - '@jest/pattern': 30.4.0 - '@jest/test-sequencer': 30.4.1 - '@jest/types': 30.4.1 - babel-jest: 30.4.1(@babel/core@7.29.7) - chalk: 4.1.2 - ci-info: 4.4.0 - deepmerge: 4.3.1 - glob: 10.5.0 - graceful-fs: 4.2.11 - jest-circus: 30.4.2(babel-plugin-macros@3.1.0) - jest-docblock: 30.4.0 - jest-environment-node: 30.4.1 - jest-regex-util: 30.4.0 - jest-resolve: 30.4.1 - jest-runner: 30.4.2 - jest-util: 30.4.1 - jest-validate: 30.4.1 - parse-json: 5.2.0 - pretty-format: 30.4.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 26.0.1 - ts-node: 10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3) + ts-node: 10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -17468,32 +17350,18 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)): - dependencies: - '@jest/core': 30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)) - '@jest/types': 30.3.0 - import-local: 3.2.0 - jest-cli: 30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - - jest@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)): + jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)): dependencies: - '@jest/core': 30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)) + '@jest/core': 30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)) '@jest/types': 30.3.0 import-local: 3.2.0 - jest-cli: 30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)) + jest-cli: 30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - esbuild-register - supports-color - ts-node - optional: true jiti@2.6.1: {} @@ -18139,8 +18007,10 @@ snapshots: nwsapi@2.2.24: {} - nx@23.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3))(@swc/core@1.15.8): + nx@24.0.1(@swc-node/register@1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.8): dependencies: + '@clack/core': 1.4.3 + '@clack/prompts': 1.7.0 '@emnapi/core': 1.4.5 '@emnapi/runtime': 1.4.5 '@emnapi/wasi-threads': 1.0.4 @@ -18149,18 +18019,14 @@ snapshots: '@tybys/wasm-util': 0.9.0 '@yarnpkg/lockfile': 1.1.0 '@zkochan/js-yaml': 0.0.7 - ansi-colors: 4.1.3 ansi-regex: 5.0.1 ansi-styles: 4.3.0 argparse: 2.0.1 - asynckit: 0.4.0 - axios: 1.16.0 balanced-match: 4.0.3 base64-js: 1.5.1 bl: 4.1.0 - brace-expansion: 5.0.6 + brace-expansion: 5.0.12 buffer: 5.7.1 - call-bind-apply-helpers: 1.0.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -18168,72 +18034,50 @@ snapshots: clone: 1.0.4 color-convert: 2.0.1 color-name: 1.1.4 - combined-stream: 1.0.8 defaults: 1.0.4 - define-lazy-prop: 2.0.0 - delayed-stream: 1.0.0 dotenv: 16.4.7 dotenv-expand: 12.0.3 - dunder-proto: 1.0.1 ejs: 5.0.1 emoji-regex: 8.0.0 end-of-stream: 1.4.5 - enquirer: 2.3.6 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 escalade: 3.2.0 escape-string-regexp: 1.0.5 + fast-string-truncated-width: 3.0.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.0 figures: 3.2.0 - flat: 5.0.2 - follow-redirects: 1.16.0 - form-data: 4.0.6 fs-constants: 1.0.0 - function-bind: 1.1.2 get-caller-file: 2.0.5 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 has-flag: 4.0.0 - has-symbols: 1.1.0 - has-tostringtag: 1.0.2 - hasown: 2.0.4 ieee754: 1.2.1 - ignore: 7.0.5 + ignore: 7.0.12 inherits: 2.0.4 - is-docker: 2.2.1 is-fullwidth-code-point: 3.0.0 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 - is-wsl: 2.2.0 isexe: 2.0.0 json5: 2.2.3 jsonc-parser: 3.3.1 lines-and-columns: 2.0.3 log-symbols: 4.1.0 - math-intrinsics: 1.1.0 - mime-db: 1.52.0 - mime-types: 2.1.35 mimic-fn: 2.1.0 minimatch: 10.2.5 minimist: 1.2.8 npm-run-path: 4.0.1 once: 1.4.0 onetime: 5.1.2 - open: 8.4.2 ora: 5.4.1 path-key: 3.1.1 picocolors: 1.1.1 - proxy-from-env: 2.1.0 readable-stream: 3.6.2 require-directory: 2.1.1 resolve.exports: 2.0.3 restore-cursor: 3.1.0 safe-buffer: 5.2.1 - semver: 7.7.4 + semver: 7.8.5 signal-exit: 3.0.7 - smol-toml: 1.6.1 + sisteransi: 1.0.5 + smol-toml: 1.9.0 string-width: 4.2.3 string_decoder: 1.3.0 strip-ansi: 6.0.1 @@ -18243,6 +18087,7 @@ snapshots: tmp: 0.2.7 tsconfig-paths: 4.2.0 tslib: 2.8.1 + undici: 7.29.0 util-deprecate: 1.0.2 wcwidth: 1.0.1 which: 3.0.1 @@ -18253,20 +18098,18 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 23.0.1 - '@nx/nx-darwin-x64': 23.0.1 - '@nx/nx-freebsd-x64': 23.0.1 - '@nx/nx-linux-arm-gnueabihf': 23.0.1 - '@nx/nx-linux-arm64-gnu': 23.0.1 - '@nx/nx-linux-arm64-musl': 23.0.1 - '@nx/nx-linux-x64-gnu': 23.0.1 - '@nx/nx-linux-x64-musl': 23.0.1 - '@nx/nx-win32-arm64-msvc': 23.0.1 - '@nx/nx-win32-x64-msvc': 23.0.1 - '@swc-node/register': 1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@5.9.3) + '@nx/nx-darwin-arm64': 24.0.1 + '@nx/nx-darwin-x64': 24.0.1 + '@nx/nx-freebsd-x64': 24.0.1 + '@nx/nx-linux-arm-gnueabihf': 24.0.1 + '@nx/nx-linux-arm64-gnu': 24.0.1 + '@nx/nx-linux-arm64-musl': 24.0.1 + '@nx/nx-linux-x64-gnu': 24.0.1 + '@nx/nx-linux-x64-musl': 24.0.1 + '@nx/nx-win32-arm64-msvc': 24.0.1 + '@nx/nx-win32-x64-msvc': 24.0.1 + '@swc-node/register': 1.11.1(@swc/core@1.15.8)(@swc/types@0.1.27)(typescript@6.0.3) '@swc/core': 1.15.8 - transitivePeerDependencies: - - debug object-assign@4.1.1: {} @@ -18320,12 +18163,6 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - opener@1.5.2: {} optionator@0.9.4: @@ -18680,9 +18517,9 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.12 - postcss-loader@8.2.1(postcss@8.5.15)(typescript@5.9.3)(webpack@5.108.0): + postcss-loader@8.2.1(postcss@8.5.15)(typescript@6.0.3)(webpack@5.108.0): dependencies: - cosmiconfig: 9.0.2(typescript@5.9.3) + cosmiconfig: 9.0.2(typescript@6.0.3) jiti: 2.7.0 postcss: 8.5.15 semver: 7.8.5 @@ -18909,7 +18746,8 @@ snapshots: proxy-agent-negotiate@1.1.0: {} - proxy-from-env@2.1.0: {} + proxy-from-env@2.1.0: + optional: true prr@1.0.1: optional: true @@ -19398,15 +19236,15 @@ snapshots: '@peculiar/x509': 1.14.3 pkijs: 3.4.0 - semantic-release@25.0.5(typescript@5.9.3): + semantic-release@25.0.5(typescript@6.0.3): dependencies: - '@semantic-release/commit-analyzer': 13.0.1(semantic-release@25.0.5(typescript@5.9.3)) + '@semantic-release/commit-analyzer': 13.0.1(semantic-release@25.0.5(typescript@6.0.3)) '@semantic-release/error': 4.0.0 - '@semantic-release/github': 12.0.8(semantic-release@25.0.5(typescript@5.9.3)) - '@semantic-release/npm': 13.1.5(semantic-release@25.0.5(typescript@5.9.3)) - '@semantic-release/release-notes-generator': 14.1.1(semantic-release@25.0.5(typescript@5.9.3)) + '@semantic-release/github': 12.0.8(semantic-release@25.0.5(typescript@6.0.3)) + '@semantic-release/npm': 13.1.5(semantic-release@25.0.5(typescript@6.0.3)) + '@semantic-release/release-notes-generator': 14.1.1(semantic-release@25.0.5(typescript@6.0.3)) aggregate-error: 5.0.0 - cosmiconfig: 9.0.2(typescript@5.9.3) + cosmiconfig: 9.0.2(typescript@6.0.3) debug: 4.4.3 env-ci: 11.2.0 execa: 9.6.1 @@ -19592,13 +19430,15 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 + sisteransi@1.0.5: {} + skin-tone@2.0.0: dependencies: unicode-emoji-modifier-base: 1.0.0 slash@3.0.0: {} - smol-toml@1.6.1: {} + smol-toml@1.9.0: {} sockjs@0.3.24: dependencies: @@ -20083,22 +19923,22 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@2.5.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 5.9.3 + typescript: 6.0.3 - ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.15(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.0.5)(jest@30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)))(typescript@6.0.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - handlebars: 4.7.9 - jest: 30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3)) + handlebars: 4.7.10 + jest: 30.3.0(@types/node@18.19.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.8.5 type-fest: 4.41.0 - typescript: 5.9.3 + typescript: 6.0.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.29.7 @@ -20107,38 +19947,17 @@ snapshots: babel-jest: 30.4.1(@babel/core@7.29.7) jest-util: 30.0.5 - ts-jest@29.4.6(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.4.1)(jest@30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)))(typescript@5.9.3): - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - handlebars: 4.7.9 - jest: 30.3.0(@types/node@26.0.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3)) - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.8.5 - type-fest: 4.41.0 - typescript: 5.9.3 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.29.7 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - babel-jest: 30.4.1(@babel/core@7.29.7) - jest-util: 30.4.1 - optional: true - - ts-loader@9.6.2(loader-utils@2.0.4)(typescript@5.9.3)(webpack@5.108.0): + ts-loader@9.6.2(loader-utils@2.0.4)(typescript@6.0.3)(webpack@5.108.0): dependencies: chalk: 4.1.2 picomatch: 4.0.4 source-map: 0.7.6 - typescript: 5.9.3 + typescript: 6.0.3 webpack: 5.108.0(@swc/core@1.15.8)(postcss@8.5.15)(webpack-cli@7.0.3) optionalDependencies: loader-utils: 2.0.4 - ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@5.9.3): + ts-node@10.9.1(@swc/core@1.15.8)(@types/node@18.19.21)(typescript@6.0.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -20152,33 +19971,12 @@ snapshots: create-require: 1.1.1 diff: 4.0.4 make-error: 1.3.6 - typescript: 5.9.3 + typescript: 6.0.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.15.8 - ts-node@10.9.1(@swc/core@1.15.8)(@types/node@26.0.1)(typescript@5.9.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 26.0.1 - acorn: 8.17.0 - acorn-walk: 8.3.5 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.4 - make-error: 1.3.6 - typescript: 5.9.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.15.8 - optional: true - tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 @@ -20196,10 +19994,10 @@ snapshots: tslib@2.8.1: {} - tsutils@3.21.0(typescript@5.9.3): + tsutils@3.21.0(typescript@6.0.3): dependencies: tslib: 1.14.1 - typescript: 5.9.3 + typescript: 6.0.3 tsyringe@4.10.0: dependencies: @@ -20277,18 +20075,18 @@ snapshots: typed-assert@1.0.9: {} - typescript-eslint@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): + typescript-eslint@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.62.0(@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/parser': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.62.0(@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.62.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) eslint: 9.39.4(jiti@2.7.0) - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - typescript@5.9.3: {} + typescript@6.0.3: {} uglify-js@3.19.3: optional: true @@ -20535,7 +20333,7 @@ snapshots: sass-embedded: 1.100.0 terser: 5.48.0 - vitepress@1.6.4(@algolia/client-search@5.55.1)(@types/node@18.19.21)(axios@1.16.0)(fuse.js@7.3.0)(less@4.5.1)(postcss@8.5.15)(sass-embedded@1.100.0)(sass@1.101.0)(search-insights@2.17.3)(terser@5.48.0)(typescript@5.9.3): + vitepress@1.6.4(@algolia/client-search@5.55.1)(@types/node@18.19.21)(axios@1.16.0)(fuse.js@7.3.0)(less@4.5.1)(postcss@8.5.15)(sass-embedded@1.100.0)(sass@1.101.0)(search-insights@2.17.3)(terser@5.48.0)(typescript@6.0.3): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.55.1)(search-insights@2.17.3) @@ -20544,17 +20342,17 @@ snapshots: '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@18.19.21)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0))(vue@3.5.38(typescript@5.9.3)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@18.19.21)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0))(vue@3.5.38(typescript@6.0.3)) '@vue/devtools-api': 7.7.9 '@vue/shared': 3.5.38 - '@vueuse/core': 12.8.2(typescript@5.9.3) - '@vueuse/integrations': 12.8.2(axios@1.16.0)(focus-trap@7.8.0)(fuse.js@7.3.0)(typescript@5.9.3) + '@vueuse/core': 12.8.2(typescript@6.0.3) + '@vueuse/integrations': 12.8.2(axios@1.16.0)(focus-trap@7.8.0)(fuse.js@7.3.0)(typescript@6.0.3) focus-trap: 7.8.0 mark.js: 8.11.1 minisearch: 7.2.0 shiki: 2.5.0 vite: 5.4.21(@types/node@18.19.21)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0) - vue: 3.5.38(typescript@5.9.3) + vue: 3.5.38(typescript@6.0.3) optionalDependencies: postcss: 8.5.15 transitivePeerDependencies: @@ -20584,15 +20382,15 @@ snapshots: - typescript - universal-cookie - vue@3.5.38(typescript@5.9.3): + vue@3.5.38(typescript@6.0.3): dependencies: '@vue/compiler-dom': 3.5.38 '@vue/compiler-sfc': 3.5.38 '@vue/runtime-dom': 3.5.38 - '@vue/server-renderer': 3.5.38(vue@3.5.38(typescript@5.9.3)) + '@vue/server-renderer': 3.5.38(vue@3.5.38(typescript@6.0.3)) '@vue/shared': 3.5.38 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 w3c-xmlserializer@5.0.0: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 08dd7a8..52492d9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -14,11 +14,11 @@ allowBuilds: unrs-resolver: true catalog: '@commitlint/cli': '^20.2.0' - '@commitlint/config-angular': '^20.2.0' + '@commitlint/config-conventional': '^20.2.0' '@eslint/eslintrc': '^2.1.1' '@eslint/js': '^9.39.1' '@forge/cli': '^13.4.0' - '@forge/manifest': '^13.3.1' + '@forge/manifest': '^13.8.0' '@semantic-release/exec': '^7.1.0' '@swc-node/register': '1.11.1' '@swc/cli': '0.8.1' @@ -30,6 +30,7 @@ catalog: '@types/node': '18.19.21' '@typescript-eslint/eslint-plugin': '^8.40.0' '@typescript-eslint/parser': '^8.40.0' + conventional-changelog-conventionalcommits: '^9.3.1' cross-spawn: '7.0.6' dotenv: '^16.0.3' eslint: '^9.8.0' @@ -48,10 +49,10 @@ catalog: prettier: '2.8.0' semantic-release: '^25.0.2' strip-ansi: '^6.0.1' - ts-jest: '29.4.6' + ts-jest: '29.4.15' ts-node: '10.9.1' tslib: '^2.8.1' - typescript: '5.9.3' + typescript: '6.0.3' typescript-eslint: '^8.62.0' verdaccio: '6.7.4' vitepress: '^1.1.4' @@ -61,15 +62,18 @@ catalog: zod: '^3.25.76' catalogs: nx: - '@nx/devkit': '23.0.1' - '@nx/eslint': '23.0.1' - '@nx/eslint-plugin': '23.0.1' - '@nx/jest': '23.0.1' - '@nx/js': '23.0.1' - '@nx/node': '23.0.1' - '@nx/plugin': '23.0.1' - '@nx/webpack': '23.0.1' - '@nx/workspace': '23.0.1' - nx: '23.0.1' + '@nx/devkit': '24.0.1' + '@nx/eslint': '24.0.1' + '@nx/eslint-plugin': '24.0.1' + '@nx/jest': '24.0.1' + '@nx/js': '24.0.1' + '@nx/node': '24.0.1' + '@nx/plugin': '24.0.1' + '@nx/vitest': '24.0.1' + '@nx/webpack': '24.0.1' + '@nx/workspace': '24.0.1' + nx: '24.0.1' minimumReleaseAgeExclude: - webpack@5.108.0 + - '@forge/i18n@1.0.1' + - '@forge/manifest@13.8.0' diff --git a/tools/docs/jest.config.ts b/tools/docs/jest.config.cts similarity index 93% rename from tools/docs/jest.config.ts rename to tools/docs/jest.config.cts index 1318024..cc682b2 100644 --- a/tools/docs/jest.config.ts +++ b/tools/docs/jest.config.cts @@ -1,4 +1,4 @@ -export default { +module.exports = { displayName: 'docs-tools', preset: '../../jest.preset.js', transform: { diff --git a/tools/docs/project.json b/tools/docs/project.json index f0ec1fd..7485d05 100644 --- a/tools/docs/project.json +++ b/tools/docs/project.json @@ -36,16 +36,6 @@ } ] } - }, - "lint": { - "executor": "@nx/eslint:lint" - }, - "test": { - "executor": "@nx/jest:jest", - "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], - "options": { - "jestConfig": "tools/docs/jest.config.ts" - } } } } diff --git a/tools/docs/tsconfig.json b/tools/docs/tsconfig.json index 19b9eec..788871d 100644 --- a/tools/docs/tsconfig.json +++ b/tools/docs/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "module": "commonjs" + "module": "commonjs", + "ignoreDeprecations": "6.0" }, "files": [], "include": [], diff --git a/tools/docs/tsconfig.lib.json b/tools/docs/tsconfig.lib.json index 33eca2c..d1705e6 100644 --- a/tools/docs/tsconfig.lib.json +++ b/tools/docs/tsconfig.lib.json @@ -6,5 +6,5 @@ "types": ["node"] }, "include": ["src/**/*.ts"], - "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] + "exclude": ["jest.config.cts", "src/**/*.spec.ts", "src/**/*.test.ts"] } diff --git a/tools/docs/tsconfig.spec.json b/tools/docs/tsconfig.spec.json index 0d3c604..88d0723 100644 --- a/tools/docs/tsconfig.spec.json +++ b/tools/docs/tsconfig.spec.json @@ -7,7 +7,7 @@ "types": ["jest", "node"] }, "include": [ - "jest.config.ts", + "jest.config.cts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts" diff --git a/tools/tsconfig.tools.json b/tools/tsconfig.tools.json deleted file mode 100644 index 99428e1..0000000 --- a/tools/tsconfig.tools.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "compilerOptions": { - "outDir": "../dist/out-tsc/tools", - "rootDir": ".", - "module": "commonjs", - "target": "es5", - "types": ["node"], - "importHelpers": false - }, - "include": ["**/*.ts"] -} diff --git a/tsconfig.base.json b/tsconfig.base.json index e9037d7..a592d39 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -17,7 +17,12 @@ "paths": { "@toolsplus/nx-forge": ["packages/nx-forge/src/index.ts"], "docs-tools": ["tools/docs/src/index.ts"] - } + }, + "strict": false, + "noUncheckedSideEffectImports": false, + "types": ["*"], + "esModuleInterop": false, + "ignoreDeprecations": "6.0" }, "exclude": ["node_modules", "tmp"] }