feat: add datadog frontend sourcemap uploads

This commit is contained in:
Arthur Belleville 2026-04-22 22:20:13 +02:00
parent 246755d7c4
commit 0b0c380080
No known key found for this signature in database
20 changed files with 1290 additions and 40 deletions

View file

@ -0,0 +1,74 @@
name: Frontend Sourcemaps
on:
workflow_dispatch:
push:
branches:
- main
- develop
jobs:
upload-sourcemaps:
runs-on:
- self-hosted
- linux
- x64
env:
DATADOG_API_KEY: ${{ secrets.DATADOG_API_KEY }}
DATADOG_SITE: ${{ secrets.DATADOG_SITE }}
RELEASE_VERSION: ${{ github.sha }}
steps:
- name: Check out repository
uses: actions/checkout@v6
- name: Set up pnpm
uses: pnpm/action-setup@v5
with:
version: 10.19.0
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm
- name: Validate Datadog secrets
run: |
test -n "$DATADOG_API_KEY"
test -n "$DATADOG_SITE"
- name: Install dependencies
run: pnpm install --frozen-lockfile --child-concurrency=2
- name: Build main
run: pnpm --filter @xtablo/main build:prod
env:
VITE_APP_VERSION: ${{ env.RELEASE_VERSION }}
- name: Upload main sourcemaps
run: pnpm exec datadog-ci sourcemaps upload apps/main/dist --service xtablo-ui --release-version "$RELEASE_VERSION" --minified-path-prefix https://app.xtablo.com/assets
- name: Remove main sourcemaps
run: find apps/main/dist -name '*.map' -delete
- name: Build clients
run: pnpm --filter @xtablo/clients build:prod
env:
VITE_APP_VERSION: ${{ env.RELEASE_VERSION }}
- name: Upload clients sourcemaps
run: pnpm exec datadog-ci sourcemaps upload apps/clients/dist --service xtablo-clients --release-version "$RELEASE_VERSION" --minified-path-prefix https://clients.xtablo.com/assets
- name: Remove clients sourcemaps
run: find apps/clients/dist -name '*.map' -delete
- name: Build external
run: pnpm --filter @xtablo/external build
env:
VITE_APP_VERSION: ${{ env.RELEASE_VERSION }}
- name: Upload external sourcemaps
run: pnpm exec datadog-ci sourcemaps upload apps/external/dist --service xtablo-external --release-version "$RELEASE_VERSION" --minified-path-prefix https://embed.xtablo.com/assets
- name: Remove external sourcemaps
run: find apps/external/dist -name '*.map' -delete

View file

@ -19,19 +19,23 @@ global.ResizeObserver = class ResizeObserver {
}
};
Element.prototype.scrollIntoView = vi.fn();
Element.prototype.scrollTo = vi.fn();
if (typeof Element !== "undefined") {
Element.prototype.scrollIntoView = vi.fn();
Element.prototype.scrollTo = vi.fn();
}
Object.defineProperty(window, "matchMedia", {
writable: true,
value: vi.fn().mockImplementation((query) => ({
matches: false,
media: query,
onchange: null,
addListener: vi.fn(),
removeListener: vi.fn(),
addEventListener: vi.fn(),
removeEventListener: vi.fn(),
dispatchEvent: vi.fn(),
})),
});
if (typeof window !== "undefined") {
Object.defineProperty(window, "matchMedia", {
writable: true,
value: vi.fn().mockImplementation((query) => ({
matches: false,
media: query,
onchange: null,
addListener: vi.fn(),
removeListener: vi.fn(),
addEventListener: vi.fn(),
removeEventListener: vi.fn(),
dispatchEvent: vi.fn(),
})),
});
}

9
apps/clients/src/vite-env.d.ts vendored Normal file
View file

@ -0,0 +1,9 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_APP_VERSION: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}

View file

@ -0,0 +1,13 @@
// @vitest-environment node
import { describe, expect, it } from "vitest";
import configFactory from "../vite.config";
describe("clients vite config", () => {
it("uses hidden sourcemaps for production builds", () => {
const config = configFactory({ mode: "production", command: "build", isSsrBuild: false, isPreview: false });
expect(config.build?.sourcemap).toBe("hidden");
});
});

View file

