chore(deps): update web npm dependencies (2026-08-06) (#13673)

## 📦 Weekly NPM Dependencies Update

This automated PR updates `web/` npm packages to their latest versions
and regenerates `package-lock.json`.

### Updated Packages

- **@rudderstack/analytics-js**: 3.6.0 → 3.31.6
- **@tanstack/vue-form**: ^1.29.1 → ^1.33.3
- **@tanstack/vue-table**: ^8.21.3 → ^9.0.0
- **@tanstack/vue-virtual**: ^3.13.16 → ^3.13.35
- **@vue-flow/core**: ^1.48.1 → ^1.48.2
- **acorn**: ^8.15.0 → ^8.18.0
- **acorn-walk**: ^8.3.4 → ^8.3.5
- **cron-parser**: ^5.4.0 → ^5.7.0
- **date-fns**: ^4.1.0 → ^4.4.0
- **dompurify**: ^3.4.12 → ^3.4.13
- **gridstack**: ^12.4.2 → ^13.0.2
- **js-beautify**: ^1.15.4 → ^2.0.3
- **js-cookie**: ^3.0.7 → ^3.0.8
- **js-yaml**: ^4.3.0 → ^5.2.3
- **lucide-vue-next**: ^0.562.0 → ^1.0.0
- **marked**: ^17.0.1 → ^18.0.9
- **moment-timezone**: ^0.6.0 → ^0.6.3
- **monaco-editor**: ^0.52.2 → ^0.56.0
- **node-polyfill-webpack-plugin**: ^4.0.0 → ^4.1.0
- **reka-ui**: ^2.9.6 → ^2.10.1
- **reodotdev**: ^1.0.0 → ^1.1.0
- **sql-formatter**: ^15.6.12 → ^15.8.2
- **uuid**: ^14.0.0 → ^14.0.1
- **vue**: ^3.5.26 → ^3.5.41
- **vue-i18n**: ^11.2.8 → ^11.4.8
- **vue-router**: ^4.6.4 → ^5.2.0
- **@cypress/vue**: ^6.0.2 → ^6.0.3
- **@cypress/webpack-dev-server**: ^5.4.1 → ^5.6.2
- **@iconify-json/majesticons**: ^1.2.4 → ^1.2.5
- **@iconify-json/material-symbols**: ^1.2.72 → ^1.2.88
- **@iconify-json/octicon**: ^1.2.25 → ^1.2.31
- **@intlify/core-base**: ^11.2.8 → ^11.4.8
- **@rushstack/eslint-patch**: ^1.15.0 → ^1.16.1
- **@tailwindcss/postcss**: ^4.1.18 → ^4.3.3
- **@tailwindcss/typography**: ^0.5.19 → ^0.5.20
- **@tailwindcss/vite**: ^4.1.18 → ^4.3.3
- **@types/jsdom**: ^27.0.0 → ^28.0.3
- **@types/leaflet**: ^1.9.21 → ^1.9.22
- **@types/luxon**: ^3.7.1 → ^3.7.3
- **@types/node**: ^25.0.3 → ^26.1.2
- **@vitejs/plugin-vue**: ^6.0.3 → ^6.0.8
- **@vitejs/plugin-vue-jsx**: ^5.1.3 → ^5.1.6
- **@vitest/coverage-v8**: ^4.0.16 → ^4.1.10
- **@vitest/ui**: ^4.0.16 → ^4.1.10
- **@vue/eslint-config-typescript**: ^14.6.0 → ^14.9.0
- **@vue/test-utils**: ^2.4.6 → ^2.4.11
- **@vue/tsconfig**: ^0.8.1 → ^0.9.1
- **autoprefixer**: ^10.4.23 → ^10.5.4
- **c8**: ^10.1.3 → ^12.0.0
- **cypress**: ^15.19.0 → ^15.20.0
- **cypress-localstorage-commands**: ^2.2.8 → ^2.3.0
- **dotenv**: ^17.2.3 → ^17.4.2
- **eslint**: ^9.39.2 → ^10.8.0
- **eslint-plugin-cypress**: ^5.2.0 → ^7.0.0
- **eslint-plugin-vue**: ^10.6.2 → ^10.10.0
- **fs-extra**: ^11.3.3 → ^11.4.0
- **happy-dom**: ^20.8.9 → ^20.11.1
- **jsdom**: ^27.4.0 → ^30.0.1
- **msw**: ^2.12.7 → ^2.15.0
- **postcss**: ^8.5.10 → ^8.5.26
- **postcss-html**: ^1.8.1 → ^2.0.0
- **prettier**: ^3.7.4 → ^3.9.6
- **rollup-plugin-visualizer**: ^6.0.5 → ^7.0.1
- **sass**: ^1.97.1 → ^1.102.0
- **sass-loader**: ^16.0.6 → ^17.0.0
- **start-server-and-test**: ^2.1.3 → ^3.0.12
- **stylelint**: ^17.14.0 → ^17.14.1
- **vite**: ^7.3.2 → ^8.2.0
- **vite-plugin-istanbul**: ^7.2.1 → ^9.0.1
- **vitest-canvas-mock**: ^1.1.3 → ^1.1.4
- **vue-tsc**: ^3.2.1 → ^3.3.9
- **typescript**: ~5.9.3 → ~7.0.2
- **vitest**: ^4.0.16 → ^4.1.10

### Validation

This workflow does **not** run any checks — type check, unit tests and
build all run as normal PR checks below. Review the results there before
merging; a red check usually means one of the upgrades above needs to be
pinned back or accompanied by a code change.

---

🤖 This PR was automatically created by the Weekly NPM Update workflow

---------

Co-authored-by: Bhargav <551527+bjp232004@users.noreply.github.com>
Co-authored-by: Bhargav <BJP232004@GMAIL.COM>
Co-authored-by: ktx-abhay <abhay.padamani@kiara.tech>
Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com>
This commit is contained in:
Shrinath Rao
2026-08-07 10:44:33 +00:00
committed by GitHub
co-authored by Bhargav Bhargav ktx-abhay Abhay Padamani
parent 79fbd566b3
commit 74805cf8ae
83 changed files with 1832 additions and 1905 deletions
+27 -5
View File
@@ -18,6 +18,19 @@ jobs:
# nothing here needs to install node_modules or compile anything.
runs-on: ubuntu-latest
env:
# Shared by both npm-check-updates invocations below — they must stay
# identical, or the PR body would advertise upgrades the commit didn't make.
#
# `--reject typescript`: TypeScript 7 is the Go rewrite. Its package no
# longer exports the `./lib/tsc` subpath, and vue-tsc — the only tool that
# can type-check .vue SFCs — resolves exactly that path, so `type-check:app`
# dies with ERR_PACKAGE_PATH_NOT_EXPORTED before checking a single file.
# `--peer` cannot catch this: vue-tsc declares `typescript: >=5.0.0`, which
# 7.x satisfies. Bump TypeScript by hand, together with a vue-tsc release
# that supports it (5.x and 6.x are both fine today).
NCU_ARGS: --target latest --peer --reject typescript
steps:
- name: Clone the current repo
uses: actions/checkout@v5
@@ -35,9 +48,11 @@ jobs:
- name: Configure Git
run: |
# Commit as one of the user rather than the bot, so the commit and the PR share
# one author and the PR shows up under his own filters.
# Commit as a real user rather than the bot, so the commit and the PR
# share one author and the PR shows up under their own filters.
# Without these, `git commit` below aborts with "Please tell me who you
# are" — Actions runners have no global git identity of their own.
- name: Create update branch
run: |
BRANCH_NAME="chore/npm-update-$(date +%Y%m%d)"
@@ -52,7 +67,7 @@ jobs:
# Snapshot the pre-update manifest so the PR body can show old → new.
cp package.json "$RUNNER_TEMP/package.json.before"
npx --yes npm-check-updates --target latest --peer --jsonUpgraded \
npx --yes npm-check-updates $NCU_ARGS --jsonUpgraded \
> "$RUNNER_TEMP/upgrades.json"
if ! jq -e 'type == "object"' "$RUNNER_TEMP/upgrades.json" > /dev/null; then
@@ -77,7 +92,7 @@ jobs:
echo "Updating dependencies..."
# Apply the same upgrades that were just reported.
npx --yes npm-check-updates -u --target latest --peer
npx --yes npm-check-updates -u $NCU_ARGS
# Regenerate package-lock.json only — node_modules is never needed
# here, and skipping the install keeps this job to well under a minute.
@@ -107,6 +122,13 @@ jobs:
$UPDATED_PACKAGES
### Not upgraded here
- **typescript** — excluded on purpose. TypeScript 7 (the Go rewrite)
drops the \`./lib/tsc\` subpath that vue-tsc needs, so it breaks
\`type-check:app\` outright. Bump it by hand alongside a vue-tsc that
supports it. See \`NCU_ARGS\` in \`.github/workflows/npm-update.yml\`.
### Validation
This workflow does **not** run any checks — type check, unit tests and
+3 -3
View File
@@ -130,7 +130,7 @@ jobs:
- uses: actions/setup-node@v7
with:
node-version: 22
node-version: 24
- name: Lint frontend code
run: cd web && npm ci && npm run lint:ci
@@ -271,7 +271,7 @@ jobs:
- uses: actions/setup-node@v7
with:
node-version: 22
node-version: 24
- name: Cache Playwright browser
id: playwright-cache
@@ -404,7 +404,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v7
with:
node-version: 22
node-version: 24
- name: Install project dependencies
run: cd tests/ui-testing && npm ci
+1553 -1493
View File
File diff suppressed because it is too large Load Diff
+52 -50
View File
@@ -46,21 +46,21 @@
"@openobserve/node-sql-parser": "^0.1.5",
"@openobserve/rrweb-player": "^0.2.1",
"@rudderstack/analytics-js": "3.6.0",
"@tanstack/vue-form": "^1.29.1",
"@tanstack/vue-form": "^1.33.3",
"@tanstack/vue-table": "^8.21.3",
"@tanstack/vue-virtual": "^3.13.16",
"@tanstack/vue-virtual": "^3.13.35",
"@types/js-yaml": "^4.0.9",
"@vue-flow/background": "^1.3.2",
"@vue-flow/controls": "^1.1.3",
"@vue-flow/core": "^1.48.1",
"acorn": "^8.15.0",
"acorn-walk": "^8.3.4",
"cron-parser": "^5.4.0",
"@vue-flow/core": "^1.48.2",
"acorn": "^8.18.0",
"acorn-walk": "^8.3.5",
"cron-parser": "^5.7.0",
"d3-force": "^3.0.0",
"d3-scale": "^4.0.2",
"date-fns": "^4.1.0",
"date-fns": "^4.4.0",
"date-fns-tz": "^3.2.0",
"dompurify": "^3.4.12",
"dompurify": "^3.4.13",
"echarts": "^6.1.0",
"echarts-gl": "^2.1.0",
"escodegen": "^2.1.0",
@@ -68,7 +68,7 @@
"gridstack": "^12.4.2",
"highlight.js": "^11.11.1",
"js-beautify": "^1.15.4",
"js-cookie": "^3.0.7",
"js-cookie": "^3.0.8",
"js-yaml": "^4.3.1",
"json-2-csv": "^5.5.11",
"jszip": "^3.10.1",
@@ -78,90 +78,92 @@
"luxon": "^3.7.2",
"marked": "^17.0.1",
"moment": "^2.30.1",
"moment-timezone": "^0.6.0",
"moment-timezone": "^0.6.3",
"monaco-editor": "^0.52.2",
"node-polyfill-webpack-plugin": "^4.0.0",
"reka-ui": "^2.9.6",
"reodotdev": "^1.0.0",
"node-polyfill-webpack-plugin": "^4.1.0",
"reka-ui": "^2.10.1",
"reodotdev": "^1.1.0",
"rollup-plugin-node-polyfills": "^0.2.1",
"rollup-plugin-polyfill-node": "^0.13.0",
"sql-formatter": "^15.6.12",
"sql-formatter": "^15.8.2",
"tw-animate-css": "^1.4.0",
"uuid": "^14.0.0",
"vue": "^3.5.26",
"uuid": "^14.0.1",
"vue": "^3.5.41",
"vue-drag-resize": "^1.5.4",
"vue-draggable-next": "^2.3.0",
"vue-i18n": "^11.2.8",
"vue-i18n": "^11.4.8",
"vue-router": "^4.6.4",
"vuex": "^4.1.0",
"zod": "^4.4.3"
},
"devDependencies": {
"@cypress/vue": "^6.0.2",
"@cypress/webpack-dev-server": "^5.4.1",
"@iconify-json/majesticons": "^1.2.4",
"@iconify-json/material-symbols": "^1.2.72",
"@cypress/vue": "^6.0.3",
"@cypress/webpack-dev-server": "^5.6.2",
"@iconify-json/majesticons": "^1.2.5",
"@iconify-json/material-symbols": "^1.2.88",
"@iconify-json/mdi": "^1.2.3",
"@iconify-json/octicon": "^1.2.25",
"@iconify-json/octicon": "^1.2.31",
"@iconify-json/si": "^1.2.17",
"@intlify/core-base": "^11.2.8",
"@intlify/core-base": "^11.4.8",
"@intlify/eslint-plugin-vue-i18n": "^4.5.1",
"@rushstack/eslint-patch": "^1.15.0",
"@tailwindcss/postcss": "^4.1.18",
"@tailwindcss/typography": "^0.5.19",
"@tailwindcss/vite": "^4.1.18",
"@rushstack/eslint-patch": "^1.16.1",
"@tailwindcss/postcss": "^4.3.3",
"@tailwindcss/typography": "^0.5.20",
"@tailwindcss/vite": "^4.3.3",
"@types/d3-force": "^3.0.10",
"@types/d3-scale": "^4.0.9",
"@types/fs-extra": "^11.0.4",
"@types/js-cookie": "^3.0.6",
"@types/jsdom": "^27.0.0",
"@types/leaflet": "^1.9.21",
"@types/leaflet": "^1.9.22",
"@types/lodash-es": "^4.17.12",
"@types/luxon": "^3.7.1",
"@types/luxon": "^3.7.3",
"@types/node": "^25.0.3",
"@types/uuid": "^11.0.0",
"@vitejs/plugin-vue": "^6.0.3",
"@vitejs/plugin-vue-jsx": "^5.1.3",
"@vitest/coverage-v8": "^4.0.16",
"@vitest/ui": "^4.0.16",
"@typescript-eslint/eslint-plugin": "^8.66.0",
"@typescript-eslint/parser": "^8.66.0",
"@vitejs/plugin-vue": "^6.0.8",
"@vitejs/plugin-vue-jsx": "^5.1.6",
"@vitest/coverage-v8": "^4.1.10",
"@vitest/ui": "^4.1.10",
"@vue/eslint-config-prettier": "^10.2.0",
"@vue/eslint-config-typescript": "^14.6.0",
"@vue/test-utils": "^2.4.6",
"@vue/eslint-config-typescript": "^14.9.0",
"@vue/test-utils": "^2.4.11",
"@vue/tsconfig": "^0.8.1",
"autoprefixer": "^10.4.23",
"autoprefixer": "^10.5.4",
"c8": "^10.1.3",
"cypress": "^15.19.0",
"cypress-localstorage-commands": "^2.2.8",
"dotenv": "^17.2.3",
"cypress": "^15.20.0",
"cypress-localstorage-commands": "^2.3.0",
"dotenv": "^17.4.2",
"eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-formatter-unix": "^9.0.1",
"eslint-plugin-cypress": "^5.2.0",
"eslint-plugin-vue": "^10.6.2",
"fs-extra": "^11.3.3",
"happy-dom": "^20.8.9",
"eslint-plugin-vue": "^10.10.0",
"fs-extra": "^11.4.0",
"happy-dom": "^20.11.1",
"jsdom": "^27.4.0",
"msw": "^2.12.7",
"msw": "^2.15.0",
"npm-run-all": "^4.1.5",
"postcss": "^8.5.25",
"postcss": "^8.5.26",
"postcss-html": "^1.8.1",
"prettier": "^3.7.4",
"prettier": "^3.9.6",
"prettier-plugin-tailwindcss": "^0.8.1",
"rollup-plugin-analyzer": "^4.0.0",
"rollup-plugin-visualizer": "^6.0.5",
"sass": "^1.97.1",
"sass": "^1.102.0",
"sass-loader": "^16.0.6",
"start-server-and-test": "^2.1.3",
"stylelint": "^17.14.0",
"stylelint": "^17.14.1",
"tailwindcss": "^4.1.18",
"typescript": "~5.9.3",
"unplugin-icons": "^23.0.1",
"vite": "^7.3.2",
"vite-plugin-istanbul": "^7.2.1",
"vite-plugin-monaco-editor": "^1.1.0",
"vitest": "^4.0.16",
"vitest-canvas-mock": "^1.1.3",
"vue-tsc": "^3.2.1"
"vitest": "^4.1.10",
"vitest-canvas-mock": "^1.1.4",
"vue-tsc": "^3.3.9"
},
"overrides": {
"axios": "1.13.2"
+1 -2
View File
@@ -30,8 +30,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
data-test="rum-content-text"
class="m-0 p-3 pr-10 text-sm leading-5 wrap-break-word whitespace-pre-wrap"
>{{ computedContent }}</pre
>
>{{ computedContent }}</pre>
</div>
</template>
+10 -12
View File
@@ -588,18 +588,16 @@ const editScriptSchema = makeEditScriptSchema({
// Dynamic (edit-prefill) defaults: projects the form-owned fields out of the
// component's `formData` / `frequency`. Seeds useOForm at create; re-applied
// via form.reset() when an edited record arrives async (see below).
const editScriptDefaults = computed(
(): EditScriptForm => ({
name: formData.value.name ?? "",
description: formData.value.description ?? "",
type: formData.value.type ?? "scheduled",
service_account: formData.value.service_account ?? "",
timezone: formData.value.timezone ?? "UTC",
codeZip: (formData.value.codeZip as File | null) ?? null,
cron: frequency.value.cron ?? "",
frequencyType: frequency.value.type ?? "once",
}),
);
const editScriptDefaults = computed((): EditScriptForm => ({
name: formData.value.name ?? "",
description: formData.value.description ?? "",
type: formData.value.type ?? "scheduled",
service_account: formData.value.service_account ?? "",
timezone: formData.value.timezone ?? "UTC",
codeZip: (formData.value.codeZip as File | null) ?? null,
cron: frequency.value.cron ?? "",
frequencyType: frequency.value.type ?? "once",
}));
// Headless form (Rule ③ owner). defaultValues seed the blank create form; the
// async edit record re-seeds via form.reset() below. onSubmit is deferred to
+2 -4
View File
@@ -395,8 +395,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
font-family: var(--font-mono);
font-size: var(--text-xs);
"
>{{ selectedRow.error }}</pre
>
>{{ selectedRow.error }}</pre>
</div>
</div>
</template>
@@ -421,8 +420,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
font-family: var(--font-mono);
font-size: var(--text-xs);
"
>{{ selectedRow.success_response }}</pre
>
>{{ selectedRow.success_response }}</pre>
</div>
</div>
</template>
@@ -287,8 +287,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</div>
<pre
class="text-compact m-0 flex-1 overflow-x-auto overflow-y-auto p-[10px_14px] font-mono leading-relaxed whitespace-pre-wrap"
>{{ anomalySql || t("alerts.alertDetails.noCondition") }}</pre
>
>{{ anomalySql || t("alerts.alertDetails.noCondition") }}</pre>
</div>
</template>
@@ -351,8 +350,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
})
: t("alerts.alertDetails.noCondition")
: t("alerts.alertDetails.noCondition")
}}</pre
>
}}</pre>
</div>
</template>
@@ -131,8 +131,7 @@ limitations under the License. -->
</div>
<pre
class="rounded-default text-3xs text-text-body m-0 max-h-37.5 overflow-y-auto border border-[rgba(0,0,0,0.1)] bg-[rgba(0,0,0,0.05)] p-2 font-mono leading-[1.5] whitespace-pre dark:border-[rgba(255,255,255,0.1)] dark:bg-[rgba(255,255,255,0.05)]"
>{{ formatResponseBody(result.responseBody) }}</pre
>
>{{ formatResponseBody(result.responseBody) }}</pre>
</div>
</div>
</OCollapsible>
@@ -284,8 +284,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
>
<pre
class="m-0 font-[inherit] [overflow-wrap:break-word] [word-break:break-word] [white-space:pre-wrap] [word-wrap:break-word]"
>{{ val.message }}</pre
>
>{{ val.message }}</pre>
</div>
</div>
</div>
+1 -2
View File
@@ -173,8 +173,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
>
<pre
class="m-0 font-[inherit] [overflow-wrap:break-word] [word-break:break-word] [white-space:pre-wrap] [word-wrap:break-word]"
>{{ val.message }}</pre
>
>{{ val.message }}</pre>
</div>
</div>
</div>
@@ -128,8 +128,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
data-test="trigger-payload-json"
class="bg-surface-secondary rounded-surface max-h-[60vh] overflow-auto p-3 text-xs"
>{{ formattedPayload }}</pre
>
>{{ formattedPayload }}</pre>
</template>
</ODialog>
</div>
@@ -1028,8 +1028,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
'text-compact overflow-x-auto break-words whitespace-pre-wrap',
'text-text-body',
]"
>{{ alerts[selectedAlertIndex]?.query_condition?.sql }}</pre
>
>{{ alerts[selectedAlertIndex]?.query_condition?.sql }}</pre>
</div>
<!-- PromQL Query -->
@@ -1039,8 +1038,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
'text-compact overflow-x-auto break-words whitespace-pre-wrap',
'text-text-body',
]"
>{{ alerts[selectedAlertIndex]?.query_condition?.promql }}</pre
>
>{{ alerts[selectedAlertIndex]?.query_condition?.promql }}</pre>
</div>
<!-- Custom Conditions -->
@@ -1056,8 +1054,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
formatCustomConditions(
alerts[selectedAlertIndex]?.query_condition?.conditions,
)
}}</pre
>
}}</pre>
</div>
<!-- No conditions -->
@@ -248,8 +248,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
class="bg-surface-panel rounded-default text-3xs overflow-auto p-3"
data-test="template-preview-panel-raw-json"
>{{ rawPayloadJson }}</pre
>
>{{ rawPayloadJson }}</pre>
</template>
</div>
</div>
@@ -175,14 +175,12 @@ export default defineComponent({
// Dynamic (edit-prefill) defaults → a typed component computed. Seeds
// name/url/fields/newFieldName from the current `link`; re-applied on open
// via form.reset (the form is created here, so it persists across opens).
const crossLinkDefaults = computed(
(): CrossLinkDialogForm => ({
name: props.link?.name ?? "",
url: props.link?.url ?? "",
fields: props.link?.fields ? props.link.fields.map((f) => ({ name: f.name })) : [],
newFieldName: "",
}),
);
const crossLinkDefaults = computed((): CrossLinkDialogForm => ({
name: props.link?.name ?? "",
url: props.link?.url ?? "",
fields: props.link?.fields ? props.link.fields.map((f) => ({ name: f.name })) : [],
newFieldName: "",
}));
// Owner-pattern form (Rule ③): CrossLinkDialog OWNS the <OForm> and its
// template renders the chip list from the form-owned `fields` array. We
@@ -70,7 +70,7 @@
</div>
<div class="group relative mt-1">
<div
class="rounded-default bg-theme-body-bg-primary border-card-glass-border inspector-query-editor max-h-40 overflow-y-auto border p-2 font-mono text-sm break-all whitespace-pre-wrap [scrollbar-color:color-mix(in_srgb,var(--color-grey-500)_20%,transparent)_transparent] [scrollbar-width:thin]"
class="rounded-default bg-theme-body-bg-primary border-card-glass-border inspector-query-editor max-h-40 [scrollbar-width:thin] [scrollbar-color:color-mix(in_srgb,var(--color-grey-500)_20%,transparent)_transparent] overflow-y-auto border p-2 font-mono text-sm break-all whitespace-pre-wrap"
:data-test="`query-inspector-original-query-${index}`"
v-html="
highlightSearch(
@@ -99,7 +99,7 @@
</div>
<div class="group relative mt-1">
<div
class="rounded-default bg-theme-body-bg-primary border-card-glass-border inspector-query-editor max-h-40 overflow-y-auto border p-2 font-mono text-sm break-all whitespace-pre-wrap [scrollbar-color:color-mix(in_srgb,var(--color-grey-500)_20%,transparent)_transparent] [scrollbar-width:thin]"
class="rounded-default bg-theme-body-bg-primary border-card-glass-border inspector-query-editor max-h-40 [scrollbar-width:thin] [scrollbar-color:color-mix(in_srgb,var(--color-grey-500)_20%,transparent)_transparent] overflow-y-auto border p-2 font-mono text-sm break-all whitespace-pre-wrap"
:data-test="`query-inspector-executed-query-${index}`"
v-html="
highlightSearch(
@@ -16,7 +16,7 @@
</div>
<Teleport to="body">
<div
class="user-guide border-border-default rounded-default bg-surface-base pointer-events-auto fixed z-9999 max-h-75 w-125 overflow-y-auto border p-2.5 [scrollbar-color:color-mix(in_srgb,var(--color-grey-950)_25%,transparent)_color-mix(in_srgb,var(--color-grey-950)_5%,transparent)] [scrollbar-width:thin] [&_div]:m-0 [&_li]:m-0 [&_p]:m-0 [&_ul]:m-0"
class="user-guide border-border-default rounded-default bg-surface-base pointer-events-auto fixed z-9999 max-h-75 w-125 [scrollbar-width:thin] [scrollbar-color:color-mix(in_srgb,var(--color-grey-950)_25%,transparent)_color-mix(in_srgb,var(--color-grey-950)_5%,transparent)] overflow-y-auto border p-2.5 [&_div]:m-0 [&_li]:m-0 [&_p]:m-0 [&_ul]:m-0"
v-show="showUserGuide"
@mouseleave="showUserGuide = false"
ref="userGuideDivRef"
@@ -20,7 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<DashboardHeader :title="title" backButton @back="close"> </DashboardHeader>
<div
class="[&::-webkit-scrollbar-thumb]:rounded-default [&::-webkit-scrollbar-thumb]:bg-border-default min-h-0 flex-1 overflow-y-auto px-0.75 pb-4 [scrollbar-color:var(--color-border-default)_transparent] [scrollbar-width:thin] [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar]:bg-transparent"
class="[&::-webkit-scrollbar-thumb]:rounded-default [&::-webkit-scrollbar-thumb]:bg-border-default min-h-0 flex-1 [scrollbar-width:thin] [scrollbar-color:var(--color-border-default)_transparent] overflow-y-auto px-0.75 pb-4 [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar]:bg-transparent"
>
<OForm greedy id="add-setting-variable-form" :form="form" class="px-0.5">
<div class="mt-3">
@@ -110,11 +110,9 @@ export default defineComponent({
// OForm reads `defaultValues` once at mount, and ODialog remounts the body on
// open — so this computed seeds `name` each time the dialog opens (edit → the
// tab's name, create → blank). No local model / no manual reset needed.
const addTabDefaults = computed(
(): AddTabForm => ({
name: props.editMode ? (editingTab.value?.name ?? "") : "",
}),
);
const addTabDefaults = computed((): AddTabForm => ({
name: props.editMode ? (editingTab.value?.name ?? "") : "",
}));
// Edit data arrives ASYNC (getDashboard may hit the API) after the dialog has
// mounted, so `:default-values` has already been read. Per the playbook
@@ -613,9 +613,9 @@ export default defineComponent({
}
// if variables data is null, set it to empty list
if (
!(currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length)
) {
if (!(
currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length
)) {
variablesData.isVariablesLoading = false;
variablesData.values = [];
}
@@ -145,8 +145,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
>
<pre
class="text-compact text-text-code m-0 cursor-default border-0 bg-transparent p-4 font-mono leading-normal font-normal break-words whitespace-pre-wrap select-text"
>{{ selectedDefinition }}</pre
>
>{{ selectedDefinition }}</pre>
</div>
</OCardSection>
</OCard>
@@ -207,8 +207,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
v-if="compilationErr"
class="text-status-error-text text-sm font-bold whitespace-pre-wrap"
>{{ compilationErr }}</pre
>
>{{ compilationErr }}</pre>
</div>
</div>
+1 -2
View File
@@ -128,8 +128,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
class="text-status-error-text my-0 whitespace-pre-wrap"
style="font-family: var(--font-mono); font-size: var(--text-compact)"
>{{ vrlFunctionError }}</pre
>
>{{ vrlFunctionError }}</pre>
</div>
</div>
</div>
+1 -2
View File
@@ -224,8 +224,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
class="bg-surface-subtle border-border-default rounded-default overflow-x-auto border p-3 font-mono text-xs whitespace-pre"
data-test="synthetics-token-install-cmd"
>{{ installCommand }}</pre
>
>{{ installCommand }}</pre>
<OButton
variant="ghost"
size="icon-sm"
+3 -5
View File
@@ -85,11 +85,9 @@ const addGroupSchema = makeAddGroupSchema(t);
// The OForm owns `name`. The ODialog unmounts its body on close + remounts fresh
// on open, so this typed computed re-seeds `:default-values` each open (the
// optional `group` prop prefills it, otherwise blank). No local model / watch.
const addGroupDefaults = computed(
(): AddGroupForm => ({
name: props.group?.name ?? "",
}),
);
const addGroupDefaults = computed((): AddGroupForm => ({
name: props.group?.name ?? "",
}));
// Plain async @submit handler — the validated `value` is the source of truth.
// The schema validates the trimmed name (so surrounding whitespace doesn't trip
+6 -8
View File
@@ -246,14 +246,12 @@ const saveGroupChanges = () => {
remove_roles: Array.from(removedRoles.value) as string[],
};
if (
!(
payload.add_users.length ||
payload.remove_users.length ||
payload.add_roles.length ||
payload.remove_roles.length
)
) {
if (!(
payload.add_users.length ||
payload.remove_users.length ||
payload.add_roles.length ||
payload.remove_roles.length
)) {
toast({
variant: "info",
message: t("iam.editGroup.noUpdates"),
@@ -139,13 +139,11 @@ export default defineComponent({
// The OForm owns id/name/makeBilledMember. This typed computed seeds them each
// time the dialog body mounts (edit → id + name from modelValue, create →
// blank); makeBilledMember always starts unchecked.
const addUpdateOrganizationDefaults = computed(
(): AddUpdateOrganizationForm => ({
id: props.modelValue?.id ?? "",
name: props.modelValue?.name ?? "",
makeBilledMember: false,
}),
);
const addUpdateOrganizationDefaults = computed((): AddUpdateOrganizationForm => ({
id: props.modelValue?.id ?? "",
name: props.modelValue?.name ?? "",
makeBilledMember: false,
}));
const currentOrgName = computed(
() =>
+4 -6
View File
@@ -111,12 +111,10 @@ const addRoleSchema = makeAddRoleSchema(t);
// remounts fresh on open, so this typed computed re-seeds `:default-values` each
// open (the optional `role` prop prefills the name; startFrom resets to "custom").
// No local model / watch.
const addRoleDefaults = computed(
(): AddRoleForm => ({
name: props.role?.name ?? "",
startFrom: "custom",
}),
);
const addRoleDefaults = computed((): AddRoleForm => ({
name: props.role?.name ?? "",
startFrom: "custom",
}));
// Plain async @submit handler — the validated `value` is the source of truth.
// The schema validates the trimmed name; trim again here so the saved value
+6 -8
View File
@@ -2224,14 +2224,12 @@ const saveRole = () => {
) as string[],
};
if (
!(
payload.add.length ||
payload.remove.length ||
payload.add_users.length ||
payload.remove_users.length
)
) {
if (!(
payload.add.length ||
payload.remove.length ||
payload.add_users.length ||
payload.remove_users.length
)) {
toast({
variant: "info",
message: t("iam.editRole.noUpdatesDetected"),
@@ -177,14 +177,12 @@ export default defineComponent({
// The OForm owns all editable fields. Name/roles/groups are always blank on
// create; the description prefills from modelValue in update mode.
const addServiceAccountDefaults = computed(
(): AddServiceAccountForm => ({
name: "",
first_name: props.modelValue?.first_name ?? "",
roles: [],
groups: [],
}),
);
const addServiceAccountDefaults = computed((): AddServiceAccountForm => ({
name: "",
first_name: props.modelValue?.first_name ?? "",
roles: [],
groups: [],
}));
// Roles/groups exist only on enterprise/cloud (OSS has no RBAC UI).
const showAccessPickers = computed(
@@ -283,20 +283,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<OTabPanel name="curl">
<pre
class="bg-surface-subtle text-text-body rounded-default overflow-auto p-3 text-xs whitespace-pre-wrap"
>{{ tokenCurlSnippet }}</pre
>
>{{ tokenCurlSnippet }}</pre>
</OTabPanel>
<OTabPanel name="header">
<pre
class="bg-surface-subtle text-text-body rounded-default overflow-auto p-3 text-xs whitespace-pre-wrap"
>{{ tokenHeaderSnippet }}</pre
>
>{{ tokenHeaderSnippet }}</pre>
</OTabPanel>
<OTabPanel name="env">
<pre
class="bg-surface-subtle text-text-body rounded-default overflow-auto p-3 text-xs whitespace-pre-wrap"
>{{ tokenEnvSnippet }}</pre
>
>{{ tokenEnvSnippet }}</pre>
</OTabPanel>
</OTabPanels>
+4 -6
View File
@@ -119,12 +119,10 @@ export default defineComponent({
// EDIT-prefill: the OForm owns role/first_name; this typed computed seeds them
// from the externally-provided modelValue each time the dialog body mounts.
// org_member_id/email stay non-form data (read from modelValue at submit).
const updateRoleDefaults = computed(
(): UpdateRoleForm => ({
role: props.modelValue?.role ?? "",
first_name: props.modelValue?.first_name ?? "",
}),
);
const updateRoleDefaults = computed((): UpdateRoleForm => ({
role: props.modelValue?.role ?? "",
first_name: props.modelValue?.first_name ?? "",
}));
// Options-API: the schema (and the defaults computed) MUST be returned from
// setup() — a bare module import is out of the template's scope, so :schema
@@ -36,8 +36,7 @@ export { safeHttpUrl } from "@/components/ingestion/setupCard/subs";
const marked = new Marked({ gfm: true, breaks: false });
export type CardSegment =
| { type: "html"; html: string }
| { type: "code"; code: string; lang: string };
{ type: "html"; html: string } | { type: "code"; code: string; lang: string };
function substitute(md: string, subs: CardSubstitutions): string {
return md
@@ -230,13 +230,11 @@ const selectedNodeType = ref(
);
// Typed dynamic (edit-prefill) defaults — read once at each OForm mount.
const streamDefaults = computed(
(): StreamForm => ({
stream_type: streamTypeSeed,
stream_name: streamNameSeed,
appendData: appendDataSeed,
}),
);
const streamDefaults = computed((): StreamForm => ({
stream_type: streamTypeSeed,
stream_name: streamNameSeed,
appendData: appendDataSeed,
}));
// Rule ③ OWNER pattern: this component OWNS <OForm>, so it creates the form here
// with useOForm and hands it to <OForm :form="form">. The owner needs the live
@@ -284,14 +284,12 @@ const errorMessage = ref("");
// Typed dynamic defaults for the form-owned fields. The time range is an
// absolute range seeded empty (forces the picker to absolute mode).
const backfillDefaults = computed(
(): BackfillForm => ({
timerange: { type: "absolute", from: undefined, to: undefined },
chunkPeriodMinutes: (props.scheduleFrequency || 60) as number | null,
delayBetweenChunks: null,
deleteBeforeBackfill: false,
}),
);
const backfillDefaults = computed((): BackfillForm => ({
timerange: { type: "absolute", from: undefined, to: undefined },
chunkPeriodMinutes: (props.scheduleFrequency || 60) as number | null,
delayBetweenChunks: null,
deleteBeforeBackfill: false,
}));
// Rule ③ OWNER pattern: this component OWNS <OForm> and needs the live values
// (timerange/chunk/delay/deleteBeforeBackfill) for estimatedInfo + the delete
@@ -186,18 +186,16 @@ const errorMessage = ref("");
// Typed dynamic defaults for the form-owned fields (seeded from props.job). The
// time range is an absolute range carrying the job's start/end (forces the
// picker to absolute mode + pre-fills it).
const backfillDefaults = computed(
(): BackfillForm => ({
timerange: {
type: "absolute",
from: props.job?.start_time,
to: props.job?.end_time,
},
chunkPeriodMinutes: props.job?.chunk_period_minutes || null,
delayBetweenChunks: props.job?.delay_between_chunks_secs || null,
deleteBeforeBackfill: props.job?.delete_before_backfill || false,
}),
);
const backfillDefaults = computed((): BackfillForm => ({
timerange: {
type: "absolute",
from: props.job?.start_time,
to: props.job?.end_time,
},
chunkPeriodMinutes: props.job?.chunk_period_minutes || null,
delayBetweenChunks: props.job?.delay_between_chunks_secs || null,
deleteBeforeBackfill: props.job?.delete_before_backfill || false,
}));
// Blank defaults used by cancel/reset (the open-watch re-seeds from props.job).
const blankDefaults = (): BackfillForm => ({
@@ -385,8 +385,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
font-family: var(--font-mono);
font-size: var(--text-xs);
"
>{{ selectedRow.error }}</pre
>
>{{ selectedRow.error }}</pre>
</div>
</div>
</template>
@@ -409,8 +408,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
font-family: var(--font-mono);
font-size: var(--text-xs);
"
>{{ selectedRow.success_response }}</pre
>
>{{ selectedRow.success_response }}</pre>
</div>
</div>
</template>
+5 -7
View File
@@ -630,13 +630,11 @@ export default defineComponent({
// Built once from the component's `t` so the messages are localized.
const generalSettingsSchema = makeGeneralSettingsSchema(t);
// Dynamic defaults (edit-prefill from the store) → a typed computed.
const generalSettingsDefaults = computed(
(): GeneralSettingsForm => ({
scrape_interval: store.state?.organizationData?.organizationSettings?.scrape_interval ?? 15,
max_series_per_query:
store.state?.organizationData?.organizationSettings?.max_series_per_query ?? null,
}),
);
const generalSettingsDefaults = computed((): GeneralSettingsForm => ({
scrape_interval: store.state?.organizationData?.organizationSettings?.scrape_interval ?? 15,
max_series_per_query:
store.state?.organizationData?.organizationSettings?.max_series_per_query ?? null,
}));
const loadingState = ref(false);
const customText = ref("");
@@ -122,8 +122,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
class="creators-message max-w-full whitespace-pre-wrap"
style="word-wrap: break-word; overflow-wrap: break-word; word-break: break-word"
>{{ val.message }}</pre
>
>{{ val.message }}</pre>
</div>
</div>
</div>
@@ -155,8 +155,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
class="max-w-full whitespace-pre-wrap"
style="word-wrap: break-word; overflow-wrap: break-word; word-break: break-word"
>{{ val.message }}</pre
>
>{{ val.message }}</pre>
</div>
</div>
</div>
@@ -434,8 +434,8 @@ function blankFormValues(provider: string): OrgStorageEditorForm {
// Dynamic defaults (region from cloud/store, provider projected from the card
// grid) → a typed computed.
const orgStorageEditorDefaults = computed(
(): OrgStorageEditorForm => blankFormValues(selectedProvider.value),
const orgStorageEditorDefaults = computed((): OrgStorageEditorForm =>
blankFormValues(selectedProvider.value),
);
const cloudProviders = computed(() => {
@@ -378,9 +378,9 @@ export default defineComponent({
// Extend-trial week count is bridged from the pill grid into the form below.
// Dynamic defaults (project the current pill value) → a typed computed.
const extendTrialFormRef = ref<any>(null);
const extendTrialDefaults = computed(
(): ExtendTrialForm => ({ extendedTrial: extendedTrial.value }),
);
const extendTrialDefaults = computed((): ExtendTrialForm => ({
extendedTrial: extendedTrial.value,
}));
// Keep the form's copy of the bridged pill value in sync (the pill grid is a
// custom control, not an <input>, so it is bridged via setFieldValue — the
@@ -107,8 +107,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
class="bg-surface-subtle border-border-default rounded-default overflow-x-auto border p-3 font-mono text-xs whitespace-pre"
data-test="synthetics-agent-setup-install-cmd"
>{{ composedCommand }}</pre
>
>{{ composedCommand }}</pre>
<OButton
variant="ghost"
size="icon-sm"
@@ -126,8 +125,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
class="bg-surface-subtle border-border-default rounded-default overflow-x-auto border p-3 font-mono text-xs whitespace-pre"
data-test="synthetics-agent-setup-install-cmd"
>{{ install }}</pre
>
>{{ install }}</pre>
<OButton
variant="ghost"
size="icon-sm"
@@ -1002,8 +1002,7 @@ function openChromeExtensions() {
v-if="blockedDetail"
class="text-text-body bg-surface-subtle rounded-default m-0 overflow-x-auto px-2 py-1.5 font-mono text-xs whitespace-pre-wrap"
data-test="synthetics-journey-preflight-detail"
>{{ blockedDetail }}</pre
>
>{{ blockedDetail }}</pre>
<div class="flex items-center gap-2">
<OButton
variant="primary"
@@ -330,8 +330,7 @@ function toggleExpanded() {
v-if="showStackTrace"
class="bg-code-bg rounded-default m-0 mt-2 max-h-75 overflow-x-auto overflow-y-auto p-3 font-mono text-xs leading-relaxed"
data-test="synthetics-journey-step-stack-content"
>{{ se?.stack }}</pre
>
>{{ se?.stack }}</pre>
</div>
<!-- Info boxes -->
@@ -279,8 +279,7 @@ function toggleSteps(executionId: string) {
</p>
<pre
class="text-text-secondary bg-status-error-bg rounded-default border border-[var(--color-status-error-text)] px-3 py-2 font-mono text-xs leading-relaxed whitespace-pre-wrap"
>{{ loc.error }}</pre
>
>{{ loc.error }}</pre>
</div>
<!-- Steps -->
@@ -406,13 +406,7 @@ export interface StepEvidence {
// why the panel reads the bundle rather than the index.
export type EvidenceKind =
| "console"
| "pageerror"
| "response"
| "requestfailed"
| "dialog"
| "crash"
| "truncation";
"console" | "pageerror" | "response" | "requestfailed" | "dialog" | "crash" | "truncation";
export interface EvidenceEvent {
/** When the event was OBSERVED. */
+1 -2
View File
@@ -1575,8 +1575,7 @@ export function useAlertForm(props: AlertFormProps, emit: AlertFormEmit) {
// needs the SQL parser, which is async and lives here rather than in the
// (pure, synchronous) adapters.
const sqlHaving = prefill.meta?.sqlHaving as
| { column: string; operator: string; value: number }
| undefined;
{ column: string; operator: string; value: number } | undefined;
if (sql && sqlHaving?.column) {
if (!parser) await importSqlParser();
sql = addHavingClauseToQuery(
@@ -81,9 +81,7 @@ export function useLatencyInsightsAnalysis() {
streamName: string,
timeRange: { startTime: number; endTime: number },
durationFilter:
| { start: number; end: number; timeStart?: number; timeEnd?: number }
| null
| undefined,
{ start: number; end: number; timeStart?: number; timeEnd?: number } | null | undefined,
baseFilter?: string,
applyDurationFilter: boolean = true,
) => {
@@ -131,9 +129,7 @@ export function useLatencyInsightsAnalysis() {
streamName: string,
timeRange: { startTime: number; endTime: number },
durationFilter:
| { start: number; end: number; timeStart?: number; timeEnd?: number }
| null
| undefined,
{ start: number; end: number; timeStart?: number; timeEnd?: number } | null | undefined,
baseFilter?: string,
applyDurationFilter: boolean = true,
) => {
+2 -4
View File
@@ -487,8 +487,7 @@ export const logsUtils = () => {
} else {
// else preserve existing visualization data from the current URL
const existingEncodedConfig = router.currentRoute.value?.query?.visualization_data as
| string
| undefined;
string | undefined;
if (existingEncodedConfig) {
query["visualization_data"] = existingEncodedConfig;
}
@@ -507,8 +506,7 @@ export const logsUtils = () => {
} else {
// else preserve existing build data from the current URL
const existingEncodedBuildConfig = router.currentRoute.value?.query?.build_data as
| string
| undefined;
string | undefined;
if (existingEncodedBuildConfig) {
query["build_data"] = existingEncodedBuildConfig;
}
+1 -6
View File
@@ -16,12 +16,7 @@ import { computed, ref } from "vue";
// Canonical keys for every pinnable item in the logs More menu.
export type ToolbarPinKey =
| "histogram"
| "sqlMode"
| "quickMode"
| "functionEditor"
| "savedViews"
| "syntaxGuide";
"histogram" | "sqlMode" | "quickMode" | "functionEditor" | "savedViews" | "syntaxGuide";
// Fixed left-to-right render order for pinned controls. Pinning never changes an
// item's position — it only toggles whether the item is shown outside the menu.
+1 -2
View File
@@ -263,8 +263,7 @@ const useTraces = () => {
const key = `${identifier}_${searchObj.data.stream.selectedStream.value}`;
// storage ref .value is typed {} at this boundary; narrow to the stored map shape
const stored = useLocalTraceFilterField()?.value as
| Record<string, Record<string, string[]>>
| undefined;
Record<string, Record<string, string[]>> | undefined;
const saved: Record<string, string[]> | undefined = stored?.[key];
const fields: string[] = saved?.[searchMode]?.length
+1 -1
View File
@@ -214,7 +214,7 @@ describe("useWebSocket", () => {
const id = uid("create");
const handle = connectAndWrap(id, "ws://localhost:8080");
expect(handle.raw).toBeDefined();
expect(handle.raw.url).toBe("ws://localhost:8080");
expect(handle.raw.url).toBe("ws://localhost:8080/");
});
it("stores a socket in the registry for a valid wss:// URL", () => {
@@ -185,8 +185,7 @@
<!-- Hard cap the filter condition height; longer conditions scroll. -->
<pre
class="text-compact text-text-body m-0 max-h-50 overflow-x-auto overflow-y-auto px-3.5 py-2.5 font-mono leading-[1.6] whitespace-pre-wrap"
>{{ filterText || t("onlineEvals.job.detail.filterEmpty") }}</pre
>
>{{ filterText || t("onlineEvals.job.detail.filterEmpty") }}</pre>
</div>
</section>
@@ -639,8 +639,7 @@
<pre
class="rounded-default bg-card-bg border-border-default text-text-body m-0 max-h-[60vh] overflow-auto border p-3 font-mono text-xs font-normal whitespace-pre [tab-size:2]"
v-else
>{{ schemaPreview }}</pre
>
>{{ schemaPreview }}</pre>
<template #footer>
<div class="flex w-full items-center justify-between gap-2">
@@ -1208,9 +1207,7 @@ function initForm(row: Scorer | null, scorerType: ScorerType): ScorerForm {
.map((f) => ({
name: String(f.name || ""),
type: (f.type === "number" || f.type === "boolean" ? f.type : "string") as
| "string"
| "number"
| "boolean",
"string" | "number" | "boolean",
description: String(f.description || ""),
}))
: [],
@@ -142,8 +142,7 @@
</summary>
<pre
class="text-text-secondary text-2xs m-0 mt-1.5 font-mono font-normal break-words whitespace-pre-wrap"
>{{ rawResponseText }}</pre
>
>{{ rawResponseText }}</pre>
</details>
</template>
@@ -14,10 +14,7 @@ export type CheckboxColor = "primary" | "negative";
*/
export type CheckboxPrimitive = string | number;
export type CheckboxModelValue =
| boolean
| "indeterminate"
| CheckboxPrimitive
| CheckboxPrimitive[];
boolean | "indeterminate" | CheckboxPrimitive | CheckboxPrimitive[];
export interface CheckboxProps {
/** Current checked state. Use `true`, `false`, or `'indeterminate'` */
+1 -1
View File
@@ -384,7 +384,7 @@ const alignClasses: Record<NonNullable<OTabsProps["align"]>, string> = {
<!-- Scrollbar hidden: the arrows stay the visible affordance. -->
<div
ref="scrollRef"
class="relative flex-1 overflow-x-auto pt-0.75 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"
class="relative flex-1 [scrollbar-width:none] overflow-x-auto pt-0.75 [&::-webkit-scrollbar]:hidden"
>
<TabsList as-child :loop="true">
<div
@@ -1650,8 +1650,7 @@ const subjectMatchCounts = computed<Record<string, number>>(() => {
if (seen.has(stream.stream_name)) continue;
seen.add(stream.stream_name);
const schema = cachedSchemas[stream.stream_name]?.schema as
| Array<{ name: string }>
| undefined;
Array<{ name: string }> | undefined;
if (schema && schema.length > 0 && subjectFieldAliases.size > 0) {
if (schema.some((c) => subjectFieldAliases.has(c.name))) matchCount++;
} else if (streamMatchesPatterns(stream.stream_name, button.poolPatterns)) {
+10 -14
View File
@@ -2325,13 +2325,11 @@ export default defineComponent({
// The dialog body unmounts on close + remounts on open; the form is created
// here (owner pattern), so re-seed it to "create" mode on open. The
// OFormToggleGroup changes the mode within the open session.
const savedFunctionDefaults = computed(
(): SavedFunctionForm => ({
isSavedFunctionAction: "create",
savedFunctionName: "",
savedFunctionSelectedName: "",
}),
);
const savedFunctionDefaults = computed((): SavedFunctionForm => ({
isSavedFunctionAction: "create",
savedFunctionName: "",
savedFunctionSelectedName: "",
}));
// Owner-pattern form (Rule ③): SearchBar OWNS this <OForm> and its dialog
// body needs the create/update mode to drive a v-if. We create the form here
@@ -2446,13 +2444,11 @@ export default defineComponent({
// savedViewSchema).
const savedViewFormRef = ref<any>(null);
const savedViewSchema = makeSavedViewSchema(t);
const savedViewDefaults = computed(
(): SavedViewForm => ({
isSavedViewAction: isSavedViewAction.value,
savedViewName: "",
savedViewSelectedName: "",
}),
);
const savedViewDefaults = computed((): SavedViewForm => ({
isSavedViewAction: isSavedViewAction.value,
savedViewName: "",
savedViewSelectedName: "",
}));
const showExplainDialog = ref(false);
const confirmDelete = ref(false);
const deleteViewID = ref("");
+2 -4
View File
@@ -175,8 +175,7 @@
<pre
v-else
class="text-compact m-0 font-mono leading-[1.6] break-words whitespace-pre-wrap"
>{{ row?.sql }}</pre
>
>{{ row?.sql }}</pre>
</div>
</div>
</div>
@@ -218,8 +217,7 @@
<pre
v-else
class="text-compact m-0 font-mono leading-[1.6] break-words whitespace-pre-wrap"
>{{ row?.function }}</pre
>
>{{ row?.function }}</pre>
</div>
</div>
</div>
+1 -2
View File
@@ -389,8 +389,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
class="text-compact m-0 font-mono leading-[1.6] break-words whitespace-pre-wrap"
data-test="inspector-sql-query-content"
>{{ profileData?.sql || t("logs.searchJobInspector.noSqlAvailable") }}</pre
>
>{{ profileData?.sql || t("logs.searchJobInspector.noSqlAvailable") }}</pre>
</div>
</ODrawer>
+1 -2
View File
@@ -474,8 +474,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<pre
v-if="isFunctionErrorOpen"
class="text-status-warning-text mt-1 break-words whitespace-pre-wrap"
>{{ searchObj?.data?.functionError }}</pre
>
>{{ searchObj?.data?.functionError }}</pre>
</div>
<!-- Row/cell actions live in a right-click context menu as well as the
@@ -164,8 +164,7 @@
<pre
v-else
class="text-compact m-0 font-mono leading-[1.6] break-words whitespace-pre-wrap"
>{{ row?.sql }}</pre
>
>{{ row?.sql }}</pre>
</div>
</div>
</div>
@@ -206,8 +205,7 @@
<pre
v-else
class="text-compact m-0 font-mono leading-[1.6] break-words whitespace-pre-wrap"
>{{ row?.function }}</pre
>
>{{ row?.function }}</pre>
</div>
</div>
</div>
@@ -98,8 +98,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<div v-else-if="isPlainText" class="text-content">
<pre
class="plain-text-content text-compact bg-code-bg rounded-default m-0 overflow-x-auto p-2 font-mono leading-normal wrap-break-word whitespace-pre-wrap"
>{{ contentStats.previewText }}</pre
>
>{{ contentStats.previewText }}</pre>
</div>
<div v-else class="json-content">
<CodeQueryEditor
@@ -194,8 +193,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<div v-else-if="isPlainText" class="text-content">
<pre
class="plain-text-content text-compact bg-code-bg rounded-default m-0 overflow-x-auto p-2 font-mono leading-normal wrap-break-word whitespace-pre-wrap"
>{{ fullText }}</pre
>
>{{ fullText }}</pre>
</div>
<div v-else class="json-content h-full">
<CodeQueryEditor
+2 -4
View File
@@ -87,8 +87,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</div>
<pre
class="thread-tool-body__pre bg-surface-base border-border-default text-text-body border"
>{{ formatToolPayload(getInputRaw(tool) || tool.tool_args) }}</pre
>
>{{ formatToolPayload(getInputRaw(tool) || tool.tool_args) }}</pre>
</div>
<div class="thread-tool-body__section">
<div class="thread-tool-body__label text-text-secondary">
@@ -103,8 +102,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
formatToolPayload(getOutputRaw(tool)) ||
tool.status_message ||
t("traces.threadToolCalls.empty")
}}</pre
>
}}</pre>
</div>
</div>
</div>
+5 -7
View File
@@ -533,7 +533,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/>
<div
ref="traceScrollContainer"
class="relative-position trace-content-scroll min-h-0! max-w-full! flex-1! overflow-x-hidden! overflow-y-auto! [scrollbar-gutter:stable]!"
class="relative-position trace-content-scroll min-h-0! max-w-full! flex-1! [scrollbar-gutter:stable]! overflow-x-hidden! overflow-y-auto!"
:style="{
width: isSidebarOpen ? leftWidth + 'px' : '100%',
}"
@@ -1999,12 +1999,10 @@ export default defineComponent({
endTime = Math.ceil(res.data.hits[0].end_time / 1000);
// If the trace is not in the current time range, update the time range
if (
!(
startTime >= Number(router.currentRoute.value.query.from) &&
endTime <= Number(router.currentRoute.value.query.to)
)
) {
if (!(
startTime >= Number(router.currentRoute.value.query.from) &&
endTime <= Number(router.currentRoute.value.query.to)
)) {
updateUrlQueryParams({
from: startTime,
to: endTime,
@@ -39,12 +39,7 @@ import {
export type LLMPanelType = "stacked-area" | "stacked-bar" | "horizontal-bar" | "table";
export type LLMTableColumnFormat =
| "time"
| "service-chip"
| "error"
| "cost"
| "view-link"
| "text";
"time" | "service-chip" | "error" | "cost" | "view-link" | "text";
export interface LLMTableColumn {
/** Hit field used as the value source. May be omitted for "view-link". */
+1 -5
View File
@@ -29,11 +29,7 @@ export interface CreateBackfillJobResponse {
}
export type DeletionStatus =
| "not_required"
| "pending"
| "in_progress"
| "completed"
| { failed: string };
"not_required" | "pending" | "in_progress" | "completed" | { failed: string };
export interface BackfillJob {
job_id: string;
+1 -6
View File
@@ -20,12 +20,7 @@ export interface Group {
}
export type PermissionType =
| "AllowAll"
| "AllowDelete"
| "AllowGet"
| "AllowList"
| "AllowPost"
| "AllowPut";
"AllowAll" | "AllowDelete" | "AllowGet" | "AllowList" | "AllowPost" | "AllowPut";
export interface Permission {
object: string; // stream:geo or stream:org_id
+1 -2
View File
@@ -362,8 +362,7 @@ export interface RecorderPortMessage {
/** Anything the extension can post over the port (data push + command acks). */
export type RecorderPortInbound =
| RecorderPortMessage
| { type: "synthetics-response"; response: unknown };
RecorderPortMessage | { type: "synthetics-response"; response: unknown };
// ---- Bridge transport types (content-script relay, replaces chrome.runtime.*) ----
@@ -107,15 +107,7 @@ export interface ConversionContext {
* Aggregation function type for single-value charts
*/
export type AggregationFunction =
| "last"
| "first"
| "min"
| "max"
| "avg"
| "sum"
| "count"
| "range"
| "diff";
"last" | "first" | "min" | "max" | "avg" | "sum" | "count" | "range" | "diff";
/**
* Configuration options for table charts
+1 -3
View File
@@ -27,9 +27,7 @@ export interface SelectedDate {
}
export type TimeQueryParams =
| { period: string }
| { from: number | string; to: number | string }
| Record<string, never>;
{ period: string } | { from: number | string; to: number | string } | Record<string, never>;
// URL params -> selectedDate (period wins, else from/to, else relative 15m).
export const queryParamsToSelectedDate = (
+1 -7
View File
@@ -17,13 +17,7 @@ import type { I18nKey, I18nText } from "@/types/i18n";
* Prebuilt destination types
*/
export type PrebuiltTypeId =
| "slack"
| "discord"
| "msteams"
| "pagerduty"
| "servicenow"
| "email"
| "opsgenie";
"slack" | "discord" | "msteams" | "pagerduty" | "servicenow" | "email" | "opsgenie";
/**
* A user-facing validation message, expressed as an i18n KEY (+ optional
+1 -8
View File
@@ -39,14 +39,7 @@
/** Names of monaco's CompletionItemKind members that we actually use. */
export type CompletionKindName =
| "Function"
| "Keyword"
| "Operator"
| "Field"
| "Value"
| "Variable"
| "Snippet"
| "Text";
"Function" | "Keyword" | "Operator" | "Field" | "Value" | "Variable" | "Snippet" | "Text";
/** Names of monaco's CompletionItemInsertTextRule members. */
export type InsertTextRuleName = "InsertAsSnippet" | "KeepWhitespace" | "None";
@@ -35,14 +35,7 @@
/** The kind an entity is classified into. RPC is a first-class dependency. */
export type EntityKind =
| "service"
| "datastore"
| "queue"
| "external"
| "rpc"
| "agent"
| "tool"
| "model";
"service" | "datastore" | "queue" | "external" | "rpc" | "agent" | "tool" | "model";
/** The inferred types we branch on explicitly. */
export type KnownInferType = "database" | "queue" | "external" | "rpc";
@@ -416,12 +416,10 @@ export default defineComponent({
};
const previousJoins =
currentQuery.joins?.slice(0, props.joinIndex)?.map(
(join: any): StreamReference => ({
stream: join.stream,
streamAlias: join.streamAlias,
}),
) ?? [];
currentQuery.joins?.slice(0, props.joinIndex)?.map((join: any): StreamReference => ({
stream: join.stream,
streamAlias: join.streamAlias,
})) ?? [];
return [mainStream, ...previousJoins];
} catch (error) {
@@ -437,12 +435,10 @@ export default defineComponent({
try {
const response = (await getStreams(streamType, false)) as GetStreamsResponse;
streamOptions.value = response.list.map(
(stream: StreamListEntry): StreamOption => ({
label: raw(stream.name),
value: stream.name,
}),
);
streamOptions.value = response.list.map((stream: StreamListEntry): StreamOption => ({
label: raw(stream.name),
value: stream.name,
}));
// Select first stream if no stream is selected or current stream is invalid
if (streamOptions.value.length > 0) {
@@ -756,9 +756,9 @@ export default defineComponent({
}
// if variables data is null, set it to empty list
if (
!(currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length)
) {
if (!(
currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length
)) {
variablesData.isVariablesLoading = false;
variablesData.values = [];
}
+1 -1
View File
@@ -174,7 +174,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</div>
<div
ref="svcGridRef"
class="flex flex-row gap-2 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"
class="flex [scrollbar-width:none] flex-row gap-2 overflow-x-auto [&::-webkit-scrollbar]:hidden"
@scroll="onSvcScroll"
>
<div
+2 -4
View File
@@ -34,8 +34,7 @@
<OCardSection>
<pre
class="text-text-link m-0 p-3 font-mono text-sm leading-relaxed font-medium wrap-break-word whitespace-pre-wrap"
>{{ generatedQuery || t("metrics.queryBuilder.noQueryBuilt") }}</pre
>
>{{ generatedQuery || t("metrics.queryBuilder.noQueryBuilt") }}</pre>
</OCardSection>
</OCard>
@@ -74,8 +73,7 @@
<OCardSection>
<pre
class="text-text-body m-0 max-h-100 overflow-y-auto p-3 font-mono text-sm leading-relaxed wrap-break-word whitespace-pre-wrap"
>{{ queryResult }}</pre
>
>{{ queryResult }}</pre>
</OCardSection>
</OCard>
</OCardSection>
+3 -3
View File
@@ -191,9 +191,9 @@ export default defineComponent({
currentDashboardData.data = overviewDashboard;
// if variables data is null, set it to empty list
if (
!(currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length)
) {
if (!(
currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length
)) {
variablesData.isVariablesLoading = false;
variablesData.values = [];
}
+7 -9
View File
@@ -122,15 +122,13 @@ const uploadSourceMapsSchema = makeUploadSourceMapsSchema(t);
// Dynamic (query-param prefill) defaults → a typed component computed. The
// service/version/environment are seeded from the route query; `file` always
// starts empty.
const uploadSourceMapsDefaults = computed(
(): UploadSourceMapsForm => ({
service: (route.query.service as string) || "",
version: (route.query.version as string) || "",
environment: (route.query.environment as string) || "",
// Empty file slot at init; schema is `.nullable()` so null is valid at runtime.
file: null as unknown as File,
}),
);
const uploadSourceMapsDefaults = computed((): UploadSourceMapsForm => ({
service: (route.query.service as string) || "",
version: (route.query.version as string) || "",
environment: (route.query.environment as string) || "",
// Empty file slot at init; schema is `.nullable()` so null is valid at runtime.
file: null as unknown as File,
}));
// Navigate back to source maps list
const navigateBack = () => {
+2 -4
View File
@@ -284,8 +284,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
v-if="stackOpen && currentRun.errorStack"
class="text-2xs text-text-body bg-code-bg rounded-default mt-2 overflow-auto p-[10px_12px] font-mono leading-[1.6] whitespace-pre-wrap"
data-test="synthetics-run-detail-error-stack"
>{{ currentRun.errorStack }}</pre
>
>{{ currentRun.errorStack }}</pre>
</div>
</div>
</div>
@@ -479,8 +478,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
!expandedStepErrors.has(row.id) &&
(row.error?.length ?? 0) > 200,
}"
>{{ row.error }}</pre
>
>{{ row.error }}</pre>
<div class="mt-1.5 flex items-center gap-2">
<OButton
v-if="(row.error?.length ?? 0) > 200"