@ -17,6 +17,9 @@ export default defineConfig(({ mode }) => {
return {
plugins,
build: {
sourcemap: mode === "test" ? false : "hidden",
},
server: { cors: false },
define: process.env.VITEST
? {

View file

@ -27,6 +27,7 @@
"typescript": "^5.7.0",
"vite": "^6.2.2",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.4",
"wrangler": "^4.24.3"
},
"dependencies": {

1
apps/external/src/setupTests.ts vendored Normal file
View file

@ -0,0 +1 @@
// Intentionally minimal test setup so Vitest can honor the configured setupFiles path.

View file

@ -1 +1,9 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_APP_VERSION: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}

13
apps/external/src/viteConfig.test.ts vendored Normal file
View file

@ -0,0 +1,13 @@
// @vitest-environment node
import { describe, expect, it } from "vitest";
import configFactory from "../vite.config";
describe("external vite config", () => {
it("uses hidden sourcemaps for production builds", () => {
const config = configFactory({ mode: "production", command: "build", isSsrBuild: false, isPreview: false });
expect(config.build?.sourcemap).toBe("hidden");
});
});

View file

@ -3,13 +3,9 @@
import { cloudflare } from "@cloudflare/vite-plugin";
import tailwindcss from "@tailwindcss/vite";
import react from "@vitejs/plugin-react";
import { dirname } from "path";
import { fileURLToPath } from "url";
import { defineConfig, PluginOption } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
const __dirname = dirname(fileURLToPath(import.meta.url));
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
const plugins: PluginOption[] = [
@ -26,6 +22,9 @@ export default defineConfig(({ mode }) => {
return {
plugins,
build: {
sourcemap: mode === "test" ? false : "hidden",
},
server: {
cors: false,
},

View file

@ -0,0 +1,35 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
const init = vi.fn();
vi.mock("@datadog/browser-rum", () => ({
datadogRum: {
init,
},
}));
vi.mock("@datadog/browser-rum-react", () => ({
reactPlugin: () => "react-plugin",
}));
describe("rum config", () => {
beforeEach(() => {
init.mockReset();
vi.resetModules();
});
it("sets the Datadog release version from VITE_APP_VERSION", async () => {
vi.stubEnv("VITE_APP_VERSION", "test-sha");
vi.stubEnv("MODE", "production");
await import("./rum");
expect(init).toHaveBeenCalledWith(
expect.objectContaining({
service: "xtablo-ui",
env: "production",
version: "test-sha",
})
);
});
});

View file

@ -13,9 +13,8 @@ datadogRum.init({
site: "datadoghq.com",
service: "xtablo-ui",
env: import.meta.env.MODE,
version: import.meta.env.VITE_APP_VERSION,
// Specify a version number to identify the deployed version of your application in Datadog
// version: '1.0.0',
sessionSampleRate: 100,
sessionReplaySampleRate: 80,
defaultPrivacyLevel: "mask-user-input",

View file

@ -21,20 +21,24 @@ global.ResizeObserver = class ResizeObserver {
}
};
// Mock scrollIntoView for Radix UI components
Element.prototype.scrollIntoView = vi.fn();
Element.prototype.scrollTo = vi.fn();
// Mock scroll APIs for DOM-oriented tests without breaking node-environment suites.
if (typeof Element !== "undefined") {
Element.prototype.scrollIntoView = vi.fn();
Element.prototype.scrollTo = vi.fn();
}
Object.defineProperty(window, "matchMedia", {
writable: true,
value: vi.fn().mockImplementation((query) => ({
matches: false,
media: query,
onchange: null,
addListener: vi.fn(), // deprecated
removeListener: vi.fn(), // deprecated
addEventListener: vi.fn(),
removeEventListener: vi.fn(),
dispatchEvent: vi.fn(),
})),
});
if (typeof window !== "undefined") {
Object.defineProperty(window, "matchMedia", {
writable: true,
value: vi.fn().mockImplementation((query) => ({
matches: false,
media: query,
onchange: null,
addListener: vi.fn(), // deprecated
removeListener: vi.fn(), // deprecated
addEventListener: vi.fn(),
removeEventListener: vi.fn(),
dispatchEvent: vi.fn(),
})),
});
}

View file

@ -1 +1,9 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_APP_VERSION: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}

View file

@ -0,0 +1,13 @@
// @vitest-environment node
import { describe, expect, it } from "vitest";
import configFactory from "../vite.config";
describe("main vite config", () => {
it("uses hidden sourcemaps for production builds", () => {
const config = configFactory({ mode: "production", command: "build", isSsrBuild: false, isPreview: false });
expect(config.build?.sourcemap).toBe("hidden");
});
});

View file

@ -43,6 +43,9 @@ export default defineConfig(({ mode }) => {
return {
plugins,
build: {
sourcemap: mode === "test" ? false : "hidden",
},
server: {
cors: false,
},

View file

@ -0,0 +1,467 @@
# Datadog RUM Sourcemaps Via CI Implementation Plan
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Generate private frontend sourcemaps for Datadog RUM/Error Tracking, upload them from GitHub Actions, and keep `.map` files out of deployed frontend assets.
**Architecture:** Add an explicit release-version contract to the main apps RUM init, enable hidden sourcemaps in all Vite frontends, and create a frontend CI workflow that builds each app, uploads sourcemaps with matching Datadog metadata, and removes `.map` files before any deploy step consumes the build output.
**Tech Stack:** React 19, Vite 6, Vitest, GitHub Actions, Datadog CI CLI, Cloudflare/Wrangler deploy targets, pnpm workspaces.
**Spec:** `docs/superpowers/specs/2026-04-22-datadog-rum-sourcemaps-via-ci-design.md`
---
## File Structure
### New files
- `.github/workflows/frontend-sourcemaps.yml` — GitHub Actions workflow that builds the frontend apps on a self-hosted runner and uploads sourcemaps to Datadog.
- `apps/clients/src/vite-env.d.ts` — Vite env typings for client-specific build variables, including `VITE_APP_VERSION`.
- `apps/main/src/lib/rum.test.ts` — regression test for Datadog RUM init config.
- `apps/main/vite.config.test.ts` — production sourcemap config test for `apps/main`.
- `apps/clients/vite.config.test.ts` — production sourcemap config test for `apps/clients`.
- `apps/external/vite.config.test.ts` — production sourcemap config test for `apps/external`.
### Modified files
- `package.json` — add `@datadog/datadog-ci` to root dev dependencies.
- `apps/main/src/lib/rum.ts` — add `version: import.meta.env.VITE_APP_VERSION`.
- `apps/main/src/vite-env.d.ts` — add `VITE_APP_VERSION` typing.
- `apps/external/src/vite-env.d.ts` — add `VITE_APP_VERSION` typing.
- `apps/main/vite.config.ts` — enable hidden sourcemaps for non-test builds.
- `apps/clients/vite.config.ts` — enable hidden sourcemaps for non-test builds.
- `apps/external/vite.config.ts` — enable hidden sourcemaps for non-test builds.
---
## Chunk 1: Runtime Release Metadata
### Task 1: Wire Datadog RUM version in `apps/main`
**Files:**
- Create: `apps/main/src/lib/rum.test.ts`
- Modify: `apps/main/src/lib/rum.ts`
- Modify: `apps/main/src/vite-env.d.ts`
- [ ] **Step 1: Write the failing RUM init test**
Create `apps/main/src/lib/rum.test.ts`:
```typescript
import { beforeEach, describe, expect, it, vi } from "vitest";
const init = vi.fn();
vi.mock("@datadog/browser-rum", () => ({
datadogRum: {
init,
},
}));
vi.mock("@datadog/browser-rum-react", () => ({
reactPlugin: () => "react-plugin",
}));
describe("rum config", () => {
beforeEach(() => {
init.mockReset();
vi.resetModules();
});
it("sets the Datadog release version from VITE_APP_VERSION", async () => {
vi.stubEnv("VITE_APP_VERSION", "test-sha");
vi.stubEnv("MODE", "production");
await import("./rum");
expect(init).toHaveBeenCalledWith(
expect.objectContaining({
service: "xtablo-ui",
env: "production",
version: "test-sha",
})
);
});
});
```
- [ ] **Step 2: Run the test to verify it fails**
Run:
```bash
pnpm --filter @xtablo/main exec vitest run src/lib/rum.test.ts --mode dev
```
Expected: FAIL because `version` is not set in `datadogRum.init`.
- [ ] **Step 3: Add the runtime version**
Update `apps/main/src/lib/rum.ts`:
```typescript
service: "xtablo-ui",
env: import.meta.env.MODE,
version: import.meta.env.VITE_APP_VERSION,
```
Update `apps/main/src/vite-env.d.ts`:
```typescript
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_APP_VERSION: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}
```
- [ ] **Step 4: Run the test to verify it passes**
Run:
```bash
pnpm --filter @xtablo/main exec vitest run src/lib/rum.test.ts --mode dev
pnpm --filter @xtablo/main typecheck
```
Expected: PASS.
- [ ] **Step 5: Commit**
```bash
git add apps/main/src/lib/rum.ts apps/main/src/lib/rum.test.ts apps/main/src/vite-env.d.ts
git commit -m "feat: add Datadog release version to main rum config"
```
---
## Chunk 2: Hidden Sourcemaps In All Vite Frontends
### Task 2: Add production sourcemap config tests
**Files:**
- Create: `apps/main/vite.config.test.ts`
- Create: `apps/clients/vite.config.test.ts`
- Create: `apps/external/vite.config.test.ts`
- [ ] **Step 1: Write the failing config test for `apps/main`**
Create `apps/main/vite.config.test.ts`:
```typescript
import { describe, expect, it } from "vitest";
import configFactory from "./vite.config";
describe("main vite config", () => {
it("uses hidden sourcemaps for production builds", () => {
const config = configFactory({ mode: "production" });
expect(config.build?.sourcemap).toBe("hidden");
});
});
```
- [ ] **Step 2: Write the failing config test for `apps/clients`**
Create `apps/clients/vite.config.test.ts`:
```typescript
import { describe, expect, it } from "vitest";
import configFactory from "./vite.config";
describe("clients vite config", () => {
it("uses hidden sourcemaps for production builds", () => {
const config = configFactory({ mode: "production" });
expect(config.build?.sourcemap).toBe("hidden");
});
});
```
- [ ] **Step 3: Write the failing config test for `apps/external`**
Create `apps/external/vite.config.test.ts`:
```typescript
import { describe, expect, it } from "vitest";
import configFactory from "./vite.config";
describe("external vite config", () => {
it("uses hidden sourcemaps for production builds", () => {
const config = configFactory({ mode: "production" });
expect(config.build?.sourcemap).toBe("hidden");
});
});
```
- [ ] **Step 4: Run the tests to verify they fail**
Run:
```bash
pnpm --filter @xtablo/main exec vitest run vite.config.test.ts --mode dev
pnpm --filter @xtablo/clients exec vitest run vite.config.test.ts --mode test
pnpm --filter @xtablo/external exec vitest run vite.config.test.ts --mode test
```
Expected: FAIL because `build.sourcemap` is not configured.
- [ ] **Step 5: Implement hidden sourcemaps in all three Vite configs**
Update:
- `apps/main/vite.config.ts`
- `apps/clients/vite.config.ts`
- `apps/external/vite.config.ts`
Add the same build section in each returned config:
```typescript
build: {
sourcemap: mode === "test" ? false : "hidden",
},
```
Keep it alongside the existing `plugins`, `server`, `define`, and `test` sections.
- [ ] **Step 6: Add env typing for the remaining apps**
Create `apps/clients/src/vite-env.d.ts`:
```typescript
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_APP_VERSION: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}
```
Update `apps/external/src/vite-env.d.ts`:
```typescript
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_APP_VERSION: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}
```
- [ ] **Step 7: Run the tests and typechecks**
Run:
```bash
pnpm --filter @xtablo/main exec vitest run vite.config.test.ts --mode dev
pnpm --filter @xtablo/clients exec vitest run vite.config.test.ts --mode test
pnpm --filter @xtablo/external exec vitest run vite.config.test.ts --mode test
pnpm --filter @xtablo/main typecheck
pnpm --filter @xtablo/clients typecheck
pnpm --filter @xtablo/external typecheck
```
Expected: PASS.
- [ ] **Step 8: Commit**
```bash
git add apps/main/vite.config.ts apps/main/vite.config.test.ts apps/clients/vite.config.ts apps/clients/vite.config.test.ts apps/clients/src/vite-env.d.ts apps/external/vite.config.ts apps/external/vite.config.test.ts apps/external/src/vite-env.d.ts
git commit -m "build: enable hidden sourcemaps for frontend apps"
```
---
## Chunk 3: Datadog CI Upload Workflow
### Task 3: Add pinned Datadog CLI and frontend sourcemap workflow
**Files:**
- Create: `.github/workflows/frontend-sourcemaps.yml`
- Modify: `package.json`
- [ ] **Step 1: Add the Datadog CLI dependency**
Update root `package.json`:
```json
"devDependencies": {
"@biomejs/biome": "2.2.5",
"@datadog/datadog-ci": "^3.21.0",
"turbo": "^2.5.8",
"typescript": "^5.7.0"
}
```
- [ ] **Step 2: Install dependencies and verify lockfile changes**
Run:
```bash
pnpm install
```
Expected: `pnpm-lock.yaml` updates with `@datadog/datadog-ci`.
- [ ] **Step 3: Create the workflow**
Create `.github/workflows/frontend-sourcemaps.yml`:
```yaml
name: Frontend Sourcemaps
on:
workflow_dispatch:
push:
branches:
- main
- develop
jobs:
upload-sourcemaps:
runs-on:
- self-hosted
- linux
- x64
env:
DATADOG_API_KEY: ${{ secrets.DATADOG_API_KEY }}
DATADOG_SITE: ${{ secrets.DATADOG_SITE }}
RELEASE_VERSION: ${{ github.sha }}
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v5
with:
version: 10.19.0
- uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile --child-concurrency=2
- name: Build main
run: pnpm --filter @xtablo/main build:prod
env:
VITE_APP_VERSION: ${{ env.RELEASE_VERSION }}
- name: Upload main sourcemaps
run: pnpm exec datadog-ci sourcemaps upload apps/main/dist --service xtablo-ui --release-version "$RELEASE_VERSION" --minified-path-prefix https://app.xtablo.com/assets
- name: Remove main sourcemaps
run: find apps/main/dist -name '*.map' -delete
- name: Build clients
run: pnpm --filter @xtablo/clients build:prod
env:
VITE_APP_VERSION: ${{ env.RELEASE_VERSION }}
- name: Upload clients sourcemaps
run: pnpm exec datadog-ci sourcemaps upload apps/clients/dist --service xtablo-clients --release-version "$RELEASE_VERSION" --minified-path-prefix https://clients.xtablo.com/assets
- name: Remove clients sourcemaps
run: find apps/clients/dist -name '*.map' -delete
- name: Build external
run: pnpm --filter @xtablo/external build
env:
VITE_APP_VERSION: ${{ env.RELEASE_VERSION }}
- name: Upload external sourcemaps
run: pnpm exec datadog-ci sourcemaps upload apps/external/dist --service xtablo-external --release-version "$RELEASE_VERSION" --minified-path-prefix https://embed.xtablo.com/assets
- name: Remove external sourcemaps
run: find apps/external/dist -name '*.map' -delete
```
- [ ] **Step 4: Validate the workflow file structure**
Run:
```bash
rg -n "datadog-ci sourcemaps upload|RELEASE_VERSION|find .*\\.map" .github/workflows/frontend-sourcemaps.yml
```
Expected: one upload and one cleanup step for each frontend app.
- [ ] **Step 5: Commit**
```bash
git add package.json pnpm-lock.yaml .github/workflows/frontend-sourcemaps.yml
git commit -m "ci: upload frontend sourcemaps to Datadog"
```
---
## Chunk 4: End-To-End Verification
### Task 4: Prove builds emit hidden sourcemaps and cleanup works
**Files:**
- No new source files
- [ ] **Step 1: Build each frontend locally with a release version**
Run:
```bash
VITE_APP_VERSION=test-sha pnpm --filter @xtablo/main build:prod
VITE_APP_VERSION=test-sha pnpm --filter @xtablo/clients build:prod
VITE_APP_VERSION=test-sha pnpm --filter @xtablo/external build
```
Expected: each `dist/` contains built assets and `.map` files, but the generated JS bundles do not include public `sourceMappingURL` comments.
- [ ] **Step 2: Verify `.map` files exist before cleanup**
Run:
```bash
find apps/main/dist apps/clients/dist apps/external/dist -name '*.map' | sort
```
Expected: at least one sourcemap per app.
- [ ] **Step 3: Simulate CI cleanup locally**
Run:
```bash
find apps/main/dist apps/clients/dist apps/external/dist -name '*.map' -delete
find apps/main/dist apps/clients/dist apps/external/dist -name '*.map' | sort
```
Expected: no output from the second command.
- [ ] **Step 4: Run the targeted regression suite**
Run:
```bash
pnpm --filter @xtablo/main exec vitest run src/lib/rum.test.ts vite.config.test.ts --mode dev
pnpm --filter @xtablo/clients exec vitest run vite.config.test.ts --mode test
pnpm --filter @xtablo/external exec vitest run vite.config.test.ts --mode test
pnpm --filter @xtablo/main typecheck
pnpm --filter @xtablo/clients typecheck
pnpm --filter @xtablo/external typecheck
```
Expected: PASS.
- [ ] **Step 5: Commit**
```bash
git status --short
```
Expected: clean worktree before opening the implementation PR.

View file

@ -0,0 +1,99 @@
# Datadog RUM Sourcemaps Via CI Design
**Goal:** Deobfuscate frontend RUM and Error Tracking stack traces in Datadog for the Xtablo frontends by generating sourcemaps during build, uploading them in CI, and keeping `.map` files off the public CDN.
## Current State
- `apps/main` initializes Datadog RUM in [apps/main/src/lib/rum.ts](/Users/arthur.belleville/Documents/perso/projects/xtablo-source/apps/main/src/lib/rum.ts) with `service: "xtablo-ui"` and `env: import.meta.env.MODE`, but no explicit release version.
- `apps/main`, `apps/clients`, and `apps/external` are Vite frontends with production Cloudflare deployments.
- None of the three Vite configs currently emit production sourcemaps.
- On this branch there is no tracked GitHub Actions workflow yet, so CI wiring must be introduced as part of the implementation.
## Decision
Use Datadogs recommended CI upload flow:
1. Build each frontend with Vite `build.sourcemap: "hidden"`.
2. Upload generated sourcemaps from CI with `datadog-ci sourcemaps upload`.
3. Use a release version derived from the CI commit SHA.
4. Remove all `.map` files from `dist/` before deploy packaging so they are never publicly served.
This keeps sourcemaps private while still enabling unminified stack traces in Datadog.
Sources:
- Datadog CI sourcemap upload guide: https://docs.datadoghq.com/real_user_monitoring/guide/upload-javascript-source-maps/?tab=vite
- Vite `build.sourcemap` docs: https://vite.dev/config/build-options.html
## Runtime Contract
Datadog matches sourcemaps against browser events by `service` and `version`.
- `apps/main` must emit `version: import.meta.env.VITE_APP_VERSION` in its RUM initialization.
- CI must upload sourcemaps for `apps/main` using:
- `service=xtablo-ui`
- `release-version=$GITHUB_SHA`
- `apps/clients` and `apps/external` should use the same CI release version convention now, even though they do not currently emit RUM events. This keeps the deployment contract consistent and avoids another pipeline change when browser monitoring is enabled there.
## Public Asset Prefixes
The Datadog upload command must use the real production asset prefixes:
- `apps/main`: `https://app.xtablo.com/assets`
- `apps/clients`: `https://clients.xtablo.com/assets`
- `apps/external`: `https://embed.xtablo.com/assets`
These prefixes must match the actual URLs used by the deployed JS bundles.
## Implementation Shape
### Frontend code
- `apps/main/src/lib/rum.ts`
- add `version: import.meta.env.VITE_APP_VERSION`
- `apps/main/src/vite-env.d.ts`
- declare `VITE_APP_VERSION`
- `apps/clients/src/vite-env.d.ts`
- create and declare `VITE_APP_VERSION`
- `apps/external/src/vite-env.d.ts`
- declare `VITE_APP_VERSION`
### Build config
- `apps/main/vite.config.ts`
- `apps/clients/vite.config.ts`
- `apps/external/vite.config.ts`
Each should emit hidden sourcemaps for non-test builds.
### CI
- Add GitHub Actions workflow for frontend builds on self-hosted runners.
- Add `@datadog/datadog-ci` as a root dev dependency so the workflow can run a pinned CLI version from the repo.
- After each frontend build:
- upload sourcemaps to Datadog
- delete `dist/**/*.map`
## Secrets And CI Inputs
The workflow needs:
- `DATADOG_API_KEY`
- `DATADOG_SITE`
- release version from `github.sha`
The workflow should fail fast if Datadog secrets are missing on the deployment path where sourcemap upload is required.
## Verification
- Unit test for `apps/main` RUM init to assert `version` is wired from env.
- Vite config tests or config assertions for all three apps to verify production builds use `sourcemap: "hidden"`.
- CI workflow smoke verification:
- build the apps
- run sourcemap upload
- confirm `.map` files are removed from `dist`
## Non-Goals
- Enabling Datadog RUM in `apps/clients` or `apps/external` right now.
- Serving sourcemaps publicly.
- Changing app deployment hosts or CDN paths.

View file

@ -33,6 +33,7 @@
},
"devDependencies": {
"@biomejs/biome": "2.2.5",
"@datadog/datadog-ci": "^4.3.0",
"turbo": "^2.5.8",
"typescript": "^5.7.0"
},

View file

@ -17,6 +17,9 @@ importers:
'@biomejs/biome':
specifier: 2.2.5
version: 2.2.5
'@datadog/datadog-ci':
specifier: ^4.3.0
version: 4.4.0(@types/node@22.18.12)
turbo:
specifier: ^2.5.8
version: 2.5.8
@ -89,7 +92,7 @@ importers:
version: 2.2.5
'@datadog/datadog-ci-base':
specifier: ^4.0.2
version: 4.1.2(@datadog/datadog-ci-plugin-cloud-run@4.1.2)(@types/node@20.19.23)
version: 4.1.2(@datadog/datadog-ci-plugin-cloud-run@4.1.2)(@datadog/datadog-ci-plugin-deployment@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-dora@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-gate@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-sarif@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-sbom@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-synthetics@4.4.0(@datadog/datadog-ci-base@4.4.0))(@types/node@20.19.23)
'@datadog/datadog-ci-plugin-cloud-run':
specifier: ^4.0.2
version: 4.1.2(@datadog/datadog-ci-base@4.1.2)(@types/node@20.19.23)
@ -321,6 +324,9 @@ importers:
vite-tsconfig-paths:
specifier: ^5.1.4
version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.1)(tsx@4.20.6))
vitest:
specifier: ^3.2.4
version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@20.0.3)(lightningcss@1.30.2)(terser@5.46.1)(tsx@4.20.6)
wrangler:
specifier: ^4.24.3
version: 4.44.0(@cloudflare/workers-types@4.20260411.1)
@ -1987,11 +1993,84 @@ packages:
'@datadog/datadog-ci-plugin-synthetics':
optional: true
'@datadog/datadog-ci-base@4.4.0':
resolution: {integrity: sha512-sFssfj3EQKBiD9SkVYzhkzHZEQqmnsMGXKYKoLLTFcTmRbaePItx/1Sa3KzFVIWBhZQSpYoJt3VZ7+cagCShLA==}
peerDependencies:
'@datadog/datadog-ci-plugin-aas': 4.4.0
'@datadog/datadog-ci-plugin-cloud-run': 4.4.0
'@datadog/datadog-ci-plugin-container-app': 4.4.0
'@datadog/datadog-ci-plugin-deployment': 4.4.0
'@datadog/datadog-ci-plugin-dora': 4.4.0
'@datadog/datadog-ci-plugin-gate': 4.4.0
'@datadog/datadog-ci-plugin-lambda': 4.4.0
'@datadog/datadog-ci-plugin-sarif': 4.4.0
'@datadog/datadog-ci-plugin-sbom': 4.4.0
'@datadog/datadog-ci-plugin-stepfunctions': 4.4.0
'@datadog/datadog-ci-plugin-synthetics': 4.4.0
peerDependenciesMeta:
'@datadog/datadog-ci-plugin-aas':
optional: true
'@datadog/datadog-ci-plugin-cloud-run':
optional: true
'@datadog/datadog-ci-plugin-container-app':
optional: true
'@datadog/datadog-ci-plugin-deployment':
optional: true
'@datadog/datadog-ci-plugin-dora':
optional: true
'@datadog/datadog-ci-plugin-gate':
optional: true
'@datadog/datadog-ci-plugin-lambda':
optional: true
'@datadog/datadog-ci-plugin-sarif':
optional: true
'@datadog/datadog-ci-plugin-sbom':
optional: true
'@datadog/datadog-ci-plugin-stepfunctions':
optional: true
'@datadog/datadog-ci-plugin-synthetics':
optional: true
'@datadog/datadog-ci-plugin-cloud-run@4.1.2':
resolution: {integrity: sha512-HKVZ7SSjzskdVqIrf16bqmgeRrxscoRkgh9ILfni3D/GoXpG3DFaZPs7pXJR6igjBeZMclLjtolqMyyWy7DCLQ==}
peerDependencies:
'@datadog/datadog-ci-base': 4.1.2
'@datadog/datadog-ci-plugin-deployment@4.4.0':
resolution: {integrity: sha512-u9FtFw2TKRF74wwcuM8tWseWTrLKZZ/Lwq1Fz+LtAGHTJ5675WuIhGNnSxbrKU4f2VsaFp+eUIsetcqbuUerXw==}
peerDependencies:
'@datadog/datadog-ci-base': 4.4.0
'@datadog/datadog-ci-plugin-dora@4.4.0':
resolution: {integrity: sha512-DuyKfiwxZoNu5dlMPZNq6DYlafR/3kpaqS0q9KfGStnu1LwS5YTREuZgssNkyYWnF6qZN80x1l7E/ubaAFVYOg==}
peerDependencies:
'@datadog/datadog-ci-base': 4.4.0
'@datadog/datadog-ci-plugin-gate@4.4.0':
resolution: {integrity: sha512-bR5AY5p5/5jQuZtcuEPJrEpL1WhJiXhfPwuc9OhGN0ny4/98S3Hg02aQ9aoloFipsBgEN3W5XhrWH6Pn1jSI5w==}
peerDependencies:
'@datadog/datadog-ci-base': 4.4.0
'@datadog/datadog-ci-plugin-sarif@4.4.0':
resolution: {integrity: sha512-kgExnC/ReiGKr9R6SxaXr62lp2fYJQ4i8c9x4/GqDpNbLENQdsqBmxs6h1/N3xkdt3/p3RZlMcAhIytLYDkBAA==}
peerDependencies:
'@datadog/datadog-ci-base': 4.4.0
'@datadog/datadog-ci-plugin-sbom@4.4.0':
resolution: {integrity: sha512-bBsgIBBT0KsWqLcIMuf692PGjMNjG6OKNUjuPZOWbuToyKKnpRRkMDrX9KvUWVXuMKfDEp7i2PYw/2fQm5DXHg==}
peerDependencies:
'@datadog/datadog-ci-base': 4.4.0
'@datadog/datadog-ci-plugin-synthetics@4.4.0':
resolution: {integrity: sha512-SpGdOZUSjEVZZD/hopPKuXnOP6ZRl0nnZ8i5ffVIxohlMwn5y0vMWjjkDohk24M+2QBDUnMe4sNXW4YP1aeSWg==}
peerDependencies:
'@datadog/datadog-ci-base': 4.4.0
'@datadog/datadog-ci@4.4.0':
resolution: {integrity: sha512-vpQPcz+FRgDhPoHg9aXtTeaVe6Dhky6q1vG9TmOWDX39Pjf/Wz1LEY94uWvK6miC8orHf6RtIGOSxsycRNde7g==}
engines: {node: '>=18'}
hasBin: true
'@datadog/flagging-core@0.1.0-preview.13':
resolution: {integrity: sha512-DfQYeBgGvCerKx6coRiXMt0aXWJB8kRIsJhfdTKyejS9rfp6ZBjWc6dctKzhwMAQdpBiN42MEVXNt4Pdcmj1WA==}
peerDependencies:
@ -5042,6 +5121,9 @@ packages:
'@types/use-sync-external-store@0.0.6':
resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==}
'@types/uuid@9.0.8':
resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
'@types/whatwg-mimetype@3.0.2':
resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
@ -5341,6 +5423,14 @@ packages:
resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
engines: {node: '>= 14'}
ajv-formats@2.1.1:
resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
peerDependencies:
ajv: ^8.0.0
peerDependenciesMeta:
ajv:
optional: true
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
@ -5434,6 +5524,13 @@ packages:
resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==}
engines: {node: '>=8'}
asn1@0.2.6:
resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
assert-plus@1.0.0:
resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
engines: {node: '>=0.8'}
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
@ -5539,6 +5636,9 @@ packages:
resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
engines: {node: '>=10.0.0'}
bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
bignumber.js@9.3.1:
resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==}
@ -5583,6 +5683,10 @@ packages:
buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
buildcheck@0.0.7:
resolution: {integrity: sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==}
engines: {node: '>=10.0.0'}
busboy@1.6.0:
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
engines: {node: '>=10.16.0'}
@ -5780,6 +5884,10 @@ packages:
resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
engines: {node: '>= 0.10'}
cpu-features@0.0.10:
resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==}
engines: {node: '>=10.0.0'}
create-jest@29.7.0:
resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@ -5821,6 +5929,10 @@ packages:
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
dashdash@1.14.1:
resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
engines: {node: '>=0.10'}
data-uri-to-buffer@4.0.1:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
engines: {node: '>= 12'}
@ -6017,6 +6129,9 @@ packages:
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
ecc-jsbn@0.1.2:
resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
ecdsa-sig-formatter@1.0.11:
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
@ -6250,6 +6365,9 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
fast-levenshtein@3.0.0:
resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==}
fast-png@6.4.0:
resolution: {integrity: sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==}
@ -6264,6 +6382,10 @@ packages:
resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==}
hasBin: true
fastest-levenshtein@1.0.16:
resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
engines: {node: '>= 4.9.1'}
fastq@1.19.1:
resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
@ -6429,6 +6551,12 @@ packages:
resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==}
engines: {node: '>= 14'}
get-value@4.0.1:
resolution: {integrity: sha512-QTDzwunK3V+VlJJlL0BlCzebAaE8OSlUC+UVd80PiekTw1gpzQSb3cfEQB2LYFWr1lbWfbdqL4pjAoJDPCLxhQ==}
getpass@0.1.7:
resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
@ -6445,6 +6573,11 @@ packages:
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
hasBin: true
glob@10.5.0:
resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
hasBin: true
glob@11.0.3:
resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==}
engines: {node: 20 || >=22}
@ -6847,9 +6980,17 @@ packages:
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
is-plain-object@2.0.4:
resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
engines: {node: '>=0.10.0'}
is-potential-custom-element-name@1.0.1:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
is-primitive@3.0.1:
resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==}
engines: {node: '>=0.10.0'}
is-regex@1.2.1:
resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
engines: {node: '>= 0.4'}
@ -6911,6 +7052,10 @@ packages:
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
isobject@3.0.1:
resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
engines: {node: '>=0.10.0'}
isomorphic.js@0.2.5:
resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==}
@ -7117,6 +7262,13 @@ packages:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
js-yaml@4.1.1:
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true
jsbn@0.1.1:
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
jsdom@20.0.3:
resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==}
engines: {node: '>=14'}
@ -7616,6 +7768,9 @@ packages:
mutexify@1.4.0:
resolution: {integrity: sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg==}
nan@2.26.2:
resolution: {integrity: sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==}
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@ -7797,6 +7952,9 @@ packages:
package-manager-detector@1.5.0:
resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==}
packageurl-js@2.0.1:
resolution: {integrity: sha512-N5ixXjzTy4QDQH0Q9YFjqIWd6zH6936Djpl2m9QNFmDv5Fum8q8BjkpAcHNMzOFE0IwQrFhJWex3AN6kS0OSwg==}
pako@1.0.11:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
@ -8570,6 +8728,10 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
sax@1.6.0:
resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==}
engines: {node: '>=11.0.0'}
saxes@6.0.0:
resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
engines: {node: '>=v12.22.7'}
@ -8607,6 +8769,10 @@ packages:
resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
engines: {node: '>= 0.4'}
set-value@4.1.0:
resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==}
engines: {node: '>=11.0'}
setimmediate@1.0.5:
resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
@ -8745,6 +8911,15 @@ packages:
resolution: {integrity: sha512-UXhXR2869FQaD+GMly8jAMCRZ94nU5KcrFetZfWEMd+LVVG6y0ExgHAhatEcKZ/wk8YcKPdi+hiD2wm75lq3/Q==}
engines: {node: '>=4.0.0'}
ssh2@1.17.0:
resolution: {integrity: sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==}
engines: {node: '>=10.16.0'}
sshpk@1.16.1:
resolution: {integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==}
engines: {node: '>=0.10.0'}
hasBin: true
stack-utils@2.0.6:
resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
engines: {node: '>=10'}
@ -9117,6 +9292,9 @@ packages:
tw-animate-css@1.4.0:
resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==}
tweetnacl@0.14.5:
resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
typanion@3.14.0:
resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==}
@ -9660,6 +9838,18 @@ packages:
resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
ws@7.5.10:
resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
engines: {node: '>=8.3.0'}
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ^5.0.2
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
ws@8.18.0:
resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
engines: {node: '>=10.0.0'}
@ -9688,6 +9878,14 @@ packages:
resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
engines: {node: '>=12'}
xml2js@0.5.0:
resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==}
engines: {node: '>=4.0.0'}
xmlbuilder@11.0.1:
resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==}
engines: {node: '>=4.0'}
xmlchars@2.2.0:
resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
@ -9718,6 +9916,9 @@ packages:
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
yamux-js@0.1.2:
resolution: {integrity: sha512-bhsPlPZ9xB4Dawyf6nkS58u4F3IvGCaybkEKGnneUeepcI7MPoG3Tt6SaKCU5x/kP2/2w20Qm/GqbpwAM16vYw==}
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
@ -11326,7 +11527,7 @@ snapshots:
'@datadog/browser-core': 6.22.0
'@datadog/browser-rum-core': 6.22.0
'@datadog/datadog-ci-base@4.1.2(@datadog/datadog-ci-plugin-cloud-run@4.1.2)(@types/node@20.19.23)':
'@datadog/datadog-ci-base@4.1.2(@datadog/datadog-ci-plugin-cloud-run@4.1.2)(@datadog/datadog-ci-plugin-deployment@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-dora@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-gate@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-sarif@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-sbom@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-synthetics@4.4.0(@datadog/datadog-ci-base@4.4.0))(@types/node@20.19.23)':
dependencies:
'@antfu/install-pkg': 1.1.0
'@types/datadog-metrics': 0.6.1
@ -11351,13 +11552,54 @@ snapshots:
upath: 2.0.1
optionalDependencies:
'@datadog/datadog-ci-plugin-cloud-run': 4.1.2(@datadog/datadog-ci-base@4.1.2)(@types/node@20.19.23)
'@datadog/datadog-ci-plugin-deployment': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-dora': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-gate': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-sarif': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-sbom': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-synthetics': 4.4.0(@datadog/datadog-ci-base@4.4.0)
transitivePeerDependencies:
- '@types/node'
- supports-color
'@datadog/datadog-ci-base@4.4.0(@datadog/datadog-ci-plugin-deployment@4.4.0)(@datadog/datadog-ci-plugin-dora@4.4.0)(@datadog/datadog-ci-plugin-gate@4.4.0)(@datadog/datadog-ci-plugin-sarif@4.4.0)(@datadog/datadog-ci-plugin-sbom@4.4.0)(@datadog/datadog-ci-plugin-synthetics@4.4.0)(@types/node@22.18.12)':
dependencies:
'@antfu/install-pkg': 1.1.0
'@types/datadog-metrics': 0.6.1
async-retry: 1.3.1
axios: 1.12.2(debug@4.4.3)
chalk: 3.0.0
clipanion: 3.2.1(typanion@3.14.0)
datadog-metrics: 0.9.3
debug: 4.4.3
deep-extend: 0.6.0
fast-xml-parser: 4.5.3
form-data: 4.0.4
glob: 10.5.0
inquirer: 8.2.7(@types/node@22.18.12)
jest-diff: 30.2.0
jszip: 3.10.1
proxy-agent: 6.5.0
semver: 7.7.3
simple-git: 3.16.0
terminal-link: 2.1.1
tiny-async-pool: 2.1.0
typanion: 3.14.0
upath: 2.0.1
optionalDependencies:
'@datadog/datadog-ci-plugin-deployment': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-dora': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-gate': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-sarif': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-sbom': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-synthetics': 4.4.0(@datadog/datadog-ci-base@4.4.0)
transitivePeerDependencies:
- '@types/node'
- supports-color
'@datadog/datadog-ci-plugin-cloud-run@4.1.2(@datadog/datadog-ci-base@4.1.2)(@types/node@20.19.23)':
dependencies:
'@datadog/datadog-ci-base': 4.1.2(@datadog/datadog-ci-plugin-cloud-run@4.1.2)(@types/node@20.19.23)
'@datadog/datadog-ci-base': 4.1.2(@datadog/datadog-ci-plugin-cloud-run@4.1.2)(@datadog/datadog-ci-plugin-deployment@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-dora@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-gate@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-sarif@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-sbom@4.4.0(@datadog/datadog-ci-base@4.4.0))(@datadog/datadog-ci-plugin-synthetics@4.4.0(@datadog/datadog-ci-base@4.4.0))(@types/node@20.19.23)
'@google-cloud/logging': 11.2.1
'@google-cloud/run': 3.0.1
chalk: 3.0.0
@ -11372,6 +11614,119 @@ snapshots:
- encoding
- supports-color
'@datadog/datadog-ci-plugin-deployment@4.4.0(@datadog/datadog-ci-base@4.4.0)':
dependencies:
'@datadog/datadog-ci-base': 4.4.0(@datadog/datadog-ci-plugin-deployment@4.4.0)(@datadog/datadog-ci-plugin-dora@4.4.0)(@datadog/datadog-ci-plugin-gate@4.4.0)(@datadog/datadog-ci-plugin-sarif@4.4.0)(@datadog/datadog-ci-plugin-sbom@4.4.0)(@datadog/datadog-ci-plugin-synthetics@4.4.0)(@types/node@22.18.12)
axios: 1.12.2(debug@4.4.3)
chalk: 3.0.0
simple-git: 3.16.0
transitivePeerDependencies:
- debug
- supports-color
'@datadog/datadog-ci-plugin-dora@4.4.0(@datadog/datadog-ci-base@4.4.0)':
dependencies:
'@datadog/datadog-ci-base': 4.4.0(@datadog/datadog-ci-plugin-deployment@4.4.0)(@datadog/datadog-ci-plugin-dora@4.4.0)(@datadog/datadog-ci-plugin-gate@4.4.0)(@datadog/datadog-ci-plugin-sarif@4.4.0)(@datadog/datadog-ci-plugin-sbom@4.4.0)(@datadog/datadog-ci-plugin-synthetics@4.4.0)(@types/node@22.18.12)
axios: 1.12.2(debug@4.4.3)
chalk: 3.0.0
simple-git: 3.16.0
transitivePeerDependencies:
- debug
- supports-color
'@datadog/datadog-ci-plugin-gate@4.4.0(@datadog/datadog-ci-base@4.4.0)':
dependencies:
'@datadog/datadog-ci-base': 4.4.0(@datadog/datadog-ci-plugin-deployment@4.4.0)(@datadog/datadog-ci-plugin-dora@4.4.0)(@datadog/datadog-ci-plugin-gate@4.4.0)(@datadog/datadog-ci-plugin-sarif@4.4.0)(@datadog/datadog-ci-plugin-sbom@4.4.0)(@datadog/datadog-ci-plugin-synthetics@4.4.0)(@types/node@22.18.12)
'@types/uuid': 9.0.8
axios: 1.12.2(debug@4.4.3)
chalk: 3.0.0
uuid: 9.0.1
transitivePeerDependencies:
- debug
'@datadog/datadog-ci-plugin-sarif@4.4.0(@datadog/datadog-ci-base@4.4.0)':
dependencies:
'@datadog/datadog-ci-base': 4.4.0(@datadog/datadog-ci-plugin-deployment@4.4.0)(@datadog/datadog-ci-plugin-dora@4.4.0)(@datadog/datadog-ci-plugin-gate@4.4.0)(@datadog/datadog-ci-plugin-sarif@4.4.0)(@datadog/datadog-ci-plugin-sbom@4.4.0)(@datadog/datadog-ci-plugin-synthetics@4.4.0)(@types/node@22.18.12)
ajv: 8.18.0
ajv-formats: 2.1.1(ajv@8.18.0)
axios: 1.12.2(debug@4.4.3)
chalk: 3.0.0
form-data: 4.0.4
simple-git: 3.16.0
upath: 2.0.1
uuid: 9.0.1
transitivePeerDependencies:
- debug
- supports-color
'@datadog/datadog-ci-plugin-sbom@4.4.0(@datadog/datadog-ci-base@4.4.0)':
dependencies:
'@datadog/datadog-ci-base': 4.4.0(@datadog/datadog-ci-plugin-deployment@4.4.0)(@datadog/datadog-ci-plugin-dora@4.4.0)(@datadog/datadog-ci-plugin-gate@4.4.0)(@datadog/datadog-ci-plugin-sarif@4.4.0)(@datadog/datadog-ci-plugin-sbom@4.4.0)(@datadog/datadog-ci-plugin-synthetics@4.4.0)(@types/node@22.18.12)
ajv: 8.18.0
ajv-formats: 2.1.1(ajv@8.18.0)
axios: 1.12.2(debug@4.4.3)
chalk: 3.0.0
packageurl-js: 2.0.1
simple-git: 3.16.0
upath: 2.0.1
transitivePeerDependencies:
- debug
- supports-color
'@datadog/datadog-ci-plugin-synthetics@4.4.0(@datadog/datadog-ci-base@4.4.0)':
dependencies:
'@datadog/datadog-ci-base': 4.4.0(@datadog/datadog-ci-plugin-deployment@4.4.0)(@datadog/datadog-ci-plugin-dora@4.4.0)(@datadog/datadog-ci-plugin-gate@4.4.0)(@datadog/datadog-ci-plugin-sarif@4.4.0)(@datadog/datadog-ci-plugin-sbom@4.4.0)(@datadog/datadog-ci-plugin-synthetics@4.4.0)(@types/node@22.18.12)
axios: 1.12.2(debug@4.4.3)
chalk: 3.0.0
debug: 4.4.3
deep-extend: 0.6.0
fast-levenshtein: 3.0.0
get-value: 4.0.1
ora: 5.4.1
set-value: 4.1.0
ssh2: 1.17.0
sshpk: 1.16.1
upath: 2.0.1
ws: 7.5.10
xml2js: 0.5.0
yamux-js: 0.1.2
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
'@datadog/datadog-ci@4.4.0(@types/node@22.18.12)':
dependencies:
'@datadog/datadog-ci-base': 4.4.0(@datadog/datadog-ci-plugin-deployment@4.4.0)(@datadog/datadog-ci-plugin-dora@4.4.0)(@datadog/datadog-ci-plugin-gate@4.4.0)(@datadog/datadog-ci-plugin-sarif@4.4.0)(@datadog/datadog-ci-plugin-sbom@4.4.0)(@datadog/datadog-ci-plugin-synthetics@4.4.0)(@types/node@22.18.12)
'@datadog/datadog-ci-plugin-deployment': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-dora': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-gate': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-sarif': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-sbom': 4.4.0(@datadog/datadog-ci-base@4.4.0)
'@datadog/datadog-ci-plugin-synthetics': 4.4.0(@datadog/datadog-ci-base@4.4.0)
axios: 1.12.2(debug@4.4.3)
chalk: 3.0.0
clipanion: 3.2.1(typanion@3.14.0)
fast-xml-parser: 4.5.3
form-data: 4.0.4
js-yaml: 4.1.1
semver: 7.7.3
simple-git: 3.16.0
typanion: 3.14.0
upath: 2.0.1
uuid: 9.0.1
transitivePeerDependencies:
- '@datadog/datadog-ci-plugin-aas'
- '@datadog/datadog-ci-plugin-cloud-run'
- '@datadog/datadog-ci-plugin-container-app'
- '@datadog/datadog-ci-plugin-lambda'
- '@datadog/datadog-ci-plugin-stepfunctions'
- '@types/node'
- bufferutil
- debug
- supports-color
- utf-8-validate
'@datadog/flagging-core@0.1.0-preview.13(@openfeature/core@1.9.1)':
dependencies:
'@openfeature/core': 1.9.1
@ -11955,6 +12310,13 @@ snapshots:
optionalDependencies:
'@types/node': 20.19.23
'@inquirer/external-editor@1.0.2(@types/node@22.18.12)':
dependencies:
chardet: 2.1.1
iconv-lite: 0.7.0
optionalDependencies:
'@types/node': 22.18.12
'@internationalized/date@3.10.0':
dependencies:
'@swc/helpers': 0.5.17
@ -14928,6 +15290,8 @@ snapshots:
'@types/use-sync-external-store@0.0.6': {}
'@types/uuid@9.0.8': {}
'@types/whatwg-mimetype@3.0.2': {}
'@types/ws@8.18.1':
@ -15301,6 +15665,10 @@ snapshots:
agent-base@7.1.4: {}
ajv-formats@2.1.1(ajv@8.18.0):
optionalDependencies:
ajv: 8.18.0
ajv@6.12.6:
dependencies:
fast-deep-equal: 3.1.3
@ -15417,6 +15785,12 @@ snapshots:
arrify@2.0.1: {}
asn1@0.2.6:
dependencies:
safer-buffer: 2.1.2
assert-plus@1.0.0: {}
assertion-error@2.0.1: {}
ast-types@0.13.4:
@ -15549,6 +15923,10 @@ snapshots:
basic-ftp@5.0.5: {}
bcrypt-pbkdf@1.0.2:
dependencies:
tweetnacl: 0.14.5
bignumber.js@9.3.1: {}
bl@4.1.0:
@ -15603,6 +15981,9 @@ snapshots:
base64-js: 1.5.1
ieee754: 1.2.1
buildcheck@0.0.7:
optional: true
busboy@1.6.0:
dependencies:
streamsearch: 1.1.0
@ -15773,6 +16154,12 @@ snapshots:
object-assign: 4.1.1
vary: 1.1.2
cpu-features@0.0.10:
dependencies:
buildcheck: 0.0.7
nan: 2.26.2
optional: true
create-jest@29.7.0(@types/node@22.18.12)(ts-node@10.9.2(@types/node@22.18.12)(typescript@5.9.3)):
dependencies:
'@jest/types': 29.6.3
@ -15819,6 +16206,10 @@ snapshots:
csstype@3.1.3: {}
dashdash@1.14.1:
dependencies:
assert-plus: 1.0.0
data-uri-to-buffer@4.0.1: {}
data-uri-to-buffer@6.0.2: {}
@ -16027,6 +16418,11 @@ snapshots:
eastasianwidth@0.2.0: {}
ecc-jsbn@0.1.2:
dependencies:
jsbn: 0.1.1
safer-buffer: 2.1.2
ecdsa-sig-formatter@1.0.11:
dependencies:
safe-buffer: 5.2.1
@ -16398,6 +16794,10 @@ snapshots:
fast-levenshtein@2.0.6: {}
fast-levenshtein@3.0.0:
dependencies:
fastest-levenshtein: 1.0.16
fast-png@6.4.0:
dependencies:
'@types/pako': 2.0.4
@ -16414,6 +16814,8 @@ snapshots:
dependencies:
strnum: 2.1.1
fastest-levenshtein@1.0.16: {}
fastq@1.19.1:
dependencies:
reusify: 1.1.0
@ -16605,6 +17007,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
get-value@4.0.1: {}
getpass@0.1.7:
dependencies:
assert-plus: 1.0.0
glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
@ -16624,6 +17032,15 @@ snapshots:
package-json-from-dist: 1.0.1
path-scurry: 1.11.1
glob@10.5.0:
dependencies:
foreground-child: 3.3.1
jackspeak: 3.4.3
minimatch: 9.0.5
minipass: 7.1.2
package-json-from-dist: 1.0.1
path-scurry: 1.11.1
glob@11.0.3:
dependencies:
foreground-child: 3.3.1
@ -17060,6 +17477,26 @@ snapshots:
transitivePeerDependencies:
- '@types/node'
inquirer@8.2.7(@types/node@22.18.12):
dependencies:
'@inquirer/external-editor': 1.0.2(@types/node@22.18.12)
ansi-escapes: 4.3.2
chalk: 4.1.2
cli-cursor: 3.1.0
cli-width: 3.0.0
figures: 3.2.0
lodash: 4.17.21
mute-stream: 0.0.8
ora: 5.4.1
run-async: 2.4.1
rxjs: 7.8.2
string-width: 4.2.3
strip-ansi: 6.0.1
through: 2.3.8
wrap-ansi: 6.2.0
transitivePeerDependencies:
- '@types/node'
internal-slot@1.1.0:
dependencies:
es-errors: 1.3.0
@ -17168,8 +17605,14 @@ snapshots:
is-plain-obj@4.1.0: {}
is-plain-object@2.0.4:
dependencies:
isobject: 3.0.1
is-potential-custom-element-name@1.0.1: {}
is-primitive@3.0.1: {}
is-regex@1.2.1:
dependencies:
call-bound: 1.0.4
@ -17225,6 +17668,8 @@ snapshots:
isexe@2.0.0: {}
isobject@3.0.1: {}
isomorphic.js@0.2.5: {}
istanbul-lib-coverage@3.2.2: {}
@ -17641,6 +18086,12 @@ snapshots:
dependencies:
argparse: 2.0.1
js-yaml@4.1.1:
dependencies:
argparse: 2.0.1
jsbn@0.1.1: {}
jsdom@20.0.3:
dependencies:
abab: 2.0.6
@ -18314,6 +18765,9 @@ snapshots:
dependencies:
queue-tick: 1.0.1
nan@2.26.2:
optional: true
nanoid@3.3.11: {}
natural-compare@1.4.0: {}
@ -18497,6 +18951,8 @@ snapshots:
package-manager-detector@1.5.0: {}
packageurl-js@2.0.1: {}
pako@1.0.11: {}
pako@2.1.0: {}
@ -19386,6 +19842,8 @@ snapshots:
safer-buffer@2.1.2: {}
sax@1.6.0: {}
saxes@6.0.0:
dependencies:
xmlchars: 2.2.0
@ -19426,6 +19884,11 @@ snapshots:
es-errors: 1.3.0
es-object-atoms: 1.1.1
set-value@4.1.0:
dependencies:
is-plain-object: 2.0.4
is-primitive: 3.0.1
setimmediate@1.0.5: {}
sharp@0.33.5:
@ -19616,6 +20079,26 @@ snapshots:
sql-template-strings@2.2.2: {}
ssh2@1.17.0:
dependencies:
asn1: 0.2.6
bcrypt-pbkdf: 1.0.2
optionalDependencies:
cpu-features: 0.0.10
nan: 2.26.2
sshpk@1.16.1:
dependencies:
asn1: 0.2.6
assert-plus: 1.0.0
bcrypt-pbkdf: 1.0.2
dashdash: 1.14.1
ecc-jsbn: 0.1.2
getpass: 0.1.7
jsbn: 0.1.1
safer-buffer: 2.1.2
tweetnacl: 0.14.5
stack-utils@2.0.6:
dependencies:
escape-string-regexp: 2.0.0
@ -20001,6 +20484,8 @@ snapshots:
tw-animate-css@1.4.0: {}
tweetnacl@0.14.5: {}
typanion@3.14.0: {}
type-check@0.4.0:
@ -20677,12 +21162,21 @@ snapshots:
imurmurhash: 0.1.4
signal-exit: 3.0.7
ws@7.5.10: {}
ws@8.18.0: {}
ws@8.18.3: {}
xml-name-validator@4.0.0: {}
xml2js@0.5.0:
dependencies:
sax: 1.6.0
xmlbuilder: 11.0.1
xmlbuilder@11.0.1: {}
xmlchars@2.2.0: {}
xtend@4.0.2: {}
@ -20705,6 +21199,8 @@ snapshots:
yallist@3.1.1: {}
yamux-js@0.1.2: {}
yargs-parser@21.1.1: {}
yargs@17.7.2: