From 20c066ac6578a2b02f3e6c35873ad9f83442161f Mon Sep 17 00:00:00 2001 From: somebody1234 Date: Thu, 19 Dec 2024 19:26:09 +1000 Subject: [PATCH 1/9] Improve Sentry support (#11776) - Close https://github.com/enso-org/cloud-v2/issues/1590 - Add source maps to built bundle for sentry to pick up - Close https://github.com/enso-org/cloud-v2/issues/1589 - Add global Sentry filter to avoid sending 400 responses from backend - Wrap settings user and organization profile picture inputs in form - Upgrade from deprecated sentry APIs # Important Notes None --- .github/workflows/release.yml | 3 + app/gui/.gitignore | 3 + app/gui/package.json | 128 ++-- .../Inputs/HiddenFile/HiddenFile.tsx | 62 ++ .../AriaComponents/Inputs/HiddenFile/index.ts | 2 + .../components/AriaComponents/Inputs/index.ts | 1 + app/gui/src/dashboard/index.tsx | 60 +- app/gui/src/dashboard/layouts/InfoMenu.tsx | 2 +- .../OrganizationProfilePictureInput.tsx | 35 +- .../layouts/Settings/ProfilePictureInput.tsx | 33 +- app/gui/vite.config.ts | 14 + build/build/src/ci_gen.rs | 6 +- build/build/src/ci_gen/job.rs | 38 +- build/build/src/ide/web.rs | 6 + flake.nix | 5 +- pnpm-lock.yaml | 573 ++++++++---------- rust-toolchain.toml | 2 +- 17 files changed, 525 insertions(+), 448 deletions(-) create mode 100644 app/gui/src/dashboard/components/AriaComponents/Inputs/HiddenFile/HiddenFile.tsx create mode 100644 app/gui/src/dashboard/components/AriaComponents/Inputs/HiddenFile/index.ts diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index db824a4ad201..b7bde0b39e3f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -701,10 +701,13 @@ jobs: ENSO_CLOUD_ENVIRONMENT: ${{ vars.ENSO_CLOUD_ENVIRONMENT }} ENSO_CLOUD_GOOGLE_ANALYTICS_TAG: ${{ vars.ENSO_CLOUD_GOOGLE_ANALYTICS_TAG }} ENSO_CLOUD_SENTRY_DSN: ${{ vars.ENSO_CLOUD_SENTRY_DSN }} + ENSO_CLOUD_SENTRY_ORGANIZATION: ${{ vars.ENSO_CLOUD_SENTRY_ORGANIZATION }} + ENSO_CLOUD_SENTRY_PROJECT: ${{ vars.ENSO_CLOUD_SENTRY_PROJECT }} ENSO_CLOUD_STRIPE_KEY: ${{ vars.ENSO_CLOUD_STRIPE_KEY }} ENSO_IDE_AG_GRID_LICENSE_KEY: ${{ vars.ENSO_AG_GRID_LICENSE_KEY }} ENSO_IDE_MAPBOX_API_TOKEN: ${{ vars.ENSO_MAPBOX_API_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} WIN_CSC_KEY_PASSWORD: ${{ secrets.MICROSOFT_CODE_SIGNING_CERT_PASSWORD }} WIN_CSC_LINK: ${{ secrets.MICROSOFT_CODE_SIGNING_CERT }} - if: failure() && runner.os == 'Windows' diff --git a/app/gui/.gitignore b/app/gui/.gitignore index 869cec171367..a05ebb778efa 100644 --- a/app/gui/.gitignore +++ b/app/gui/.gitignore @@ -33,3 +33,6 @@ src/project-view/util/iconName.ts *storybook.log storybook-static + +# Sentry Config File +.env.sentry-build-plugin diff --git a/app/gui/package.json b/app/gui/package.json index a9df2bc70666..4a9e45f7245f 100644 --- a/app/gui/package.json +++ b/app/gui/package.json @@ -15,10 +15,13 @@ "bugs": { "url": "https://github.com/enso-org/enso/issues" }, - "//": {}, + "//": [ + "--max-old-space-size=4096 is required when sourcemaps are enabled,", + "otherwise Rollup runs out of memory when Vite is rendering chunks." + ], "scripts": { "typecheck": "vue-tsc --noEmit -p tsconfig.app.json", - "build": "vite build", + "build": "cross-env NODE_OPTIONS=--max-old-space-size=4096 vite build", "build-cloud": "cross-env CLOUD_BUILD=true corepack pnpm run build", "preview": "vite preview", "lint": "eslint . --cache --max-warnings=0", @@ -41,6 +44,11 @@ "playwright:install": "playwright install chromium" }, "dependencies": { + "@ag-grid-community/client-side-row-model": "^32.3.3", + "@ag-grid-community/core": "^32.3.3", + "@ag-grid-community/styles": "^32.3.3", + "@ag-grid-enterprise/core": "^32.3.3", + "@ag-grid-enterprise/range-selection": "^32.3.3", "@aws-amplify/auth": "5.6.5", "@aws-amplify/core": "5.8.5", "@hookform/resolvers": "^3.4.0", @@ -48,24 +56,46 @@ "@lexical/html": "^0.21.0", "@lexical/link": "^0.21.0", "@lexical/markdown": "^0.21.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.1.6", "@monaco-editor/react": "4.6.0", - "@sentry/react": "^7.74.0", + "@noble/hashes": "^1.4.0", "@react-aria/interactions": "^3.22.3", + "@sentry/react": "^7.74.0", + "@sentry/vite-plugin": "^2.22.7", "@stripe/react-stripe-js": "^2.7.1", "@stripe/stripe-js": "^3.5.0", "@tanstack/react-query": "5.55.0", "@tanstack/vue-query": ">= 5.54.0 < 5.56.0", + "@vueuse/core": "^10.4.1", + "@vueuse/gesture": "^2.0.0", + "ag-grid-community": "^32.3.3", + "ag-grid-enterprise": "^32.3.3", + "ag-grid-vue3": "^32.3.3", "ajv": "^8.12.0", "amazon-cognito-identity-js": "6.3.6", + "babel-plugin-react-compiler": "19.0.0-beta-a7bf2bd-20241110", "clsx": "^2.1.1", - "papaparse": "^5.4.1", + "codemirror": "^6.0.1", + "culori": "^3.2.0", "enso-common": "workspace:*", + "events": "^3.3.0", "framer-motion": "11.3.0", + "hash-sum": "^2.0.0", "idb-keyval": "^6.2.1", "input-otp": "1.2.4", + "install": "^0.13.0", "is-network-error": "^1.0.1", + "isomorphic-ws": "^5.0.0", "lexical": "^0.21.0", + "lib0": "^0.2.85", + "magic-string": "^0.30.3", + "marked": "14.1.3", "monaco-editor": "0.48.0", + "murmurhash": "^2.0.1", + "papaparse": "^5.4.1", + "postcss-inline-svg": "^6.0.0", + "postcss-nesting": "^12.0.1", "qrcode.react": "3.1.0", "react": "^18.3.1", "react-aria": "^3.34.3", @@ -83,15 +113,7 @@ "tiny-invariant": "^1.3.3", "ts-results": "^3.3.0", "validator": "^13.12.0", - "zod": "^3.23.8", - "zustand": "^4.5.4", - "@ag-grid-community/client-side-row-model": "^32.3.3", - "@ag-grid-community/core": "^32.3.3", - "@ag-grid-community/styles": "^32.3.3", - "@ag-grid-enterprise/core": "^32.3.3", - "@ag-grid-enterprise/range-selection": "^32.3.3", "@babel/parser": "^7.24.7", - "babel-plugin-react-compiler": "19.0.0-beta-a7bf2bd-20241110", "@codemirror/commands": "^6.7.1", "@codemirror/language": "^6.10.6", "@codemirror/lang-markdown": "^v6.3.0", @@ -101,25 +123,6 @@ "@codemirror/view": "^6.35.3", "@fast-check/vitest": "^0.0.8", "@floating-ui/vue": "^1.0.6", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.1.6", - "@noble/hashes": "^1.4.0", - "@vueuse/core": "^10.4.1", - "@vueuse/gesture": "^2.0.0", - "ag-grid-community": "^32.3.3", - "ag-grid-enterprise": "^32.3.3", - "ag-grid-vue3": "^32.3.3", - "codemirror": "^6.0.1", - "culori": "^3.2.0", - "events": "^3.3.0", - "hash-sum": "^2.0.0", - "install": "^0.13.0", - "isomorphic-ws": "^5.0.0", - "lib0": "^0.2.85", - "magic-string": "^0.30.3", - "murmurhash": "^2.0.1", - "postcss-inline-svg": "^6.0.0", - "postcss-nesting": "^12.0.1", "sucrase": "^3.34.0", "veaury": "^2.3.18", "vue": "^3.5.2", @@ -129,14 +132,19 @@ "y-websocket": "^1.5.0", "ydoc-shared": "workspace:*", "yjs": "^13.6.7", - "marked": "14.1.3" + "zod": "^3.23.8", + "zustand": "^4.5.4" }, "devDependencies": { + "@babel/plugin-syntax-import-attributes": "^7.24.7", "@chromatic-com/storybook": "^3.2.2", + "@codemirror/theme-one-dark": "^6.1.2", + "@danmarshall/deckgl-typings": "^4.9.28", "@fast-check/vitest": "^0.0.8", + "@histoire/plugin-vue": "^0.17.12", "@modyfi/vite-plugin-yaml": "^1.0.4", + "@open-rpc/server-js": "^1.9.4", "@playwright/test": "^1.40.0", - "@babel/plugin-syntax-import-attributes": "^7.24.7", "@react-types/shared": "^3.22.1", "@storybook/addon-essentials": "^8.4.2", "@storybook/addon-interactions": "^8.4.2", @@ -148,30 +156,10 @@ "@storybook/vue3": "^8.4.2", "@storybook/vue3-vite": "^8.4.2", "@tanstack/react-query-devtools": "5.45.1", - "@types/node": "^22.9.0", - "@types/papaparse": "^5.3.15", - "@types/react": "^18.0.27", - "@types/react-dom": "^18.0.10", - "@types/validator": "^13.11.7", - "@vitejs/plugin-react": "^4.3.3", - "chalk": "^5.3.0", - "cross-env": "^7.0.3", - "fast-check": "^3.15.0", - "playwright": "^1.39.0", - "postcss": "^8.4.29", - "prettier-plugin-organize-imports": "^4.0.0", - "prettier-plugin-tailwindcss": "^0.5.11", - "react-toastify": "^9.1.3", - "tailwindcss": "^3.4.1", - "tailwindcss-animate": "1.0.7", - "tailwindcss-react-aria-components": "^1.1.1", - "typescript": "^5.5.3", - "vite": "^5.4.10", - "vitest": "^1.3.1", - "@codemirror/theme-one-dark": "^6.1.2", - "@danmarshall/deckgl-typings": "^4.9.28", - "@histoire/plugin-vue": "^0.17.12", - "@open-rpc/server-js": "^1.9.4", + "@testing-library/jest-dom": "6.6.3", + "@testing-library/react": "16.0.1", + "@testing-library/react-hooks": "8.0.1", + "@testing-library/user-event": "14.5.2", "@tsconfig/node20": "^20.1.4", "@types/css.escape": "^1.5.2", "@types/culori": "^2.0.1", @@ -179,37 +167,53 @@ "@types/hash-sum": "^1.0.0", "@types/jsdom": "^21.1.1", "@types/mapbox-gl": "^3.4.1", + "@types/node": "^22.9.0", + "@types/papaparse": "^5.3.15", + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", "@types/shuffle-seed": "^1.1.0", "@types/tar": "^6.1.4", + "@types/validator": "^13.11.7", "@types/wicg-file-system-access": "^2023.10.2", "@types/ws": "^8.5.5", + "@vitejs/plugin-react": "^4.3.3", "@vitejs/plugin-vue": "^5.0.4", "@vitest/coverage-v8": "^1.3.1", "@vue/test-utils": "^2.4.6", "@vue/tsconfig": "^0.5.1", - "@testing-library/jest-dom": "6.6.3", - "@testing-library/react": "16.0.1", - "@testing-library/user-event": "14.5.2", - "@testing-library/react-hooks": "8.0.1", + "chalk": "^5.3.0", + "chromatic": "11.18.1", + "cross-env": "^7.0.3", "css.escape": "^1.5.1", "d3": "^7.4.0", "enso-common": "workspace:*", + "fast-check": "^3.15.0", "floating-vue": "^2.0.0-beta.24", "hash-wasm": "^4.11.0", "histoire": "^0.17.2", "jsdom": "^24.1.0", + "playwright": "^1.39.0", + "postcss": "^8.4.29", "postcss-nesting": "^12.0.1", "prettier": "^3.3.2", + "prettier-plugin-organize-imports": "^4.0.0", + "prettier-plugin-tailwindcss": "^0.5.11", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-toastify": "^9.1.3", "shuffle-seed": "^1.1.6", "sql-formatter": "^13.0.0", "storybook": "^8.4.2", - "chromatic": "11.18.1", + "tailwindcss": "^3.4.1", + "tailwindcss-animate": "1.0.7", + "tailwindcss-react-aria-components": "^1.1.1", "tar": "^6.2.1", "tsx": "^4.7.1", + "typescript": "^5.5.3", + "vite": "^5.4.10", "vite-plugin-vue-devtools": "7.6.3", "vite-plugin-wasm": "^3.3.0", + "vitest": "^1.3.1", "vue-react-wrapper": "^0.3.1", "vue-tsc": "^2.0.24", "yaml": "^2.4.5", diff --git a/app/gui/src/dashboard/components/AriaComponents/Inputs/HiddenFile/HiddenFile.tsx b/app/gui/src/dashboard/components/AriaComponents/Inputs/HiddenFile/HiddenFile.tsx new file mode 100644 index 000000000000..25f128cc665d --- /dev/null +++ b/app/gui/src/dashboard/components/AriaComponents/Inputs/HiddenFile/HiddenFile.tsx @@ -0,0 +1,62 @@ +/** @file A hidden file input. */ +import { + Form, + type FieldPath, + type FieldProps, + type FieldStateProps, + type FieldValues, + type FieldVariantProps, + type TSchema, +} from '#/components/AriaComponents' +import { Input, type InputProps } from '#/components/aria' + +/** Props for {@link HiddenFile}. */ +export interface HiddenFileProps> + extends FieldStateProps< + Omit & { value: FieldValues[TFieldName] }, + Schema, + TFieldName + >, + FieldProps, + FieldVariantProps { + /** When true, triggers `form.submit()` on input. */ + readonly autoSubmit?: boolean | undefined + readonly accept?: string | undefined +} + +/** A hidden file input. */ +export function HiddenFile>( + props: HiddenFileProps, +) { + const { + form, + autoSubmit = false, + accept, + // eslint-disable-next-line @typescript-eslint/naming-convention + defaultValue: _defaultValue, + // eslint-disable-next-line @typescript-eslint/naming-convention + disabled: _disabled, + ...inputProps + } = props + const formInstance = Form.useFormContext(form) + + return ( + ( + { + field.onChange(event.target.files?.[0]) + if (autoSubmit) { + void formInstance.submit() + } + }} + /> + )} + /> + ) +} diff --git a/app/gui/src/dashboard/components/AriaComponents/Inputs/HiddenFile/index.ts b/app/gui/src/dashboard/components/AriaComponents/Inputs/HiddenFile/index.ts new file mode 100644 index 000000000000..c9ee0ea0d5e9 --- /dev/null +++ b/app/gui/src/dashboard/components/AriaComponents/Inputs/HiddenFile/index.ts @@ -0,0 +1,2 @@ +/** @file Barrel file for HiddenFile component. */ +export * from './HiddenFile' diff --git a/app/gui/src/dashboard/components/AriaComponents/Inputs/index.ts b/app/gui/src/dashboard/components/AriaComponents/Inputs/index.ts index 6068480cc284..4e5093094feb 100644 --- a/app/gui/src/dashboard/components/AriaComponents/Inputs/index.ts +++ b/app/gui/src/dashboard/components/AriaComponents/Inputs/index.ts @@ -7,6 +7,7 @@ export * from './ComboBox' export * from './DatePicker' export * from './Dropdown' +export * from './HiddenFile' export * from './Input' export * from './MultiSelector' export * from './OTPInput' diff --git a/app/gui/src/dashboard/index.tsx b/app/gui/src/dashboard/index.tsx index 41e083c90cda..939f96bd67a9 100644 --- a/app/gui/src/dashboard/index.tsx +++ b/app/gui/src/dashboard/index.tsx @@ -3,12 +3,17 @@ * * This module declares the main DOM structure for the authentication/dashboard app. */ -import * as React from 'react' +import { startTransition, StrictMode, useEffect } from 'react' import * as sentry from '@sentry/react' import { QueryClientProvider } from '@tanstack/react-query' import * as reactDOM from 'react-dom/client' -import * as reactRouter from 'react-router-dom' +import { + createRoutesFromChildren, + matchRoutes, + useLocation, + useNavigationType, +} from 'react-router-dom' import invariant from 'tiny-invariant' import * as detect from 'enso-common/src/detect' @@ -32,6 +37,9 @@ import { MotionGlobalConfig } from 'framer-motion' export type { GraphEditorRunner } from '#/layouts/Editor' +const HTTP_STATUS_BAD_REQUEST = 400 +const API_HOST = + process.env.ENSO_CLOUD_API_URL != null ? new URL(process.env.ENSO_CLOUD_API_URL).host : null const ARE_ANIMATIONS_DISABLED = window.DISABLE_ANIMATIONS === true || localStorage.getItem('disableAnimations') === 'true' || @@ -54,23 +62,15 @@ const ROOT_ELEMENT_ID = 'enso-dashboard' /** The fraction of non-erroring interactions that should be sampled by Sentry. */ const SENTRY_SAMPLE_RATE = 0.005 -// ====================== -// === DashboardProps === -// ====================== - /** Props for the dashboard. */ export interface DashboardProps extends app.AppProps { readonly logger: Logger } -// =========== -// === run === -// =========== - /** * Entrypoint for the authentication/dashboard app. * - * Running this function finds a `div` element with the ID `dashboard`, and renders the + * Running this function finds a `div` element with the ID `enso-dashboard`, and renders the * authentication/dashboard UI using React. It also handles routing and other interactions (e.g., * for redirecting the user to/from the login page). */ @@ -81,18 +81,18 @@ export function run(props: DashboardProps) { process.env.ENSO_CLOUD_SENTRY_DSN != null && process.env.ENSO_CLOUD_API_URL != null ) { + const version: unknown = import.meta.env.ENSO_IDE_VERSION sentry.init({ dsn: process.env.ENSO_CLOUD_SENTRY_DSN, environment: process.env.ENSO_CLOUD_ENVIRONMENT, + release: version?.toString() ?? 'dev', integrations: [ - new sentry.BrowserTracing({ - routingInstrumentation: sentry.reactRouterV6Instrumentation( - React.useEffect, - reactRouter.useLocation, - reactRouter.useNavigationType, - reactRouter.createRoutesFromChildren, - reactRouter.matchRoutes, - ), + sentry.reactRouterV6BrowserTracingIntegration({ + useEffect, + useLocation, + useNavigationType, + createRoutesFromChildren, + matchRoutes, }), sentry.extraErrorDataIntegration({ captureErrorCause: true }), sentry.replayIntegration(), @@ -103,6 +103,22 @@ export function run(props: DashboardProps) { tracePropagationTargets: [process.env.ENSO_CLOUD_API_URL.split('//')[1] ?? ''], replaysSessionSampleRate: SENTRY_SAMPLE_RATE, replaysOnErrorSampleRate: 1.0, + beforeSend: (event) => { + if ( + (event.breadcrumbs ?? []).some( + (breadcrumb) => + breadcrumb.type === 'http' && + breadcrumb.category === 'fetch' && + breadcrumb.data && + breadcrumb.data.status_code === HTTP_STATUS_BAD_REQUEST && + typeof breadcrumb.data.url === 'string' && + new URL(breadcrumb.data.url).host === API_HOST, + ) + ) { + return null + } + return event + }, }) } @@ -123,9 +139,9 @@ export function run(props: DashboardProps) { const httpClient = new HttpClient() - React.startTransition(() => { + startTransition(() => { reactDOM.createRoot(root).render( - + @@ -143,7 +159,7 @@ export function run(props: DashboardProps) { - , + , ) }) } diff --git a/app/gui/src/dashboard/layouts/InfoMenu.tsx b/app/gui/src/dashboard/layouts/InfoMenu.tsx index 982c76558236..05b39b9db017 100644 --- a/app/gui/src/dashboard/layouts/InfoMenu.tsx +++ b/app/gui/src/dashboard/layouts/InfoMenu.tsx @@ -28,7 +28,7 @@ export default function InfoMenu(props: InfoMenuProps) { const { getText } = useText() return ( - +
{PRODUCT_NAME} diff --git a/app/gui/src/dashboard/layouts/Settings/OrganizationProfilePictureInput.tsx b/app/gui/src/dashboard/layouts/Settings/OrganizationProfilePictureInput.tsx index d94d8a81407f..aab02fcd1895 100644 --- a/app/gui/src/dashboard/layouts/Settings/OrganizationProfilePictureInput.tsx +++ b/app/gui/src/dashboard/layouts/Settings/OrganizationProfilePictureInput.tsx @@ -1,18 +1,16 @@ /** @file The input for viewing and changing the organization's profile picture. */ -import * as React from 'react' - import { useMutation } from '@tanstack/react-query' import DefaultUserIcon from '#/assets/default_user.svg' import { backendMutationOptions, useBackendQuery } from '#/hooks/backendHooks' -import * as toastAndLogHooks from '#/hooks/toastAndLogHooks' import * as textProvider from '#/providers/TextProvider' import * as aria from '#/components/aria' import FocusRing from '#/components/styled/FocusRing' +import { Form, HiddenFile } from '#/components/AriaComponents' import type Backend from '#/services/Backend' // ======================================= @@ -29,28 +27,22 @@ export default function OrganizationProfilePictureInput( props: OrganizationProfilePictureInputProps, ) { const { backend } = props - const toastAndLog = toastAndLogHooks.useToastAndLog() const { getText } = textProvider.useText() const { data: organization } = useBackendQuery(backend, 'getOrganization', []) const uploadOrganizationPicture = useMutation( backendMutationOptions(backend, 'uploadOrganizationPicture'), - ).mutate + ) - const doUploadOrganizationPicture = (event: React.ChangeEvent) => { - const image = event.target.files?.[0] - if (image == null) { - toastAndLog('noNewProfilePictureError') - } else { - uploadOrganizationPicture([{ fileName: image.name }, image]) - } - // Reset selected files, otherwise the file input will do nothing if the same file is - // selected again. While technically not undesired behavior, it is unintuitive for the user. - event.target.value = '' - } + const form = Form.useForm({ + schema: (z) => z.object({ picture: z.instanceof(File) }), + onSubmit: async ({ picture }) => { + await uploadOrganizationPicture.mutateAsync([{ fileName: picture.name }, picture]) + }, + }) return ( - <> +
- + {getText('organizationProfilePictureWarning')} - +
) } diff --git a/app/gui/src/dashboard/layouts/Settings/ProfilePictureInput.tsx b/app/gui/src/dashboard/layouts/Settings/ProfilePictureInput.tsx index 2ed6b0cf9d82..50e1deb8f46c 100644 --- a/app/gui/src/dashboard/layouts/Settings/ProfilePictureInput.tsx +++ b/app/gui/src/dashboard/layouts/Settings/ProfilePictureInput.tsx @@ -6,13 +6,13 @@ import { useMutation } from '@tanstack/react-query' import DefaultUserIcon from '#/assets/default_user.svg' import { backendMutationOptions, useBackendQuery } from '#/hooks/backendHooks' -import * as toastAndLogHooks from '#/hooks/toastAndLogHooks' import * as textProvider from '#/providers/TextProvider' import * as aria from '#/components/aria' import FocusRing from '#/components/styled/FocusRing' +import { Form, HiddenFile } from '#/components/AriaComponents' import type Backend from '#/services/Backend' // =========================== @@ -27,26 +27,20 @@ export interface ProfilePictureInputProps { /** The input for viewing and changing the user's profile picture. */ export default function ProfilePictureInput(props: ProfilePictureInputProps) { const { backend } = props - const toastAndLog = toastAndLogHooks.useToastAndLog() const { data: user } = useBackendQuery(backend, 'usersMe', []) const { getText } = textProvider.useText() - const uploadUserPicture = useMutation(backendMutationOptions(backend, 'uploadUserPicture')).mutate + const uploadUserPicture = useMutation(backendMutationOptions(backend, 'uploadUserPicture')) - const doUploadUserPicture = (event: React.ChangeEvent) => { - const image = event.target.files?.[0] - if (image == null) { - toastAndLog('noNewProfilePictureError') - } else { - uploadUserPicture([{ fileName: image.name }, image]) - } - // Reset selected files, otherwise the file input will do nothing if the same file is - // selected again. While technically not undesired behavior, it is unintuitive for the user. - event.target.value = '' - } + const form = Form.useForm({ + schema: (z) => z.object({ picture: z.instanceof(File) }), + onSubmit: async ({ picture }) => { + await uploadUserPicture.mutateAsync([{ fileName: picture.name }, picture]) + }, + }) return ( - <> +
- + {getText('profilePictureWarning')} - +
) } diff --git a/app/gui/vite.config.ts b/app/gui/vite.config.ts index 63a2eb7df915..ccfbe678d8fc 100644 --- a/app/gui/vite.config.ts +++ b/app/gui/vite.config.ts @@ -1,3 +1,4 @@ +import { sentryVitePlugin } from '@sentry/vite-plugin' /// import react from '@vitejs/plugin-react' @@ -67,6 +68,18 @@ export default defineConfig({ }, }), ...(process.env.NODE_ENV === 'development' ? [await projectManagerShim()] : []), + ...(( + process.env.SENTRY_AUTH_TOKEN != null && + process.env.ENSO_CLOUD_SENTRY_ORGANIZATION != null && + process.env.ENSO_CLOUD_SENTRY_PROJECT != null + ) ? + [ + sentryVitePlugin({ + org: process.env.ENSO_CLOUD_SENTRY_ORGANIZATION, + project: process.env.ENSO_CLOUD_SENTRY_PROJECT, + }), + ] + : []), ], optimizeDeps: { entries: fileURLToPath(new URL('./index.html', import.meta.url)), @@ -109,6 +122,7 @@ export default defineConfig({ build: { // dashboard chunk size is larger than the default warning limit chunkSizeWarningLimit: 700, + sourcemap: true, }, }) async function projectManagerShim(): Promise { diff --git a/build/build/src/ci_gen.rs b/build/build/src/ci_gen.rs index 21b82493be98..6163c84baf54 100644 --- a/build/build/src/ci_gen.rs +++ b/build/build/src/ci_gen.rs @@ -150,6 +150,10 @@ pub mod secret { // === Github Token === /// A token created for the `enso-ci` user. pub const CI_PRIVATE_TOKEN: &str = "CI_PRIVATE_TOKEN"; + + // === Sentry === + /// The authentication token for pushing source maps to Sentry. + pub const SENTRY_AUTH_TOKEN: &str = "SENTRY_AUTH_TOKEN"; } pub mod variables { @@ -446,7 +450,7 @@ impl JobArchetype for UploadIde { "ide upload --backend-source release --backend-release ${{env.ENSO_RELEASE_ID}} --sign-artifacts", ) .cleaning(RELEASE_CLEANING_POLICY) - .customize(with_packaging_steps(target.0)) + .customize(with_packaging_steps(target.0, job::PackagingTarget::Release)) .build_job("Build IDE", target) } } diff --git a/build/build/src/ci_gen/job.rs b/build/build/src/ci_gen/job.rs index 8903b5e0a64f..390f83168306 100644 --- a/build/build/src/ci_gen/job.rs +++ b/build/build/src/ci_gen/job.rs @@ -154,6 +154,18 @@ pub fn expose_gui_vars(step: Step) -> Step { expose_cloud_vars(step) } +/// Expose variables for debugging purposes. +pub fn expose_debugging_vars(os: OS, step: Step) -> Step { + use crate::ide::web::env::*; + match os { + OS::Windows => step + .with_secret_exposed(secret::SENTRY_AUTH_TOKEN) + .with_variable_exposed(ENSO_CLOUD_SENTRY_ORGANIZATION) + .with_variable_exposed(ENSO_CLOUD_SENTRY_PROJECT), + _ => step, + } +} + #[derive(Clone, Copy, Debug)] pub struct CancelWorkflow; @@ -552,13 +564,28 @@ pub fn expose_os_specific_signing_secret(os: OS, step: Step) -> Step { } } +/// Whether the artifact is being built for a release build (nightlies, releases) +/// or a development build (PRs). +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum PackagingTarget { + /// The artifact is being built for a release build (nightlies, releases). + Development, + /// The artifact is being built for a development build (PRs). + Release, +} + /// Prepares the packaging steps for the given OS. /// /// This involves: /// * exposing secrets necessary for code signing and notarization; /// * exposing variables defining cloud environment for dashboard. -pub fn prepare_packaging_steps(os: OS, step: Step) -> Vec { +pub fn prepare_packaging_steps(os: OS, step: Step, packaging_target: PackagingTarget) -> Vec { let step = expose_gui_vars(step); + let step = if packaging_target == PackagingTarget::Release { + expose_debugging_vars(os, step) + } else { + step + }; let step = expose_os_specific_signing_secret(os, step); vec![step] } @@ -566,8 +593,11 @@ pub fn prepare_packaging_steps(os: OS, step: Step) -> Vec { /// Convenience for [`prepare_packaging_steps`]. /// /// This function is useful when you want to use [`prepare_packaging_steps`] as a closure. -pub fn with_packaging_steps(os: OS) -> impl FnOnce(Step) -> Vec { - move |step| prepare_packaging_steps(os, step) +pub fn with_packaging_steps( + os: OS, + packaging_target: PackagingTarget, +) -> impl FnOnce(Step) -> Vec { + move |step| prepare_packaging_steps(os, step, packaging_target) } #[derive(Clone, Copy, Debug)] @@ -579,7 +609,7 @@ impl JobArchetype for PackageIde { "ide build --backend-source current-ci-run --gui-upload-artifact false", ) .customize(move |step| { - let mut steps = prepare_packaging_steps(target.0, step); + let mut steps = prepare_packaging_steps(target.0, step, PackagingTarget::Development); const TEST_COMMAND: &str = "corepack pnpm -r --filter enso exec playwright test"; let test_step = match target.0 { OS::Linux => shell(format!("xvfb-run {TEST_COMMAND}")) diff --git a/build/build/src/ide/web.rs b/build/build/src/ide/web.rs index 1b80c281ce9a..57a9ae5ec8f2 100644 --- a/build/build/src/ide/web.rs +++ b/build/build/src/ide/web.rs @@ -86,6 +86,12 @@ pub mod env { /// The Google Analytics tag to which Google Analytics events should be sent. ENSO_CLOUD_GOOGLE_ANALYTICS_TAG, String; + + /// The Sentry organization to push the source maps to. + ENSO_CLOUD_SENTRY_ORGANIZATION, String; + + /// The Sentry project to push the source maps to. + ENSO_CLOUD_SENTRY_PROJECT, String; } // GUI-specific environment variables diff --git a/flake.nix b/flake.nix index 35e168b73f8c..2b94a95f5287 100644 --- a/flake.nix +++ b/flake.nix @@ -30,6 +30,9 @@ buildInputs = with pkgs; [ # === Graal dependencies === libxcrypt-legacy + # === Rust dependencies === + openssl.dev + pkg-config ] ++ (if !isOnLinux then [ # === macOS-specific dependencies === darwin.apple_sdk.frameworks.IOKit # Required by `enso-formatter`. @@ -55,7 +58,7 @@ # `sccache` can be used to speed up compile times for Rust crates. # `~/.cargo/bin/sccache` is provided by `cargo install sccache`. # `~/.cargo/bin` must be in the `PATH` for the binary to be accessible. - export PATH=$SHIMS_PATH:${rust.out}:$HOME/.cargo/bin:$PATH + export PATH=$SHIMS_PATH:$HOME/.cargo/bin:$PATH export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath buildInputs}:$LD_LIBRARY_PATH" # `rustup` shim diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d006e6f2eff..95232e097053 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -123,7 +123,7 @@ importers: version: 5.8.5 '@babel/parser': specifier: ^7.24.7 - version: 7.25.6 + version: 7.26.2 '@codemirror/commands': specifier: ^6.7.1 version: 6.7.1 @@ -184,6 +184,9 @@ importers: '@sentry/react': specifier: ^7.74.0 version: 7.118.0(react@18.3.1) + '@sentry/vite-plugin': + specifier: ^2.22.7 + version: 2.22.7 '@stripe/react-stripe-js': specifier: ^2.7.1 version: 2.7.2(@stripe/stripe-js@3.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -345,7 +348,7 @@ importers: version: 3.5.2(typescript@5.5.3) vue-component-type-helpers: specifier: ^2.0.29 - version: 2.0.29 + version: 2.1.10 y-protocols: specifier: ^1.0.5 version: 1.0.6(yjs@13.6.18) @@ -397,7 +400,7 @@ importers: version: 3.25.0(react@18.3.1) '@storybook/addon-essentials': specifier: ^8.4.2 - version: 8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2)) + version: 8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2))(webpack-sources@3.2.3) '@storybook/addon-interactions': specifier: ^8.4.2 version: 8.4.2(storybook@8.4.2(prettier@3.3.2)) @@ -412,7 +415,7 @@ importers: version: 8.4.2(@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2))(typescript@5.5.3) '@storybook/react-vite': specifier: ^8.4.2 - version: 8.4.2(@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.24.0)(storybook@8.4.2(prettier@3.3.2))(typescript@5.5.3)(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1)) + version: 8.4.2(@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.24.0)(storybook@8.4.2(prettier@3.3.2))(typescript@5.5.3)(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(webpack-sources@3.2.3) '@storybook/test': specifier: ^8.4.2 version: 8.4.2(storybook@8.4.2(prettier@3.3.2)) @@ -421,7 +424,7 @@ importers: version: 8.4.2(storybook@8.4.2(prettier@3.3.2))(vue@3.5.2(typescript@5.5.3)) '@storybook/vue3-vite': specifier: ^8.4.2 - version: 8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(vue@3.5.2(typescript@5.5.3)) + version: 8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(vue@3.5.2(typescript@5.5.3))(webpack-sources@3.2.3) '@tanstack/react-query-devtools': specifier: 5.45.1 version: 5.45.1(@tanstack/react-query@5.55.0(react@18.3.1))(react@18.3.1) @@ -1145,10 +1148,6 @@ packages: resolution: {integrity: sha512-4s0vYfMUn74XLn13rUUhNsmuPMh0j1d4rF58wXtjlVUU78THxonnN8mbCLC48fI3fKDHTmDDkeEqy7+IWP9VyA==} engines: {node: '>= 10.0.0'} - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -1161,18 +1160,10 @@ packages: resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.6': - resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.26.2': resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.24.7': - resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} - engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} @@ -1181,30 +1172,12 @@ packages: resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.24.7': - resolution: {integrity: sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-create-class-features-plugin@7.25.9': resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-environment-visitor@7.24.7': - resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-function-name@7.24.7': - resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.24.7': - resolution: {integrity: sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==} - engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.25.9': resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} @@ -1223,28 +1196,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.24.7': - resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} - engines: {node: '>=6.9.0'} - '@babel/helper-optimise-call-expression@7.25.9': resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.7': - resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} - engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.25.9': resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} - '@babel/helper-replace-supers@7.24.7': - resolution: {integrity: sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.25.9': resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} engines: {node: '>=6.9.0'} @@ -1255,30 +1214,14 @@ packages: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.7': - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} @@ -1291,15 +1234,6 @@ packages: resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.25.6': - resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.26.2': resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} engines: {node: '>=6.0.0'} @@ -1369,26 +1303,14 @@ packages: resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} - engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.6': - resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.9': resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.6': - resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} - engines: {node: '>=6.9.0'} - '@babel/types@7.26.0': resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} @@ -2732,10 +2654,64 @@ packages: resolution: {integrity: sha512-dERAshKlQLrBscHSarhHyUeGsu652bDTUN1FK0m4e3X48M3I5/s+0N880Qjpe5MprNLcINlaIgdQ9jkisvxjfw==} engines: {node: '>=8'} + '@sentry/babel-plugin-component-annotate@2.22.7': + resolution: {integrity: sha512-aa7XKgZMVl6l04NY+3X7BP7yvQ/s8scn8KzQfTLrGRarziTlMGrsCOBQtCNWXOPEbtxAIHpZ9dsrAn5EJSivOQ==} + engines: {node: '>= 14'} + '@sentry/browser@7.118.0': resolution: {integrity: sha512-8onDOFV1VLEoBuqA5yaJeR3FF1JNuxr5C7p1oN3OwY724iTVqQnOLmZKZaSnHV3RkY67wKDGQkQIie14sc+42g==} engines: {node: '>=8'} + '@sentry/bundler-plugin-core@2.22.7': + resolution: {integrity: sha512-ouQh5sqcB8vsJ8yTTe0rf+iaUkwmeUlGNFi35IkCFUQlWJ22qS6OfvNjOqFI19e6eGUXks0c/2ieFC4+9wJ+1g==} + engines: {node: '>= 14'} + + '@sentry/cli-darwin@2.39.1': + resolution: {integrity: sha512-kiNGNSAkg46LNGatfNH5tfsmI/kCAaPA62KQuFZloZiemTNzhy9/6NJP8HZ/GxGs8GDMxic6wNrV9CkVEgFLJQ==} + engines: {node: '>=10'} + os: [darwin] + + '@sentry/cli-linux-arm64@2.39.1': + resolution: {integrity: sha512-5VbVJDatolDrWOgaffsEM7znjs0cR8bHt9Bq0mStM3tBolgAeSDHE89NgHggfZR+DJ2VWOy4vgCwkObrUD6NQw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd] + + '@sentry/cli-linux-arm@2.39.1': + resolution: {integrity: sha512-DkENbxyRxUrfLnJLXTA4s5UL/GoctU5Cm4ER1eB7XN7p9WsamFJd/yf2KpltkjEyiTuplv0yAbdjl1KX3vKmEQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd] + + '@sentry/cli-linux-i686@2.39.1': + resolution: {integrity: sha512-pXWVoKXCRrY7N8vc9H7mETiV9ZCz+zSnX65JQCzZxgYrayQPJTc+NPRnZTdYdk5RlAupXaFicBI2GwOCRqVRkg==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd] + + '@sentry/cli-linux-x64@2.39.1': + resolution: {integrity: sha512-IwayNZy+it7FWG4M9LayyUmG1a/8kT9+/IEm67sT5+7dkMIMcpmHDqL8rWcPojOXuTKaOBBjkVdNMBTXy0mXlA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd] + + '@sentry/cli-win32-i686@2.39.1': + resolution: {integrity: sha512-NglnNoqHSmE+Dz/wHeIVRnV2bLMx7tIn3IQ8vXGO5HWA2f8zYJGktbkLq1Lg23PaQmeZLPGlja3gBQfZYSG10Q==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + + '@sentry/cli-win32-x64@2.39.1': + resolution: {integrity: sha512-xv0R2CMf/X1Fte3cMWie1NXuHmUyQPDBfCyIt6k6RPFPxAYUgcqgMPznYwVMwWEA1W43PaOkSn3d8ZylsDaETw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@sentry/cli@2.39.1': + resolution: {integrity: sha512-JIb3e9vh0+OmQ0KxmexMXg9oZsR/G7HMwxt5BUIKAXZ9m17Xll4ETXTRnRUBT3sf7EpNGAmlQk1xEmVN9pYZYQ==} + engines: {node: '>= 10'} + hasBin: true + '@sentry/core@7.118.0': resolution: {integrity: sha512-ol0xBdp3/K11IMAYSQE0FMxBOOH9hMsb/rjxXWe0hfM5c72CqYWL3ol7voPci0GELJ5CZG+9ImEU1V9r6gK64g==} engines: {node: '>=8'} @@ -2762,6 +2738,10 @@ packages: resolution: {integrity: sha512-43qItc/ydxZV1Zb3Kn2M54RwL9XXFa3IAYBO8S82Qvq5YUYmU2AmJ1jgg7DabXlVSWgMA1HntwqnOV3JLaEnTQ==} engines: {node: '>=8'} + '@sentry/vite-plugin@2.22.7': + resolution: {integrity: sha512-sYRNiNm4toQGq2BfZSJPdw36em3eQaLu+3NTFpA7Hl4g3Sp2Rt3CYObnW5bxlFEruRhxzvdyB383N9OefVZ6KA==} + engines: {node: '>= 14'} + '@shaderfrog/glsl-parser@2.1.5': resolution: {integrity: sha512-fw7U8Y7BBV9NZVLs7lyM8lpQ9YUK7XBNJjN4HhkY3nqkKpSiIQ62PVtPYtW7uZME5072QXQNQBhHJzG3t+NH0w==} engines: {node: '>=16'} @@ -3453,21 +3433,12 @@ packages: '@vitest/utils@2.1.4': resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} - '@volar/language-core@2.4.0-alpha.12': - resolution: {integrity: sha512-Dj9qTifcGGgzFLfMbU5dCo13kHyNuEyvPJhtWDnoVBBmgwW3GMwFmgWnNxBhjf63m5x0gux1okaxX2CLN7qSww==} - '@volar/language-core@2.4.10': resolution: {integrity: sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==} - '@volar/source-map@2.4.0-alpha.12': - resolution: {integrity: sha512-LXATFSj4D7T9sEm7FFj6iBgHjKjrdhAgRPcechVKiNCMQdr3r3GVkkeu8aM+1peaMH3LsCqoDxVZEmh2r7CHiw==} - '@volar/source-map@2.4.10': resolution: {integrity: sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==} - '@volar/typescript@2.4.0-alpha.12': - resolution: {integrity: sha512-mLg+OQauMTv/+08a7WBWJo1sev/wc8t2is0zhBZIlFU+j5mG89FM4+4089c2p/zoUFZ400Q/VNg2BPfhpZ8wSA==} - '@volar/typescript@2.4.10': resolution: {integrity: sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==} @@ -3595,10 +3566,12 @@ packages: abstract-leveldown@6.2.3: resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==} engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) abstract-leveldown@6.3.0: resolution: {integrity: sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==} engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -3614,11 +3587,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -4478,6 +4446,7 @@ packages: deferred-leveldown@5.3.0: resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==} engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} @@ -4600,6 +4569,10 @@ packages: dotenv-expand@5.1.0: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dotenv@9.0.2: resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} engines: {node: '>=10'} @@ -5167,6 +5140,10 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} @@ -5733,11 +5710,6 @@ packages: canvas: optional: true - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -5836,6 +5808,7 @@ packages: level-js@5.0.2: resolution: {integrity: sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==} + deprecated: Superseded by browser-level (https://github.com/Level/community#faq) level-packager@5.1.1: resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==} @@ -5852,10 +5825,12 @@ packages: leveldown@5.6.0: resolution: {integrity: sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==} engines: {node: '>=8.6.0'} + deprecated: Superseded by classic-level (https://github.com/Level/community#faq) levelup@4.4.0: resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==} engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -6036,6 +6011,10 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + magicast@0.3.4: resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} @@ -6147,6 +6126,10 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.1: resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} engines: {node: '>=16 || 14 >=14.17'} @@ -6773,6 +6756,9 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} @@ -7558,10 +7544,6 @@ packages: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - to-ico@1.1.5: resolution: {integrity: sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg==} engines: {node: '>=4'} @@ -7734,6 +7716,9 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin@1.0.1: + resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} + unplugin@1.15.0: resolution: {integrity: sha512-jTPIs63W+DUEDW207ztbaoO7cQ4p5aVaB823LSlxpsFEU3Mykwxf3ZGC/wzxFJeZlASZYgVrWeo7LgOrqJZ8RA==} engines: {node: '>=14.0.0'} @@ -7949,9 +7934,6 @@ packages: typescript: optional: true - vue-component-type-helpers@2.0.29: - resolution: {integrity: sha512-58i+ZhUAUpwQ+9h5Hck0D+jr1qbYl4voRt5KffBx8qzELViQ4XdT/Tuo+mzq8u63teAG8K0lLaOiL5ofqW38rg==} - vue-component-type-helpers@2.1.10: resolution: {integrity: sha512-lfgdSLQKrUmADiSV6PbBvYgQ33KF3Ztv6gP85MfGaGaSGMTXORVaHT1EHfsqCgzRNBstPKYDmvAV9Do5CmJ07A==} @@ -8024,6 +8006,13 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} @@ -8626,11 +8615,6 @@ snapshots: '@aws-sdk/util-buffer-from': 3.6.1 tslib: 2.6.3 - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.1.0 - '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -8642,15 +8626,15 @@ snapshots: '@babel/core@7.25.2': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helpers': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 convert-source-map: 2.0.0 debug: 4.3.7 gensync: 1.0.0-beta.2 @@ -8659,13 +8643,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.25.6': - dependencies: - '@babel/types': 7.25.6 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - '@babel/generator@7.26.2': dependencies: '@babel/parser': 7.26.2 @@ -8674,10 +8651,6 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 - '@babel/helper-annotate-as-pure@7.24.7': - dependencies: - '@babel/types': 7.26.0 - '@babel/helper-annotate-as-pure@7.25.9': dependencies: '@babel/types': 7.26.0 @@ -8690,21 +8663,6 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.7 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.24.7(@babel/core@7.25.2) - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -8718,22 +8676,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-environment-visitor@7.24.7': - dependencies: - '@babel/types': 7.26.0 - - '@babel/helper-function-name@7.24.7': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.26.0 - - '@babel/helper-member-expression-to-functions@7.24.7': - dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.26.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-member-expression-to-functions@7.25.9': dependencies: '@babel/traverse': 7.25.9 @@ -8747,7 +8689,7 @@ snapshots: '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/traverse': 7.25.6 + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -8757,32 +8699,17 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.6 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.24.7': - dependencies: - '@babel/types': 7.26.0 - '@babel/helper-optimise-call-expression@7.25.9': dependencies: '@babel/types': 7.26.0 - '@babel/helper-plugin-utils@7.24.7': {} - '@babel/helper-plugin-utils@7.25.9': {} - '@babel/helper-replace-supers@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.7 - '@babel/helper-optimise-call-expression': 7.24.7 - transitivePeerDependencies: - - supports-color - '@babel/helper-replace-supers@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -8794,14 +8721,7 @@ snapshots: '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.26.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - dependencies: - '@babel/traverse': 7.25.6 + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -8813,35 +8733,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-split-export-declaration@7.24.7': - dependencies: - '@babel/types': 7.26.0 - - '@babel/helper-string-parser@7.24.8': {} - '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-validator-identifier@7.25.9': {} '@babel/helper-validator-option@7.24.8': {} '@babel/helpers@7.25.6': dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.0 - - '@babel/parser@7.25.6': - dependencies: - '@babel/types': 7.25.6 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 '@babel/parser@7.26.2': dependencies: @@ -8850,8 +8751,8 @@ snapshots: '@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-decorators': 7.24.7(@babel/core@7.25.2) transitivePeerDependencies: - supports-color @@ -8872,12 +8773,12 @@ snapshots: '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': dependencies: @@ -8892,19 +8793,19 @@ snapshots: '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-typescript@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) transitivePeerDependencies: - supports-color @@ -8913,30 +8814,12 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.0': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.26.2 - '@babel/types': 7.25.6 - '@babel/template@7.25.9': dependencies: '@babel/code-frame': 7.26.2 '@babel/parser': 7.26.2 '@babel/types': 7.26.0 - '@babel/traverse@7.25.6': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/parser': 7.26.2 - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - debug: 4.3.7 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.25.9': dependencies: '@babel/code-frame': 7.26.2 @@ -8949,12 +8832,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.25.6': - dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - '@babel/types@7.26.0': dependencies: '@babel/helper-string-parser': 7.25.9 @@ -10798,6 +10675,8 @@ snapshots: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 + '@sentry/babel-plugin-component-annotate@2.22.7': {} + '@sentry/browser@7.118.0': dependencies: '@sentry-internal/feedback': 7.118.0 @@ -10809,6 +10688,60 @@ snapshots: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 + '@sentry/bundler-plugin-core@2.22.7': + dependencies: + '@babel/core': 7.25.2 + '@sentry/babel-plugin-component-annotate': 2.22.7 + '@sentry/cli': 2.39.1 + dotenv: 16.4.7 + find-up: 5.0.0 + glob: 9.3.5 + magic-string: 0.30.8 + unplugin: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/cli-darwin@2.39.1': + optional: true + + '@sentry/cli-linux-arm64@2.39.1': + optional: true + + '@sentry/cli-linux-arm@2.39.1': + optional: true + + '@sentry/cli-linux-i686@2.39.1': + optional: true + + '@sentry/cli-linux-x64@2.39.1': + optional: true + + '@sentry/cli-win32-i686@2.39.1': + optional: true + + '@sentry/cli-win32-x64@2.39.1': + optional: true + + '@sentry/cli@2.39.1': + dependencies: + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + optionalDependencies: + '@sentry/cli-darwin': 2.39.1 + '@sentry/cli-linux-arm': 2.39.1 + '@sentry/cli-linux-arm64': 2.39.1 + '@sentry/cli-linux-i686': 2.39.1 + '@sentry/cli-linux-x64': 2.39.1 + '@sentry/cli-win32-i686': 2.39.1 + '@sentry/cli-win32-x64': 2.39.1 + transitivePeerDependencies: + - encoding + - supports-color + '@sentry/core@7.118.0': dependencies: '@sentry/types': 7.118.0 @@ -10843,6 +10776,14 @@ snapshots: dependencies: '@sentry/types': 7.118.0 + '@sentry/vite-plugin@2.22.7': + dependencies: + '@sentry/bundler-plugin-core': 2.22.7 + unplugin: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + '@shaderfrog/glsl-parser@2.1.5': {} '@sinclair/typebox@0.27.8': {} @@ -10890,11 +10831,11 @@ snapshots: storybook: 8.4.2(prettier@3.3.2) ts-dedent: 2.2.0 - '@storybook/addon-docs@8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2))': + '@storybook/addon-docs@8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2))(webpack-sources@3.2.3)': dependencies: '@mdx-js/react': 3.1.0(@types/react@18.3.3)(react@18.3.1) '@storybook/blocks': 8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2)) - '@storybook/csf-plugin': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/csf-plugin': 8.4.2(storybook@8.4.2(prettier@3.3.2))(webpack-sources@3.2.3) '@storybook/react-dom-shim': 8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -10904,12 +10845,12 @@ snapshots: - '@types/react' - webpack-sources - '@storybook/addon-essentials@8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2))': + '@storybook/addon-essentials@8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2))(webpack-sources@3.2.3)': dependencies: '@storybook/addon-actions': 8.4.2(storybook@8.4.2(prettier@3.3.2)) '@storybook/addon-backgrounds': 8.4.2(storybook@8.4.2(prettier@3.3.2)) '@storybook/addon-controls': 8.4.2(storybook@8.4.2(prettier@3.3.2)) - '@storybook/addon-docs': 8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2)) + '@storybook/addon-docs': 8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2))(webpack-sources@3.2.3) '@storybook/addon-highlight': 8.4.2(storybook@8.4.2(prettier@3.3.2)) '@storybook/addon-measure': 8.4.2(storybook@8.4.2(prettier@3.3.2)) '@storybook/addon-outline': 8.4.2(storybook@8.4.2(prettier@3.3.2)) @@ -10973,9 +10914,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))': + '@storybook/builder-vite@8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(webpack-sources@3.2.3)': dependencies: - '@storybook/csf-plugin': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/csf-plugin': 8.4.2(storybook@8.4.2(prettier@3.3.2))(webpack-sources@3.2.3) browser-assert: 1.2.1 storybook: 8.4.2(prettier@3.3.2) ts-dedent: 2.2.0 @@ -11007,10 +10948,10 @@ snapshots: - supports-color - utf-8-validate - '@storybook/csf-plugin@8.4.2(storybook@8.4.2(prettier@3.3.2))': + '@storybook/csf-plugin@8.4.2(storybook@8.4.2(prettier@3.3.2))(webpack-sources@3.2.3)': dependencies: storybook: 8.4.2(prettier@3.3.2) - unplugin: 1.15.0 + unplugin: 1.15.0(webpack-sources@3.2.3) transitivePeerDependencies: - webpack-sources @@ -11045,11 +10986,11 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.4.2(prettier@3.3.2) - '@storybook/react-vite@8.4.2(@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.24.0)(storybook@8.4.2(prettier@3.3.2))(typescript@5.5.3)(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))': + '@storybook/react-vite@8.4.2(@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.24.0)(storybook@8.4.2(prettier@3.3.2))(typescript@5.5.3)(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(webpack-sources@3.2.3)': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.5.3)(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1)) '@rollup/pluginutils': 5.1.0(rollup@4.24.0) - '@storybook/builder-vite': 8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1)) + '@storybook/builder-vite': 8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(webpack-sources@3.2.3) '@storybook/react': 8.4.2(@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2))(typescript@5.5.3) find-up: 5.0.0 magic-string: 0.30.11 @@ -11098,9 +11039,9 @@ snapshots: dependencies: storybook: 8.4.2(prettier@3.3.2) - '@storybook/vue3-vite@8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(vue@3.5.2(typescript@5.5.3))': + '@storybook/vue3-vite@8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(vue@3.5.2(typescript@5.5.3))(webpack-sources@3.2.3)': dependencies: - '@storybook/builder-vite': 8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1)) + '@storybook/builder-vite': 8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(webpack-sources@3.2.3) '@storybook/vue3': 8.4.2(storybook@8.4.2(prettier@3.3.2))(vue@3.5.2(typescript@5.5.3)) find-package-json: 1.2.0 magic-string: 0.30.11 @@ -11177,7 +11118,7 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 '@babel/runtime': 7.24.7 '@types/aria-query': 5.0.4 aria-query: 5.3.0 @@ -11237,24 +11178,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.26.0 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.26.2 - '@babel/types': 7.25.6 + '@babel/types': 7.26.0 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.26.0 '@types/cacheable-request@6.0.3': dependencies: @@ -11724,24 +11665,12 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 - '@volar/language-core@2.4.0-alpha.12': - dependencies: - '@volar/source-map': 2.4.0-alpha.12 - '@volar/language-core@2.4.10': dependencies: '@volar/source-map': 2.4.10 - '@volar/source-map@2.4.0-alpha.12': {} - '@volar/source-map@2.4.10': {} - '@volar/typescript@2.4.0-alpha.12': - dependencies: - '@volar/language-core': 2.4.0-alpha.12 - path-browserify: 1.0.1 - vscode-uri: 3.0.8 - '@volar/typescript@2.4.10': dependencies: '@volar/language-core': 2.4.10 @@ -11753,11 +11682,11 @@ snapshots: '@vue/babel-plugin-jsx@1.2.2(@babel/core@7.25.2)': dependencies: '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 '@vue/babel-helper-vue-transform-on': 1.2.2 '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.25.2) camelcase: 6.3.0 @@ -11770,7 +11699,7 @@ snapshots: '@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.25.2)': dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.25.9 @@ -11779,7 +11708,7 @@ snapshots: '@vue/compiler-core@3.5.2': dependencies: - '@babel/parser': 7.25.6 + '@babel/parser': 7.26.2 '@vue/shared': 3.5.2 entities: 4.5.0 estree-walker: 2.0.2 @@ -11792,7 +11721,7 @@ snapshots: '@vue/compiler-sfc@3.5.2': dependencies: - '@babel/parser': 7.25.6 + '@babel/parser': 7.26.2 '@vue/compiler-core': 3.5.2 '@vue/compiler-dom': 3.5.2 '@vue/compiler-ssr': 3.5.2 @@ -11856,7 +11785,7 @@ snapshots: '@vue/language-core@2.0.24(typescript@5.5.3)': dependencies: - '@volar/language-core': 2.4.0-alpha.12 + '@volar/language-core': 2.4.10 '@vue/compiler-dom': 3.5.2 '@vue/shared': 3.5.2 computeds: 0.0.1 @@ -11907,7 +11836,7 @@ snapshots: '@vue/test-utils@2.4.6': dependencies: js-beautify: 1.15.1 - vue-component-type-helpers: 2.0.29 + vue-component-type-helpers: 2.1.10 '@vue/tsconfig@0.5.1': {} @@ -11960,18 +11889,16 @@ snapshots: xtend: 4.0.2 optional: true - acorn-jsx@5.3.2(acorn@8.12.0): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.12.0 + acorn: 8.14.0 acorn-walk@8.3.3: dependencies: - acorn: 8.12.0 + acorn: 8.14.0 acorn@7.4.1: {} - acorn@8.12.0: {} - acorn@8.14.0: {} ag-charts-community@10.3.3: @@ -12253,11 +12180,11 @@ snapshots: babel-plugin-react-compiler@19.0.0-beta-6fc168f-20241025: dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.26.0 babel-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110: dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.26.0 babel-walk@3.0.0-canary-5: dependencies: @@ -13086,6 +13013,8 @@ snapshots: dotenv-expand@5.1.0: {} + dotenv@16.4.7: {} + dotenv@9.0.2: {} eastasianwidth@0.2.0: {} @@ -13513,14 +13442,14 @@ snapshots: espree@10.2.0: dependencies: - acorn: 8.12.0 - acorn-jsx: 5.3.2(acorn@8.12.0) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.1.0 espree@9.6.1: dependencies: - acorn: 8.12.0 - acorn-jsx: 5.3.2(acorn@8.12.0) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -13845,6 +13774,13 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + glob@9.3.5: + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.11.1 + global-agent@3.0.0: dependencies: boolean: 3.2.0 @@ -14476,8 +14412,6 @@ snapshots: - supports-color - utf-8-validate - jsesc@2.5.2: {} - jsesc@3.0.2: {} json-buffer@3.0.1: {} @@ -14776,10 +14710,14 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.8: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + magicast@0.3.4: dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 source-map-js: 1.2.0 make-dir@4.0.0: @@ -14867,6 +14805,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@8.0.4: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.1: dependencies: brace-expansion: 2.0.1 @@ -14915,7 +14857,7 @@ snapshots: mlly@1.7.1: dependencies: - acorn: 8.12.0 + acorn: 8.14.0 pathe: 1.1.2 pkg-types: 1.1.2 ufo: 1.5.3 @@ -15410,6 +15352,8 @@ snapshots: proto-list@1.2.4: {} + proxy-from-env@1.1.0: {} + prr@1.0.1: optional: true @@ -15629,8 +15573,8 @@ snapshots: react-docgen@7.1.0: dependencies: '@babel/core': 7.25.2 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 '@types/doctrine': 0.0.9 @@ -16425,8 +16369,6 @@ snapshots: tmp@0.2.3: {} - to-fast-properties@2.0.0: {} - to-ico@1.1.5: dependencies: arrify: 1.0.1 @@ -16597,10 +16539,19 @@ snapshots: unpipe@1.0.0: {} - unplugin@1.15.0: + unplugin@1.0.1: + dependencies: + acorn: 8.14.0 + chokidar: 3.6.0 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + + unplugin@1.15.0(webpack-sources@3.2.3): dependencies: acorn: 8.14.0 webpack-virtual-modules: 0.6.2 + optionalDependencies: + webpack-sources: 3.2.3 upath@2.0.1: {} @@ -16862,8 +16813,6 @@ snapshots: optionalDependencies: typescript: 5.5.3 - vue-component-type-helpers@2.0.29: {} - vue-component-type-helpers@2.1.10: {} vue-demi@0.14.10(vue@3.5.2(typescript@5.5.3)): @@ -16872,8 +16821,8 @@ snapshots: vue-docgen-api@4.79.2(vue@3.5.2(typescript@5.5.3)): dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 '@vue/compiler-dom': 3.5.2 '@vue/compiler-sfc': 3.5.2 ast-types: 0.16.1 @@ -16925,7 +16874,7 @@ snapshots: vue-tsc@2.0.24(typescript@5.5.3): dependencies: - '@volar/typescript': 2.4.0-alpha.12 + '@volar/typescript': 2.4.10 '@vue/language-core': 2.0.24(typescript@5.5.3) semver: 7.6.3 typescript: 5.5.3 @@ -16950,6 +16899,10 @@ snapshots: webidl-conversions@7.0.0: {} + webpack-sources@3.2.3: {} + + webpack-virtual-modules@0.5.0: {} + webpack-virtual-modules@0.6.2: {} whatwg-encoding@3.1.1: diff --git a/rust-toolchain.toml b/rust-toolchain.toml index a4504f6efdca..5e37ef6b5892 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] channel = "nightly-2024-08-08" -components = ["clippy", "rustfmt"] +components = ["clippy", "rustfmt", "rust-src"] profile = "default" targets = ["wasm32-unknown-unknown"] From 13aa43ebd49459adc68409b63d07c5d0b081d3ad Mon Sep 17 00:00:00 2001 From: James Dunkerley Date: Thu, 19 Dec 2024 10:06:30 +0000 Subject: [PATCH 2/9] Add missing entries. (#11914) * Add missing entries. * Remove typo --- app/ide-desktop/client/tasks/signArchivesMacOs.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/ide-desktop/client/tasks/signArchivesMacOs.ts b/app/ide-desktop/client/tasks/signArchivesMacOs.ts index 0e6fb9479db0..64310fad8816 100644 --- a/app/ide-desktop/client/tasks/signArchivesMacOs.ts +++ b/app/ide-desktop/client/tasks/signArchivesMacOs.ts @@ -101,6 +101,13 @@ async function ensoPackageSignables(resourcesDir: string): Promise { ], ], ['component/jna-*.jar', ['com/sun/jna/*/libjnidispatch.jnilib']], + [ + 'component/jline-*.jar', + [ + 'org/jline/nativ/Mac/arm64/libjlinenative.jnilib', + 'org/jline/nativ/Mac/x86_64/libjlinenative.jnilib', + ], + ], [ 'lib/Standard/Database/*/polyglot/java/sqlite-jdbc-*.jar', [ From c08a53dcc3efc50283cf723a0e858c24bed68066 Mon Sep 17 00:00:00 2001 From: Dmitry Bushev Date: Thu, 19 Dec 2024 13:56:29 +0300 Subject: [PATCH 3/9] Allow checks on develop to complete (#11917) followup to #11723 Do not cancel checks when a new commit is pushed to develop. --- .github/workflows/engine-pull-request.yml | 2 +- .github/workflows/gui-checks.yml | 2 +- .github/workflows/gui-packaging-pull-request.yml | 2 +- .github/workflows/gui-pull-request.yml | 2 +- .github/workflows/storybook.yml | 2 +- .github/workflows/wasm-pull-request.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/engine-pull-request.yml b/.github/workflows/engine-pull-request.yml index a886fedc149e..47b2d7adf5f2 100644 --- a/.github/workflows/engine-pull-request.yml +++ b/.github/workflows/engine-pull-request.yml @@ -10,7 +10,7 @@ on: concurrency: group: ${{ github.workflow }}-${{ github.ref }}-engine-pull-request - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} permissions: checks: write diff --git a/.github/workflows/gui-checks.yml b/.github/workflows/gui-checks.yml index 730d49198748..5ac10409c741 100644 --- a/.github/workflows/gui-checks.yml +++ b/.github/workflows/gui-checks.yml @@ -6,7 +6,7 @@ on: workflow_call # Cancel in-progress workflows if a new one is started concurrency: group: ${{ github.workflow }}-${{ github.ref }}-gui-checks - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} permissions: contents: read # Read-only access to repository contents diff --git a/.github/workflows/gui-packaging-pull-request.yml b/.github/workflows/gui-packaging-pull-request.yml index c379bb18b3fb..f38628a231fe 100644 --- a/.github/workflows/gui-packaging-pull-request.yml +++ b/.github/workflows/gui-packaging-pull-request.yml @@ -10,7 +10,7 @@ on: concurrency: group: ${{ github.workflow }}-${{ github.ref }}-gui-packaging-pull-request - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: gui-changed-files: diff --git a/.github/workflows/gui-pull-request.yml b/.github/workflows/gui-pull-request.yml index 36d7f77faf93..f360b23be5e5 100644 --- a/.github/workflows/gui-pull-request.yml +++ b/.github/workflows/gui-pull-request.yml @@ -10,7 +10,7 @@ on: concurrency: group: ${{ github.workflow }}-${{ github.ref }}-gui-pull-request - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} permissions: contents: read # Read-only access to repository contents diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml index 79b9ae96c629..f2abd5d3563b 100644 --- a/.github/workflows/storybook.yml +++ b/.github/workflows/storybook.yml @@ -7,7 +7,7 @@ on: workflow_call # Cancel in-progress workflows if a new one is started concurrency: group: ${{ github.workflow }}-${{ github.ref }}-chromatic - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} permissions: contents: read # Read-only access to repository contents diff --git a/.github/workflows/wasm-pull-request.yml b/.github/workflows/wasm-pull-request.yml index 16aecc6559f5..18a9c6d48a1d 100644 --- a/.github/workflows/wasm-pull-request.yml +++ b/.github/workflows/wasm-pull-request.yml @@ -10,7 +10,7 @@ on: concurrency: group: ${{ github.workflow }}-${{ github.ref }}-wasm-pull-request - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: wasm-changed-files: From 014b562ca9693012b03a2c1389669944feba0f11 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 19 Dec 2024 12:59:35 +0100 Subject: [PATCH 4/9] Promote broken values instead of ignoring them (#11777) Partially fixes #5430 by propagating `DataflowError`s found during statement execution out of the method. # Important Notes This change [may affect behavior](https://github.com/enso-org/enso/pull/11673/files#r1871128327) of existing methods that ignore `DataflowError` as [discussed here](https://github.com/enso-org/enso/pull/11673/files#r1871128327). --- CHANGELOG.md | 2 + .../0.0.0-dev/src/Data/Index_Sub_Range.enso | 10 +- .../Base/0.0.0-dev/src/Data/Range.enso | 5 +- .../0.0.0-dev/src/Data/Time/Date_Range.enso | 5 +- .../src/Internal/Array_Like_Helpers.enso | 2 +- .../Test/0.0.0-dev/src/Extensions.enso | 105 ++++++++------ .../0.0.0-dev/src/Extensions_Helpers.enso | 14 ++ docs/types/errors.md | 134 ++++++++++++------ .../DataflowErrorPropagationTest.java | 86 +++++++++++ .../node/callable/function/BlockNode.java | 19 ++- test/Base_Tests/src/Data/Decimal_Spec.enso | 4 +- test/Base_Tests/src/Data/Function_Spec.enso | 1 - test/Base_Tests/src/Data/Range_Spec.enso | 32 +++-- .../src/Data/Time/Date_Range_Spec.enso | 8 +- test/Base_Tests/src/Random_Spec.enso | 1 - test/Base_Tests/src/System/File_Spec.enso | 2 +- .../Cross_Tab_Spec.enso | 1 - .../Common_Table_Operations/Nothing_Spec.enso | 3 +- .../Table_Tests/src/Database/SQLite_Spec.enso | 27 ++-- .../Table_Tests/src/Database/Upload_Spec.enso | 2 +- test/Table_Tests/src/IO/Fetch_Spec.enso | 16 ++- .../src/In_Memory/Split_Tokenize_Spec.enso | 11 +- test/Table_Tests/src/Util.enso | 18 ++- test/Table_Tests/src/Util_Spec.enso | 66 ++++++++- test/Test_Tests/package.yaml | 7 + test/Test_Tests/src/Extensions_Spec.enso | 86 +++++++++++ test/Test_Tests/src/Helpers.enso | 17 +++ test/Test_Tests/src/Main.enso | 13 ++ 28 files changed, 540 insertions(+), 157 deletions(-) create mode 100644 distribution/lib/Standard/Test/0.0.0-dev/src/Extensions_Helpers.enso create mode 100644 engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/semantic/DataflowErrorPropagationTest.java create mode 100644 test/Test_Tests/package.yaml create mode 100644 test/Test_Tests/src/Extensions_Spec.enso create mode 100644 test/Test_Tests/src/Helpers.enso create mode 100644 test/Test_Tests/src/Main.enso diff --git a/CHANGELOG.md b/CHANGELOG.md index b1e53b92c712..1d4db090dd76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,11 +12,13 @@ #### Enso Language & Runtime +- [Promote broken values instead of ignoring them][11777]. - [Intersection types & type checks][11600] - A constructor or type definition with a single inline argument definition was previously allowed to use spaces in the argument definition without parentheses. [This is now a syntax error.][11856] +[11777]: https://github.com/enso-org/enso/pull/11777 [11600]: https://github.com/enso-org/enso/pull/11600 [11856]: https://github.com/enso-org/enso/pull/11856 diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Index_Sub_Range.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Index_Sub_Range.enso index 95dc0af8ac17..360497b52657 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Index_Sub_Range.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Index_Sub_Range.enso @@ -204,9 +204,8 @@ take_helper length at single_slice slice_ranges range:(Index_Sub_Range | Range | Index_Sub_Range.First count -> single_slice 0 (length.min count) Index_Sub_Range.Last count -> single_slice length-count length Index_Sub_Range.While predicate -> - end = 0.up_to length . find i-> (predicate (at i)).not - true_end = if end.is_nothing then length else end - single_slice 0 true_end + end = 0.up_to length . find (i-> (predicate (at i)).not) if_missing=length + single_slice 0 end Index_Sub_Range.By_Index one_or_many_descriptors -> Panic.recover [Index_Out_Of_Bounds, Illegal_Argument] <| indices = case one_or_many_descriptors of _ : Vector -> one_or_many_descriptors @@ -255,9 +254,8 @@ drop_helper length at single_slice slice_ranges range:(Index_Sub_Range | Range | Index_Sub_Range.First count -> single_slice count length Index_Sub_Range.Last count -> single_slice 0 length-count Index_Sub_Range.While predicate -> - end = 0.up_to length . find i-> (predicate (at i)).not - true_end = if end.is_nothing then length else end - single_slice true_end length + end = 0.up_to length . find (i-> (predicate (at i)).not) if_missing=length + single_slice end length Index_Sub_Range.By_Index one_or_many_descriptors -> Panic.recover [Index_Out_Of_Bounds, Illegal_Argument] <| indices = case one_or_many_descriptors of _ : Vector -> one_or_many_descriptors diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Range.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Range.enso index 8c588cb434cd..2064d7927fdb 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Range.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Range.enso @@ -7,6 +7,7 @@ import project.Data.Text.Text import project.Data.Vector.Vector import project.Error.Error import project.Errors.Common.Index_Out_Of_Bounds +import project.Errors.Common.Not_Found import project.Errors.Empty_Error.Empty_Error import project.Errors.Illegal_Argument.Illegal_Argument import project.Errors.Illegal_State.Illegal_State @@ -397,7 +398,7 @@ type Range @condition range_default_filter_condition_widget any : (Filter_Condition | (Integer -> Boolean)) -> Boolean any self (condition : Filter_Condition | (Integer -> Boolean)) = - self.find condition . is_nothing . not + self.find condition if_missing=Nothing . is_nothing . not ## GROUP Selections ICON find @@ -422,7 +423,7 @@ type Range 1.up_to 100 . find (..Greater than=10) @condition range_default_filter_condition_widget find : (Filter_Condition | (Integer -> Boolean)) -> Integer -> Any -> Any - find self (condition : Filter_Condition | (Integer -> Boolean)) (start : Integer = 0) ~if_missing=Nothing = + find self (condition : Filter_Condition | (Integer -> Boolean)) (start : Integer = 0) ~if_missing=(Error.throw Not_Found) = predicate = unify_condition_or_predicate condition check_start_valid start self used_start-> result = find_internal self used_start predicate diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date_Range.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date_Range.enso index e51d9f12062e..3f0d9077dfba 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date_Range.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Time/Date_Range.enso @@ -11,6 +11,7 @@ import project.Data.Time.Period.Period import project.Data.Vector.Vector import project.Error.Error import project.Errors.Common.Index_Out_Of_Bounds +import project.Errors.Common.Not_Found import project.Errors.Empty_Error.Empty_Error import project.Errors.Illegal_Argument.Illegal_Argument import project.Function.Function @@ -418,7 +419,7 @@ type Date_Range @condition date_range_default_filter_condition_widget any : (Filter_Condition | (Date -> Boolean)) -> Boolean any self (condition : Filter_Condition | (Date -> Boolean)) = - self.find condition . is_nothing . not + self.find condition if_missing=Nothing . is_nothing . not ## GROUP Selections ICON find @@ -438,7 +439,7 @@ type Date_Range (Date.new 2020 10 01).up_to (Date.new 2020 10 31) . find (d-> d.day_of_week == Day_Of_Week.Monday) @condition date_range_default_filter_condition_widget find : (Filter_Condition | (Date -> Boolean)) -> Integer -> Any -> Any - find self (condition : Filter_Condition | (Date -> Boolean)) (start : Integer = 0) ~if_missing=Nothing = + find self (condition : Filter_Condition | (Date -> Boolean)) (start : Integer = 0) ~if_missing=(Error.throw Not_Found) = predicate = unify_condition_or_predicate condition index = self.index_of predicate start case index of diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso index 131d1de9fd9f..b2351bcde3b7 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Internal/Array_Like_Helpers.enso @@ -216,7 +216,7 @@ find vector condition start ~if_missing = predicate = unify_condition_or_predicate condition self_len = vector.length check_start_valid start self_len used_start-> - found = used_start.up_to self_len . find (idx -> (predicate (vector.at idx))) + found = used_start.up_to self_len . find (idx -> (predicate (vector.at idx))) if_missing=Nothing if found.is_nothing then if_missing else vector.at found transpose vec_of_vecs = diff --git a/distribution/lib/Standard/Test/0.0.0-dev/src/Extensions.enso b/distribution/lib/Standard/Test/0.0.0-dev/src/Extensions.enso index 46741a56a5c0..ff852368a507 100644 --- a/distribution/lib/Standard/Test/0.0.0-dev/src/Extensions.enso +++ b/distribution/lib/Standard/Test/0.0.0-dev/src/Extensions.enso @@ -1,9 +1,11 @@ from Standard.Base import all +import Standard.Base.Errors.Common.Incomparable_Values import Standard.Base.Errors.Common.No_Such_Method import Standard.Base.Errors.Illegal_Argument.Illegal_Argument import project.Spec_Result.Spec_Result import project.Test.Test +from project.Extensions_Helpers import rhs_error_check ## Expect a function to fail with the provided dataflow error. @@ -70,23 +72,25 @@ Error.should_fail_with self matcher frames_to_skip=0 unwrap_errors=True = example_should_equal = Examples.add_1_to 1 . should_equal 2 Any.should_equal : Any -> Integer -> Spec_Result -Any.should_equal self that frames_to_skip=0 = case self == that of - True -> Spec_Result.Success - False -> - loc = Meta.get_source_location 2+frames_to_skip - additional_comment = case self of - _ : Vector -> case that of - _ : Vector -> - case self.length == that.length of - True -> - diff = self.zip that . index_of p-> - p.first != p.second - "; first difference at index " + diff.to_text + " " - False -> "; lengths differ (" + self.length.to_text + " != " + that.length.to_text + ") " +Any.should_equal self that frames_to_skip=0 = + rhs_error_check that + loc = Meta.get_source_location 1+frames_to_skip + case self == that of + True -> Spec_Result.Success + False -> + additional_comment = case self of + _ : Vector -> case that of + _ : Vector -> + case self.length == that.length of + True -> + diff = self.zip that . index_of p-> + p.first != p.second + "; first difference at index " + diff.to_text + " " + False -> "; lengths differ (" + self.length.to_text + " != " + that.length.to_text + ") " + _ -> "" _ -> "" - _ -> "" - msg = self.pretty + " did not equal " + that.pretty + additional_comment + " (at " + loc + ")." - Test.fail msg + msg = self.pretty + " did not equal " + that.pretty + additional_comment + " (at " + loc + ")." + Test.fail msg ## Asserts that `self` value is equal to the expected type value. @@ -130,12 +134,13 @@ Error.should_equal_type self that frames_to_skip=0 = example_should_not_equal = Examples.add_1_to 1 . should_not_equal 2 Any.should_not_equal : Any -> Integer -> Spec_Result -Any.should_not_equal self that frames_to_skip=0 = case self != that of - True -> Spec_Result.Success - False -> - loc = Meta.get_source_location 2+frames_to_skip - msg = self.to_text + " did equal " + that.to_text + " (at " + loc + ")." - Test.fail msg +Any.should_not_equal self that frames_to_skip=0 = if that.is_error then (Panic.throw (Illegal_Argument.Error "Expected value provided as `that` for `should_not_equal` cannot be an error, but got: "+that.to_display_text)) else + loc = Meta.get_source_location 2+frames_to_skip + case self != that of + True -> Spec_Result.Success + False -> + msg = self.to_text + " did equal " + that.to_text + " (at " + loc + ")." + Test.fail msg ## Added so that dataflow errors are not silently lost. Error.should_not_equal self that frames_to_skip=0 = @@ -183,15 +188,16 @@ Error.should_not_equal_type self that frames_to_skip=0 = example_should_start_with = "Hello World!" . should_start_with "Hello" Any.should_start_with : Text -> Integer -> Spec_Result -Any.should_start_with self that frames_to_skip=0 = case self of - _ : Text -> if self.starts_with that then Spec_Result.Success else - loc = Meta.get_source_location 3+frames_to_skip - msg = self.to_text + " does not start with " + that.to_text + " (at " + loc + ")." - Test.fail msg - _ -> - loc = Meta.get_source_location 2+frames_to_skip - msg = self.to_text + " is not a `Text` value (at " + loc + ")." - Test.fail msg +Any.should_start_with self that frames_to_skip=0 = + rhs_error_check that + loc = Meta.get_source_location 1+frames_to_skip + case self of + _ : Text -> if self.starts_with that then Spec_Result.Success else + msg = self.to_text + " does not start with " + that.to_text + " (at " + loc + ")." + Test.fail msg + _ -> + msg = self.to_text + " is not a `Text` value (at " + loc + ")." + Test.fail msg ## Asserts that `self` value is a Text value and ends with `that`. @@ -207,15 +213,16 @@ Any.should_start_with self that frames_to_skip=0 = case self of example_should_end_with = "Hello World!" . should_end_with "ld!" Any.should_end_with : Text -> Integer -> Spec_Result -Any.should_end_with self that frames_to_skip=0 = case self of - _ : Text -> if self.ends_with that then Spec_Result.Success else - loc = Meta.get_source_location 3+frames_to_skip - msg = self.to_text + " does not end with " + that.to_text + " (at " + loc + ")." - Test.fail msg - _ -> - loc = Meta.get_source_location 2+frames_to_skip - msg = self.to_text + " is not a `Text` value (at " + loc + ")." - Test.fail msg +Any.should_end_with self that frames_to_skip=0 = + rhs_error_check that + loc = Meta.get_source_location 1+frames_to_skip + case self of + _ : Text -> if self.ends_with that then Spec_Result.Success else + msg = self.to_text + " does not end with " + that.to_text + " (at " + loc + ")." + Test.fail msg + _ -> + msg = self.to_text + " is not a `Text` value (at " + loc + ")." + Test.fail msg ## Asserts that `self` value is a Text value and starts with `that`. @@ -267,7 +274,7 @@ Error.should_end_with self that frames_to_skip=0 = example_should_equal = Examples.add_1_to 1 . should_equal 2 Error.should_equal : Any -> Integer -> Spec_Result Error.should_equal self that frames_to_skip=0 = - _ = [that] + rhs_error_check that Test.fail_match_on_unexpected_error self 1+frames_to_skip ## Asserts that `self` is within `epsilon` from `that`. @@ -294,13 +301,18 @@ Error.should_equal self that frames_to_skip=0 = 1.00000001 . should_equal 1.00000002 epsilon=0.0001 Number.should_equal : Float -> Float -> Integer -> Spec_Result Number.should_equal self that epsilon=0 frames_to_skip=0 = + rhs_error_check that + loc = Meta.get_source_location 1+frames_to_skip matches = case that of - n : Number -> self.equals n epsilon + n : Number -> self.equals n epsilon . catch Incomparable_Values _-> + ## Incomparable_Values is thrown if one of the values is NaN. + We fallback to is_same_object_as, + because in tests we actually NaN.should_equal NaN to succeed. + self.is_same_object_as n _ -> self==that case matches of True -> Spec_Result.Success False -> - loc = Meta.get_source_location 2+frames_to_skip msg = self.to_text + " did not equal " + that.to_text + " (at " + loc + ")." Test.fail msg @@ -313,6 +325,7 @@ Number.should_equal self that epsilon=0 frames_to_skip=0 = displayed as the source of this error. Decimal.should_equal : Number -> Float-> Float -> Integer -> Spec_Result Decimal.should_equal self that epsilon=0 frames_to_skip=0 = + rhs_error_check that self.to_float . should_equal that.to_float epsilon frames_to_skip+1 ## Asserts that `self` value is not an error. @@ -423,6 +436,7 @@ Error.should_be_false self = Test.fail_match_on_unexpected_error self 1 example_should_be_a = 1.should_be_a Boolean Any.should_be_a : Any -> Spec_Result Any.should_be_a self typ = + rhs_error_check typ loc = Meta.get_source_location 1 fail_on_wrong_arg_type = Panic.throw <| @@ -490,6 +504,8 @@ Any.should_be_a self typ = Any.should_equal_ignoring_order : Any -> Integer -> Spec_Result Any.should_equal_ignoring_order self that frames_to_skip=0 = loc = Meta.get_source_location 1+frames_to_skip + if that.is_a Vector . not then + Panic.throw (Illegal_Argument.Error "Expected a Vector, but got a "+that.to_display_text+" (at "+loc+").") that.each element-> if self.contains element . not then msg = "The collection (" + self.to_text + ") did not contain " + element.to_text + " (at " + loc + ")." @@ -556,6 +572,7 @@ Error.should_equal_ignoring_order self that frames_to_skip=0 = example_should_equal = [1, 2] . should_only_contain_elements_in [1, 2, 3, 4] Any.should_only_contain_elements_in : Any -> Integer -> Spec_Result Any.should_only_contain_elements_in self that frames_to_skip=0 = + rhs_error_check that loc = Meta.get_source_location 1+frames_to_skip self.each element-> if that.contains element . not then @@ -609,6 +626,7 @@ Error.should_only_contain_elements_in self that frames_to_skip=0 = example_should_equal = "foobar".should_contain "foo" Any.should_contain : Any -> Integer -> Spec_Result Any.should_contain self element frames_to_skip=0 = + rhs_error_check element loc = Meta.get_source_location 1+frames_to_skip contains_result = Panic.catch No_Such_Method (self.contains element) caught_panic-> if caught_panic.payload.method_name != "contains" then Panic.throw caught_panic else @@ -652,6 +670,7 @@ Error.should_contain self element frames_to_skip=0 = implementing a method `contains : a -> Boolean`. Any.should_not_contain : Any -> Integer -> Spec_Result Any.should_not_contain self element frames_to_skip=0 = + rhs_error_check element loc = Meta.get_source_location 1+frames_to_skip contains_result = Panic.catch No_Such_Method (self.contains element) caught_panic-> if caught_panic.payload.method_name != "contains" then Panic.throw caught_panic else diff --git a/distribution/lib/Standard/Test/0.0.0-dev/src/Extensions_Helpers.enso b/distribution/lib/Standard/Test/0.0.0-dev/src/Extensions_Helpers.enso new file mode 100644 index 000000000000..73f4437ef8bf --- /dev/null +++ b/distribution/lib/Standard/Test/0.0.0-dev/src/Extensions_Helpers.enso @@ -0,0 +1,14 @@ +private + +from Standard.Base import all +import Standard.Base.Errors.Illegal_Argument.Illegal_Argument + +## PRIVATE + A helper that ensures that the expected value provided in some of the Test + operations is not an error. + The left-hand side may be an error and that will cause a test failure. + But the right-hand side being an error is bad test design and should be fixed. +rhs_error_check that = + if that.is_error then + msg = "Dataflow error ("+that.to_display_text+") provided as expected value. Use `should_fail_with` or change the test."+ ' Error stack trace was:\n'+that.get_stack_trace_text + Panic.throw (Illegal_Argument.Error msg) diff --git a/docs/types/errors.md b/docs/types/errors.md index 653645734301..8d0aeb4f3187 100644 --- a/docs/types/errors.md +++ b/docs/types/errors.md @@ -1,15 +1,17 @@ --- layout: developer-doc -title: Errors +title: Errors & Panics category: types tags: [types, errors] order: 12 --- -# Errors +# Errors & Panics -Enso supports two notions of errors. One is the standard exceptions model, while -the other is a theory of 'broken values' that propagate through computations. +Enso supports two notions of errors. One is the standard exceptions model (built +around `Panic.throw` and related methods), while the other is a theory of +_broken values_ that propagate through computations (represented by `Error` and +created by `Error.throw` method). > [!WARNING] The actionables for this section are: > @@ -19,65 +21,109 @@ the other is a theory of 'broken values' that propagate through computations. -- [Async Exceptions](#async-exceptions) +- [Exceptions/Panics](#errors--panics) - [Broken Values](#broken-values) -## Async Exceptions +## Exceptions/Panics > [!WARNING] The actionables for this section are: > -> - why is this called _"asynchronous"_ when the `Panic` is raised -> synchronously? -> - Formalise the model of async exceptions as implemented. +> - Formalise the model of `Panic.throw` as implemented. ## Broken Values -In Enso we have the notion of a 'broken' value: one which is in an invalid state -but not an error. While these may initially seem a touch useless, they are -actually key for the display of errors in the GUI. +In Enso we have the notion of a _broken value_: one which is in an invalid +state. Such values are very useful for displaying errors in the GUI. -Broken values can be thought of like checked monadic exceptions in Haskell, but -with an automatic propagation mechanism: +Broken values are fast to allocate and pass around the program. They record line +of their own creation - e.g. where `Error.throw` has happened. Shall that not be +enough, one can run with `-ea` flag, like: -- Broken values that aren't handled explicitly are automatically promoted - through the parent scope. This is trivial inference as no evidence discharge - will have occurred on the value. +```bash +enso$ JAVA_OPTS=-ea ./built-distribution/enso-engine-*/enso-*/bin/enso --run x.enso +``` - ```ruby - open : String -> String in IO ! IO.Exception - open = ... +to get full stack where the _broken value_ has been created. Collecting such +full stack trace however prevents the execution to run at _full speed_. - test = - print 'Opening the gates!' - txt = open 'gates.txt' - print 'Gates were opened!' - 7 - ``` +### Promotion of Broken Values - In the above example, the type of test is inferred to - `test : Int in IO ! IO.Exception`, because no evidence discharge has taken - place as the potential broken value hasn't been handled. +Broken values that aren't handled explicitly are automatically promoted through +the parent scope. Let's assume an `open` function that can yield a `Text` or +_broken value_ representing a `File_Error`: -- This allows for very natural error handling in the GUI. +```ruby +open file_name:Text -> Text ! File_Error = ... +``` -> [!WARNING] The actionables for this section are: -> -> - Determine what kinds of APIs we want to use async exceptions for, and which -> broken values are more suited for. -> - Ensure that we are okay with initially designing everything around async -> exceptions as broken values are very hard to support without a type checker. -> - Initially not supported for APIs. +Then imagine following `test` function trying to open a non-existing file +`gates.txt` + +```ruby +test = + IO.println 'Opening the gates!' + open 'gates.txt' + IO.println 'Gates were opened!' +``` + +Execution of such function will: + +- print `Opening the gates!` text +- finish with `File_Error` _broken value_ +- **not print** `Gates were opened!` + +E.g. the execution of a function body ends after first _uhandled broken value_. + +### Propagation of Broken Values -Broken values (implemented as `DataflowError` class in the interpreter) are fast -to allocate and pass around the program. They record line of their own -creation - e.g. where `Error.throw` has happened. Shall that not be enough, one -can run with `-ea` flag, like: +Let's modify the previous example a bit. Let's assign the read text (or _broken +value_) to a variable and return it from the `test` function: + +```ruby +test = + IO.println 'Opening the gates!' + content = open 'gates.txt' + IO.println 'Gates were opened!' + content +``` + +If the `gates.txt` file exists, its content is returned from the `test` +function. If a `File_Error` _broken value_ is returned from the `open` function, +then the variable `content` will contain such a _broken value_ and as `content` +is the return value from the `test` function, the `File_Error` will be returned +from the `test` function and propagated further as a _broken value_. + +In both situations (if the file exists or not) both `IO.println` statements are +executed and the execution of `test` function thus prints both +`Opening the gates!` as well as `Gates were opened!`. + +### Detection of Unused Broken Values + +Should the last statement (e.g. `content`) of the `test` function defined in +previous section be missing, then the _broken value_ assigned to `content` +variable might _"disappear"_ unnoticed. However in such a situation the Enso +compiler emits a _compile time warning_: ```bash -enso$ JAVA_OPTS=-ea ./built-distribution/enso-engine-*/enso-*/bin/enso --run x.enso +test.enso:3:3: warning: Unused variable content. + 3 | content = open 'gates.txt' + | ^~~~~~~ ``` -to get full stack where the _broken value_ has been created. Collecting such -full stack trace however prevents the execution to run at _full speed_. +The combination of _detection_, _propagation_ and _promotion_ of _broken values_ +ensures `File_Error` and other _broken values_ are **never lost** +(unintentionally). Should _loosing a broken value_ be a goal, one can change the +line in question to: + +```ruby + _ = open 'gates.txt' +``` + +e.g. assign it to anonymous variable. That signals to the system one doesn't +care about the result of the `open` function call. No _compiler warning_ is thus +reported and the _broken value_ gets lost during execution. + +To handle _broken values_ properly and recover from such an errorneous state, +use methods offered by `Standard.Base.Error` type like `catch`. diff --git a/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/semantic/DataflowErrorPropagationTest.java b/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/semantic/DataflowErrorPropagationTest.java new file mode 100644 index 000000000000..f5facc9d72d1 --- /dev/null +++ b/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/semantic/DataflowErrorPropagationTest.java @@ -0,0 +1,86 @@ +package org.enso.interpreter.test.semantic; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.enso.common.MethodNames; +import org.enso.test.utils.ContextUtils; +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.PolyglotException; +import org.graalvm.polyglot.Value; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +public class DataflowErrorPropagationTest { + private static Context ctx; + private static Value suppressError; + private static Value suppressErrorWithAssign; + + @BeforeClass + public static void prepareCtx() { + ctx = ContextUtils.createDefaultContext(); + var code = + """ + from Standard.Base import all + + private yield_error yes:Boolean -> Text = + if yes then Error.throw "Yielding an error" else + "OK" + + suppress_error yes:Boolean value = + yield_error yes + value + + suppress_error_with_assign yes:Boolean value = + _ = yield_error yes + value + """; + suppressError = + ctx.eval("enso", code).invokeMember(MethodNames.Module.EVAL_EXPRESSION, "suppress_error"); + suppressErrorWithAssign = + ctx.eval("enso", code) + .invokeMember(MethodNames.Module.EVAL_EXPRESSION, "suppress_error_with_assign"); + } + + @AfterClass + public static void disposeCtx() { + ctx.close(); + ctx = null; + } + + @Test + public void noErrorReturnValue() { + var value = suppressError.execute(false, 42); + assertTrue("It is a number", value.isNumber()); + assertEquals(42, value.asInt()); + } + + @Test + public void propagateErrorImmediatelly() { + var value = suppressError.execute(true, 42); + assertFalse("It is not a number", value.isNumber()); + assertTrue("It is an error", value.isException()); + try { + throw value.throwException(); + } catch (PolyglotException ex) { + assertEquals("Yielding an error", ex.getMessage()); + } + } + + @Test + public void noErrorReturnValueWithAssign() { + var value = suppressErrorWithAssign.execute(false, 42); + assertTrue("It is a number", value.isNumber()); + assertEquals(42, value.asInt()); + } + + @Test + public void errorIsAssignedAndThatIsEnoughReturnValue() { + var value = suppressErrorWithAssign.execute(true, 42); + assertTrue("It is a number", value.isNumber()); + assertFalse("Not an error", value.isException()); + assertEquals(42, value.asInt()); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/function/BlockNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/function/BlockNode.java index 994b68b34149..41d51a54a9ee 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/function/BlockNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/function/BlockNode.java @@ -6,9 +6,12 @@ import com.oracle.truffle.api.instrumentation.Tag; import com.oracle.truffle.api.nodes.ExplodeLoop; import com.oracle.truffle.api.nodes.NodeInfo; +import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.api.source.SourceSection; import java.util.Set; import org.enso.interpreter.node.ExpressionNode; +import org.enso.interpreter.runtime.EnsoContext; +import org.enso.interpreter.runtime.error.DataflowError; /** * This node defines the body of a function for execution, as well as the protocol for executing the @@ -16,11 +19,17 @@ */ @NodeInfo(shortName = "Block") public class BlockNode extends ExpressionNode { + private final BranchProfile unexpectedReturnValue; @Children private final ExpressionNode[] statements; @Child private ExpressionNode returnExpr; private BlockNode(ExpressionNode[] expressions, ExpressionNode returnExpr) { this.statements = expressions; + if (expressions.length > 0) { + this.unexpectedReturnValue = BranchProfile.create(); + } else { + this.unexpectedReturnValue = BranchProfile.getUncached(); + } this.returnExpr = returnExpr; } @@ -55,8 +64,16 @@ public static BlockNode buildSilent(ExpressionNode[] expressions, ExpressionNode @Override @ExplodeLoop public Object executeGeneric(VirtualFrame frame) { + var ctx = EnsoContext.get(this); + var nothing = ctx.getBuiltins().nothing(); for (ExpressionNode statement : statements) { - statement.executeGeneric(frame); + var result = statement.executeGeneric(frame); + if (result != nothing) { + unexpectedReturnValue.enter(); + if (result instanceof DataflowError err) { + return err; + } + } } return returnExpr.executeGeneric(frame); } diff --git a/test/Base_Tests/src/Data/Decimal_Spec.enso b/test/Base_Tests/src/Data/Decimal_Spec.enso index 3465ce9cd85a..98a9d096b215 100644 --- a/test/Base_Tests/src/Data/Decimal_Spec.enso +++ b/test/Base_Tests/src/Data/Decimal_Spec.enso @@ -484,10 +484,10 @@ add_specs suite_builder = (Decimal.from_integer -29388920982834 . subtract (Decimal.from_integer 842820) (Math_Context.new 7)) . should_equal (Decimal.from_integer -29388920000000) (Decimal.new "-8273762787.3535345" . subtract (Decimal.new "76287273.23434535") (Math_Context.new 10)) . should_equal (Decimal.new "-8350050061") - (Decimal.from_integer 7297927982888383 . multiply (Decimal.from_integer 828737) (Math_Context.new 6)) . should_equal (Decimal.from_integer 6048060000000000000000 ) + (Decimal.from_integer 7297927982888383 . multiply (Decimal.from_integer 828737) (Math_Context.new 6)) . should_equal (Decimal.from_integer 6048060000000000000000) (Decimal.new "893872388.3535345" . multiply (Decimal.new "72374727737.23434535") (Math_Context.new 14)) . should_equal (Decimal.new "64693770738918000000") - (Decimal.new "909678645268840" . divide (Decimal.new "28029830") (Math_Context.new 6)) . should_equal (Decimal.new "32453900 ") + (Decimal.new "909678645268840" . divide (Decimal.new "28029830") (Math_Context.new 6)) . should_equal (Decimal.new "32453900") (Decimal.new "384456406.7860325392609633764" . divide (Decimal.new "24556.125563546") (Math_Context.new 7)) . should_equal (Decimal.new "15656.23") (Decimal.from_integer 3948539458034580838458034803485 . add (Decimal.from_integer 237957498573948579387495837459837) (Math_Context.new 20)) . should_equal (Decimal.from_integer 241906038031983160230000000000000) diff --git a/test/Base_Tests/src/Data/Function_Spec.enso b/test/Base_Tests/src/Data/Function_Spec.enso index b0cd9099e11a..c808ce77d9c8 100644 --- a/test/Base_Tests/src/Data/Function_Spec.enso +++ b/test/Base_Tests/src/Data/Function_Spec.enso @@ -90,4 +90,3 @@ main filter=Nothing = suite = Test.build suite_builder-> add_specs suite_builder suite.run_with_filter filter - diff --git a/test/Base_Tests/src/Data/Range_Spec.enso b/test/Base_Tests/src/Data/Range_Spec.enso index a80a5cd52a0f..5bb3ecc8446f 100644 --- a/test/Base_Tests/src/Data/Range_Spec.enso +++ b/test/Base_Tests/src/Data/Range_Spec.enso @@ -3,6 +3,7 @@ import Standard.Base.Data.Vector.Builder import Standard.Base.Errors.Empty_Error.Empty_Error import Standard.Base.Errors.Common.Index_Out_Of_Bounds import Standard.Base.Errors.Common.No_Such_Method +import Standard.Base.Errors.Common.Not_Found import Standard.Base.Errors.Common.Type_Error import Standard.Base.Errors.Common.Unsupported_Argument_Types import Standard.Base.Errors.Illegal_Argument.Illegal_Argument @@ -250,9 +251,10 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> group_builder.specify "should find elements" <| 1.up_to 10 . find (> 5) . should_equal 6 1.up_to 10 . find (..Greater 5) . should_equal 6 - 1.up_to 10 . find (> 10) . should_be_a Nothing + 1.up_to 10 . find (> 10) . should_fail_with Not_Found 1.up_to 10 . find (v-> v%4 == 0) start=6 . should_equal 8 - 1.up_to 10 . find (< 5) start=6 . should_be_a Nothing + 1.up_to 10 . find (< 5) start=6 if_missing=Nothing . should_be_a Nothing + 1.up_to 10 . find (< 5) start=6 . should_fail_with Not_Found 1.up_to 10 . find (< 5) start=10 . should_fail_with Index_Out_Of_Bounds 1.up_to 10 . find (< 5) start=10 . catch . should_equal (Index_Out_Of_Bounds.Error 10 10) Test.expect_panic_with (1.up_to 10 . find "invalid arg") Type_Error @@ -343,7 +345,8 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r.fold 0 (+) . should_equal 0 r.any _->True . should_equal False r.all _->False . should_equal True - r.find _->True . should_equal Nothing + r.find _->True if_missing=Nothing . should_equal Nothing + r.find _->True . should_fail_with Not_Found verify_contains r [] [-1, 0, 1, 2, 10] check_empty_range (0.up_to 0) @@ -370,7 +373,7 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r1.all (_ == 10) . should_equal True r1.all (_ == 11) . should_equal False r1.find (x-> x*x == 100) . should_equal 10 - r1.find (x-> x*x == 25) . should_equal Nothing + r1.find (x-> x*x == 25) if_missing=Nothing . should_equal Nothing verify_contains r1 [10] [-1, 0, 1, 2, 9, 11, 12] group_builder.specify "should behave correctly with step greater than 1" <| @@ -387,7 +390,7 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r1.all (x-> x % 2 == 0) . should_equal True r1.all (_ == 2) . should_equal False r1.find (x-> x*x == 16) . should_equal 4 - r1.find (x-> x*x == 25) . should_equal Nothing + r1.find (x-> x*x == 25) if_missing=Nothing . should_equal Nothing verify_contains r1 [0, 2, 4, 6, 8] [-3, -2, -1, 1, 3, 5, 7, 11, 12, 13, 14] r2 = Range.Between 0 3 2 @@ -402,7 +405,7 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r2.any (_ == 3) . should_equal False r2.all (x-> x % 2 == 0) . should_equal True r2.all (_ == 2) . should_equal False - r2.find (x-> x*x == 16) . should_equal Nothing + r2.find (x-> x*x == 16) . should_fail_with Not_Found r2.find (x-> x*x == 4) . should_equal 2 verify_contains r2 [0, 2] [-3, -2, -1, 1, 3, 4, 5] @@ -418,7 +421,7 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r3.any (_ == 3) . should_equal False r3.all (_ == 5) . should_equal True r3.all (_ == 3) . should_equal False - r3.find (x-> x*x == 16) . should_equal Nothing + r3.find (x-> x*x == 16) . should_fail_with Not_Found r3.find (x-> x*x == 25) . should_equal 5 verify_contains r3 [5] [0, 1, 4, 6, 7, 10] @@ -435,7 +438,7 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r4.all (x-> x % 2 == 1) . should_equal True r4.all (_ == 5) . should_equal False r4.find (x-> x*x == 25) . should_equal 5 - r4.find (x-> x*x == 4) . should_equal Nothing + r4.find (x-> x*x == 4) if_missing=Nothing . should_equal Nothing verify_contains r4 [5, 7] [0, 1, 4, 6, 8, 10] r5 = Range.Between 5 7 2 @@ -451,7 +454,7 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r5.all (x-> x % 2 == 1) . should_equal True r5.all (_ == 5) . should_equal True r5.find (x-> x*x == 25) . should_equal 5 - r5.find (x-> x*x == 4) . should_equal Nothing + r5.find (x-> x*x == 4) if_missing=Nothing . should_equal Nothing verify_contains r5 [5] [0, 1, 4, 6, 7, 10] r6 = Range.Between 0 10 3 @@ -467,7 +470,7 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r6.all (x-> x % 2 == 0) . should_equal False r6.all (x-> x % 3 == 0) . should_equal True r6.find (x-> x*x == 9) . should_equal 3 - r6.find (x-> x*x == 25) . should_equal Nothing + r6.find (x-> x*x == 25) if_missing=Nothing . should_equal Nothing r6.filter (_ < 4) . should_equal [0, 3] verify_contains r6 [0, 3, 6, 9] [-3, -2, -1, 1, 2, 4, 5, 7, 8, 10, 11] @@ -485,7 +488,7 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r1.all (x-> x % 2 == 0) . should_equal False r1.all (_ > 0) . should_equal True r1.find (x-> x*x == 16) . should_equal 4 - r1.find (x-> x*x == 0) . should_equal Nothing + r1.find (x-> x*x == 0) if_missing=Nothing . should_equal Nothing verify_contains r1 [4, 3, 2, 1] [-2, -1, 0, 5, 6, 7, 10] r2 = Range.Between 4 0 -2 @@ -501,7 +504,7 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r2.all (x-> x % 2 == 0) . should_equal True r2.all (_ > 2) . should_equal False r2.find (x-> x*x == 16) . should_equal 4 - r2.find (x-> x*x == 0) . should_equal Nothing + r2.find (x-> x*x == 0) . should_fail_with Not_Found verify_contains r2 [4, 2] [-2, -1, 0, 1, 3, 5, 6, 7, 10] r3 = Range.Between 4 0 -10 @@ -517,7 +520,7 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r3.all (x-> x % 2 == 0) . should_equal True r3.all (_ > 4) . should_equal False r3.find (x-> x*x == 16) . should_equal 4 - r3.find (x-> x*x == 0) . should_equal Nothing + r3.find (x-> x*x == 0) . should_fail_with Not_Found verify_contains r3 [4] [-2, -1, 0, 1, 2, 3, 5, 6, 7, 10] r4 = Range.Between 3 0 -3 @@ -533,7 +536,7 @@ add_specs suite_builder = suite_builder.group "Range" group_builder-> r4.all (x-> x % 2 == 0) . should_equal False r4.all (_ > 0) . should_equal True r4.find (x-> x*x == 9) . should_equal 3 - r4.find (x-> x*x == 0) . should_equal Nothing + r4.find (x-> x*x == 0) . should_fail_with Not_Found verify_contains r4 [3] [-3, -2, -1, 0, 1, 2, 4, 5, 6, 7, 10] group_builder.specify "should report errors if trying to set step to 0" <| @@ -582,4 +585,3 @@ main filter=Nothing = suite = Test.build suite_builder-> add_specs suite_builder suite.run_with_filter filter - diff --git a/test/Base_Tests/src/Data/Time/Date_Range_Spec.enso b/test/Base_Tests/src/Data/Time/Date_Range_Spec.enso index b2b469ae1c61..9d74f3604c7b 100644 --- a/test/Base_Tests/src/Data/Time/Date_Range_Spec.enso +++ b/test/Base_Tests/src/Data/Time/Date_Range_Spec.enso @@ -1,4 +1,5 @@ from Standard.Base import all +import Standard.Base.Errors.Common.Not_Found import Standard.Base.Errors.Common.Type_Error import Standard.Base.Errors.Empty_Error.Empty_Error import Standard.Base.Errors.Illegal_Argument.Illegal_Argument @@ -157,7 +158,7 @@ add_specs suite_builder = r.partition p . should_equal (r.to_vector.partition p) r.all p . should_equal (r.to_vector.all p) r.any p . should_equal (r.to_vector.any p) - r.find p . should_equal (r.to_vector.find p) + r.find p if_missing="not found" . should_equal (r.to_vector.find p if_missing="not found") r.index_of p . should_equal (r.to_vector.index_of p) r.last_index_of p . should_equal (r.to_vector.last_index_of p) count_mondays acc date = @@ -170,7 +171,7 @@ add_specs suite_builder = r.partition fc . should_equal (r.to_vector.partition fc) r.all fc . should_equal (r.to_vector.all fc) r.any fc . should_equal (r.to_vector.any fc) - r.find fc . should_equal (r.to_vector.find fc) + r.find fc if_missing="not found" . should_equal (r.to_vector.find fc if_missing="not found") r.index_of fc . should_equal (r.to_vector.index_of fc) r.last_index_of fc . should_equal (r.to_vector.last_index_of fc) @@ -182,6 +183,9 @@ add_specs suite_builder = Test.expect_panic_with (r.index_of invalid_arg) Type_Error Test.expect_panic_with (r.last_index_of invalid_arg) Type_Error + # If `if_missing` is not provided, it defaults to `Not_Found` dataflow error + r.find (== 123) . should_fail_with Not_Found + reducer x y = if x > y then x else y case r.length of diff --git a/test/Base_Tests/src/Random_Spec.enso b/test/Base_Tests/src/Random_Spec.enso index ecb2b6ac07cb..980dc33707a2 100644 --- a/test/Base_Tests/src/Random_Spec.enso +++ b/test/Base_Tests/src/Random_Spec.enso @@ -157,4 +157,3 @@ main filter=Nothing = suite = Test.build suite_builder-> add_specs suite_builder suite.run_with_filter filter - diff --git a/test/Base_Tests/src/System/File_Spec.enso b/test/Base_Tests/src/System/File_Spec.enso index 4f56688efa4f..826771ed3de6 100644 --- a/test/Base_Tests/src/System/File_Spec.enso +++ b/test/Base_Tests/src/System/File_Spec.enso @@ -391,7 +391,7 @@ add_specs suite_builder = subdir.should_succeed cleanup = Enso_User.flush_caches - subdir.delete + subdir.delete recursive=True Panic.with_finalizer cleanup <| Test_Environment.unsafe_with_environment_override "ENSO_CLOUD_PROJECT_DIRECTORY_PATH" subdir.path <| # Flush caches to ensure fresh dir is used diff --git a/test/Table_Tests/src/Common_Table_Operations/Cross_Tab_Spec.enso b/test/Table_Tests/src/Common_Table_Operations/Cross_Tab_Spec.enso index c0d17b70a245..ad79702d5c8b 100644 --- a/test/Table_Tests/src/Common_Table_Operations/Cross_Tab_Spec.enso +++ b/test/Table_Tests/src/Common_Table_Operations/Cross_Tab_Spec.enso @@ -252,7 +252,6 @@ add_specs suite_builder setup = r1.catch.to_display_text . should_contain "cannot contain the NUL character" r2 = data.table2.cross_tab [] "Key" values=[Aggregate_Column.Average "Value" as='x\0'] - r2.print r2.should_fail_with Invalid_Column_Names r2.catch.to_display_text . should_contain "cannot contain the NUL character" diff --git a/test/Table_Tests/src/Common_Table_Operations/Nothing_Spec.enso b/test/Table_Tests/src/Common_Table_Operations/Nothing_Spec.enso index 43596f79bbd8..e929623dc265 100644 --- a/test/Table_Tests/src/Common_Table_Operations/Nothing_Spec.enso +++ b/test/Table_Tests/src/Common_Table_Operations/Nothing_Spec.enso @@ -1,4 +1,5 @@ from Standard.Base import all +import Standard.Base.Errors.Common.Incomparable_Values from Standard.Table import all @@ -257,7 +258,7 @@ add_nothing_specs suite_builder setup = other_value = triple.at 1 value_type = triple.at 2 - is_comparable = case Ordering.compare value other_value of + is_comparable = case Ordering.compare value other_value . catch Incomparable_Values of _:Ordering -> True _ -> False diff --git a/test/Table_Tests/src/Database/SQLite_Spec.enso b/test/Table_Tests/src/Database/SQLite_Spec.enso index 1c10b7d3b1ea..5ea4e8ce960b 100644 --- a/test/Table_Tests/src/Database/SQLite_Spec.enso +++ b/test/Table_Tests/src/Database/SQLite_Spec.enso @@ -3,6 +3,7 @@ import Standard.Base.Runtime.Ref.Ref from Standard.Base.Runtime import assert import Standard.Base.Errors.File_Error.File_Error import Standard.Base.Errors.Illegal_Argument.Illegal_Argument +import Standard.Base.Runtime.Context from Standard.Table import Table, Value_Type, Bits from Standard.Table.Errors import Invalid_Column_Names, Duplicate_Output_Column_Names @@ -54,8 +55,8 @@ type Metadata_Data [connection, tinfo, t] teardown self = - self.connection.drop_table self.t.name - self.connection.drop_table self.tinfo + self.connection.drop_table self.t.name if_exists=True + self.connection.drop_table self.tinfo if_exists=True self.connection.close @@ -81,9 +82,9 @@ type Tables_And_Table_Types_Data [connection, tinfo, vinfo, temporary_table] teardown self = - self.connection.drop_table self.tinfo - self.connection.drop_table self.vinfo - self.connection.drop_table self.temporary_table + self.connection.drop_table self.tinfo if_exists=True + self.connection.execute_update "DROP VIEW IF EXISTS '"+self.vinfo+"'" + self.connection.drop_table self.temporary_table if_exists=True self.connection.close @@ -377,9 +378,7 @@ type Database_File Value ~file create = Database_File.Value <| - transient_dir = enso_project.data / "transient" - assert transient_dir.exists ("The directory " + transient_dir.path + " should exist (ensured by containing a `.gitignore` file).") - f = transient_dir / "sqlite_test.db" + f = File.create_temporary_file "sqlite-test" ".db" f.delete_if_exists f @@ -388,7 +387,10 @@ create_inmem_connection = create_file_connection file = connection = Database.connect (SQLite.From_File file) - connection.execute_update 'CREATE TABLE "Dummy" ("strs" VARCHAR, "ints" INTEGER, "bools" BOOLEAN, "reals" REAL)' + ## We need to re-enable the context because this initializer may be executed + lazily in a context where Output was disabled (e.g. Upload_Spec). + Context.Output.with_enabled <| + connection.execute_update 'CREATE TABLE IF NOT EXISTS "Dummy" ("strs" VARCHAR, "ints" INTEGER, "bools" BOOLEAN, "reals" REAL)' connection type File_Connection @@ -401,10 +403,6 @@ type File_Connection assert tmp_file.exists tmp_file - teardown self = - assert self.file.exists - self.file.delete - add_specs suite_builder = in_file_prefix = "[SQLite File] " @@ -425,9 +423,6 @@ add_specs suite_builder = suite_builder.group "SQLite_Format should allow connecting to SQLite files" group_builder-> data = File_Connection.setup database_file - group_builder.teardown <| - data.teardown - group_builder.specify "should recognise a SQLite database file" <| Auto_Detect.get_reading_format data.file . should_be_a SQLite_Format diff --git a/test/Table_Tests/src/Database/Upload_Spec.enso b/test/Table_Tests/src/Database/Upload_Spec.enso index ffaa385e9e3c..dce15a1d1fbb 100644 --- a/test/Table_Tests/src/Database/Upload_Spec.enso +++ b/test/Table_Tests/src/Database/Upload_Spec.enso @@ -498,7 +498,7 @@ add_specs suite_builder setup make_new_connection persistent_connector=True = copied_table = db_table.select_into_database_table tmp_connection (Name_Generator.random_name "copied-table") temporary=False copied_table.is_trivial_query . should_be_true name = copied_table.name - Panic.with_finalizer (data.connection.drop_table name) <| + Panic.with_finalizer (data.connection.drop_table name if_exists=True) <| setup.expect_integer_type <| copied_table.at "X" copied_table.at "Y" . value_type . is_text . should_be_true copied_table.at "Z" . value_type . is_floating_point . should_be_true diff --git a/test/Table_Tests/src/IO/Fetch_Spec.enso b/test/Table_Tests/src/IO/Fetch_Spec.enso index 0e27747890c4..c4b11c1a27c6 100644 --- a/test/Table_Tests/src/IO/Fetch_Spec.enso +++ b/test/Table_Tests/src/IO/Fetch_Spec.enso @@ -4,8 +4,10 @@ import Standard.Base.Errors.Common.Response_Too_Large import Standard.Base.Errors.File_Error.File_Error import Standard.Base.Errors.Illegal_Argument.Illegal_Argument import Standard.Base.Network.HTTP.Cache_Policy.Cache_Policy +import Standard.Base.Network.HTTP.HTTP_Error.HTTP_Error import Standard.Base.Network.HTTP.Request.Request import Standard.Base.Network.HTTP.Request_Body.Request_Body +import Standard.Base.Network.HTTP.Request_Error import Standard.Base.Network.HTTP.Response.Response import Standard.Base.Runtime.Context import Standard.Base.Runtime.Ref.Ref @@ -412,11 +414,11 @@ add_specs suite_builder = group_builder.specify "Should not cache if the request fails" pending=pending_has_url <| Test.with_retries <| with_default_cache <| - HTTP.fetch url0 . decode_as_text + HTTP.fetch url0 . decode_as_text . should_succeed get_num_response_cache_entries . should_equal 1 - HTTP.fetch base_url_with_slash+'crash' . decode_as_text + HTTP.fetch base_url_with_slash+'crash' . decode_as_text . should_fail_with Request_Error get_num_response_cache_entries . should_equal 1 - HTTP.fetch base_url_with_slash+'nonexistent_endpoint' . decode_as_text + HTTP.fetch base_url_with_slash+'nonexistent_endpoint' . decode_as_text . should_fail_with HTTP_Error get_num_response_cache_entries . should_equal 1 cloud_setup = Cloud_Tests_Setup.prepare @@ -437,9 +439,9 @@ add_specs suite_builder = . add_query_argument "arg1" secret2 . add_query_argument "arg2" "plain value" - HTTP.fetch url1 . decode_as_text + HTTP.fetch url1 . decode_as_text . should_succeed get_num_response_cache_entries . should_equal 1 - HTTP.fetch uri2 . decode_as_text + HTTP.fetch uri2 . decode_as_text . should_succeed get_num_response_cache_entries . should_equal 2 group_builder.specify "Should work with secrets in the headers" pending=pending_has_url <| Test.with_retries <| @@ -455,9 +457,9 @@ add_specs suite_builder = headers1 = [Header.new "A-Header" secret1] headers2 = [Header.new "A-Header" secret2] - HTTP.fetch headers=headers1 uri . decode_as_text + HTTP.fetch headers=headers1 uri . decode_as_text . should_succeed get_num_response_cache_entries . should_equal 1 - HTTP.fetch headers=headers2 uri . decode_as_text + HTTP.fetch headers=headers2 uri . decode_as_text . should_succeed get_num_response_cache_entries . should_equal 2 group_builder.specify "Does not attempt to make room for the maximum file size when that is larger than the total cache size" pending=pending_has_url <| Test.with_retries <| diff --git a/test/Table_Tests/src/In_Memory/Split_Tokenize_Spec.enso b/test/Table_Tests/src/In_Memory/Split_Tokenize_Spec.enso index 2f365d7ce65c..bfdb332f3199 100644 --- a/test/Table_Tests/src/In_Memory/Split_Tokenize_Spec.enso +++ b/test/Table_Tests/src/In_Memory/Split_Tokenize_Spec.enso @@ -2,7 +2,7 @@ from Standard.Base import all import Standard.Test.Extensions -from Standard.Table import Table +from Standard.Table import Table, Value_Type from Standard.Table.Columns_To_Add import Columns_To_Add from Standard.Table.Errors import Invalid_Value_Type, Column_Count_Exceeded, Duplicate_Output_Column_Names, No_Such_Column from Standard.Test import all @@ -204,7 +204,7 @@ add_specs suite_builder = cols = [["foo", [0, 1, 2]], ["bar", ["abc", "cbdbef", "ghbijbu"]]] t = Table.new cols expected_rows = [[0, "a", "c", Nothing, Nothing], [1, "c", "d", "ef", Nothing], [2, "gh", "ij", "u", Nothing]] - expected = Table.from_rows ["foo", "bar 1", "bar 2", "bar 3", "bar 3"] expected_rows + expected = Table.from_rows ["foo", "bar 1", "bar 2", "bar 3", "bar 4"] expected_rows . cast "bar 4" Value_Type.Char t2 = t.split_to_columns "bar" "b" column_count=(Columns_To_Add.First 4) t2.should_equal expected t2.at "bar 3" . value_type . is_text . should_be_true @@ -213,7 +213,7 @@ add_specs suite_builder = cols = [["foo", [0, 1, 2]], ["bar", ["abc", "cbdbef", "ghbijbu"]]] t = Table.new cols expected_rows = [[0, "a", "c", Nothing, Nothing], [1, "c", "d", "ef", Nothing], [2, "gh", "ij", "u", Nothing]] - expected = Table.from_rows ["foo", "bar 1", "bar 2", "bar 3", "bar 3"] expected_rows + expected = Table.from_rows ["foo", "bar 1", "bar 2", "bar 3", "bar 4"] expected_rows . cast "bar 4" Value_Type.Char t2 = t.split_to_columns "bar" "b" column_count=4 t2.should_equal expected t2.at "bar 3" . value_type . is_text . should_be_true @@ -262,7 +262,7 @@ add_specs suite_builder = cols = [["foo", [0, 1, 2]], ["bar", ["ghbijbu", "cbdbef", "abc"]]] t = Table.new cols expected_rows = [[0, "gh", "ij", "u", Nothing], [1, "c", "d", "ef", Nothing], [2, "a", "c", Nothing, Nothing]] - expected = Table.from_rows ["foo", "bar 1", "bar 2", "bar 3", "bar 3"] expected_rows + expected = Table.from_rows ["foo", "bar 1", "bar 2", "bar 3", "bar 4"] expected_rows . cast "bar 4" Value_Type.Char t2 = t.split_to_columns "bar" "b" column_count=(Columns_To_Add.First 4) t2.should_equal expected t2.at "bar 3" . value_type . is_text . should_be_true @@ -271,7 +271,7 @@ add_specs suite_builder = cols = [["foo", [0, 1, 2]], ["bar", ["ghbijbu", "cbdbef", "abc"]]] t = Table.new cols expected_rows = [[0, "gh", "ij", "u", Nothing], [1, "c", "d", "ef", Nothing], [2, "a", "c", Nothing, Nothing]] - expected = Table.from_rows ["foo", "bar 1", "bar 2", "bar 3", "bar 3"] expected_rows + expected = Table.from_rows ["foo", "bar 1", "bar 2", "bar 3", "bar 4"] expected_rows . cast "bar 4" Value_Type.Char t2 = t.split_to_columns "bar" "b" column_count=4 t2.should_equal expected t2.at "bar 3" . value_type . is_text . should_be_true @@ -433,4 +433,3 @@ main filter=Nothing = suite = Test.build suite_builder-> add_specs suite_builder suite.run_with_filter filter - diff --git a/test/Table_Tests/src/Util.enso b/test/Table_Tests/src/Util.enso index b956fe84dd66..2976f150d6f9 100644 --- a/test/Table_Tests/src/Util.enso +++ b/test/Table_Tests/src/Util.enso @@ -1,4 +1,5 @@ from Standard.Base import all +import Standard.Base.Errors.Illegal_Argument.Illegal_Argument import Standard.Database.DB_Table.DB_Table import Standard.Database.DB_Column.DB_Column @@ -11,23 +12,27 @@ polyglot java import org.enso.base_test_helpers.FileSystemHelper Table.should_equal : Any -> Integer -> Any Table.should_equal self expected frames_to_skip=0 = loc = Meta.get_source_location 1+frames_to_skip + rhs_error_check expected Panic.catch Test_Failure_Error (table_should_equal_impl self expected loc) error-> - Test.fail error.payload.message + Test.fail error.payload.message Column.should_equal : Any -> Integer -> Any Column.should_equal self expected frames_to_skip=0 = loc = Meta.get_source_location 1+frames_to_skip + rhs_error_check expected Panic.catch Test_Failure_Error (column_should_equal_impl self expected loc) error-> Test.fail error.payload.message DB_Table.should_equal : DB_Table -> Integer -> Any DB_Table.should_equal self expected frames_to_skip=0 = + rhs_error_check expected t0 = self.read t1 = expected.read t0 . should_equal t1 frames_to_skip+1 DB_Column.should_equal : DB_Column -> Integer -> Any DB_Column.should_equal self expected frames_to_skip=0 = + rhs_error_check expected t0 = self.read t1 = expected.read t0 . should_equal t1 frames_to_skip+1 @@ -142,3 +147,14 @@ Error.should_have_relative_ordering self example = loc = Meta.get_source_location 1 _ = example Test.fail "Expected a vector but got a dataflow error "+self.catch.to_display_text+" (at "+loc+")." + + +## PRIVATE + A helper that ensures that the expected value provided in some of the Test + operations is not an error. + The left-hand side may be an error and that will cause a test failure. + But the right-hand side being an error is bad test design and should be fixed. +rhs_error_check that = + if that.is_error then + msg = "Dataflow error ("+that.to_display_text+") provided as expected value. Use `should_fail_with` or change the test."+ ' Error stack trace was:\n'+that.get_stack_trace_text + Panic.throw (Illegal_Argument.Error msg) diff --git a/test/Table_Tests/src/Util_Spec.enso b/test/Table_Tests/src/Util_Spec.enso index f8f02507d2a0..d51f3a6c8d9c 100644 --- a/test/Table_Tests/src/Util_Spec.enso +++ b/test/Table_Tests/src/Util_Spec.enso @@ -1,10 +1,59 @@ from Standard.Base import all + from Standard.Table import Column, Table -from project.Util import all + +from Standard.Database import all + from Standard.Test import all +from enso_dev.Test_Tests.Helpers import expect_test_failure + +from project.Util import all + add_specs suite_builder = - suite_builder.group "Column should_equal" group_builder-> + suite_builder.group "Table/Column.should_equal helpers" group_builder-> + group_builder.specify "should report correct location for Table" <| + r1 = expect_test_failure <| + (Table.new [["X", [1]]]) . should_equal (Table.new [["X", [2]]]) + r1.message.should_contain "Util_Spec.enso:17" + + r2 = expect_test_failure <| + (Table.new [["X", [1]]]) . should_equal (Table.new [["A", [1]]]) + r2.message.should_contain "Util_Spec.enso:21" + + group_builder.specify "should report correct location for Column" <| + r1 = expect_test_failure <| + Column.from_vector "X" [1] . should_equal (Column.from_vector "X" [2]) + r1.message.should_contain "Util_Spec.enso:26" + + r2 = expect_test_failure <| + Column.from_vector "X" [1] . should_equal (Column.from_vector "A" [1]) + r2.message.should_contain "Util_Spec.enso:30" + + group_builder.specify "should report correct location for DB_Table" <| + tables = DB_Tables.make + r1 = expect_test_failure <| + tables.t1 . should_equal tables.t2 + r1.message.should_contain "Util_Spec.enso:36" + + r2 = expect_test_failure <| + tables.t1 . should_equal tables.tA + r2.message.should_contain "Util_Spec.enso:40" + + group_builder.specify "should report correct location for DB_Column" <| + tables = DB_Tables.make + c1 = tables.t1.at "X" + c2 = tables.t2.at "X" + cA = tables.tA.at "A" + + r1 = expect_test_failure <| + c1 . should_equal c2 + r1.message.should_contain "Util_Spec.enso:50" + + r2 = expect_test_failure <| + c1 . should_equal cA + r2.message.should_contain "Util_Spec.enso:54" + group_builder.specify "Two Columns Are Equal" <| expected_column = Column.from_vector "Col" ["Quis", "custodiet", "ipsos", "custodes?"] actual_column = Column.from_vector "Col" ["Quis", "custodiet", "ipsos", "custodes?"] @@ -44,7 +93,7 @@ add_specs suite_builder = expected_column = Column.from_vector "Col" [1.0, 2.0, Number.nan] actual_column = Column.from_vector "Col" [1.0, 2.0, Number.nan] actual_column.should_equal expected_column - suite_builder.group "Table should_equal" group_builder-> + group_builder.specify "Two Tables Are Equal" <| expected_table = Table.new [Column.from_vector "Col1" ["Quis", "custodiet", "ipsos", "custodes?"], Column.from_vector "Col2" ["Who", "guards", "the", "guards?"]] actual_table = Table.new [Column.from_vector "Col1" ["Quis", "custodiet", "ipsos", "custodes?"], Column.from_vector "Col2" ["Who", "guards", "the", "guards?"]] @@ -75,6 +124,17 @@ add_specs suite_builder = res = Panic.recover Test_Failure_Error (table_should_equal_impl actual_table expected_table "LOCATION_PATH") res.catch.message.should_equal "Got a Table, but expected a 42 (at LOCATION_PATH)." +type DB_Tables + Value t1 t2 tA + + make = + connection = Database.connect ..In_Memory + t1 = (Table.new [["X", [1]]]).select_into_database_table connection "t1" + t2 = (Table.new [["X", [2]]]).select_into_database_table connection "t2" + tA = (Table.new [["A", [1]]]).select_into_database_table connection "tA" + DB_Tables.Value t1 t2 tA + + main filter=Nothing = suite = Test.build suite_builder-> add_specs suite_builder diff --git a/test/Test_Tests/package.yaml b/test/Test_Tests/package.yaml new file mode 100644 index 000000000000..2d35ea3d05a9 --- /dev/null +++ b/test/Test_Tests/package.yaml @@ -0,0 +1,7 @@ +name: Test_Tests +namespace: enso_dev +version: 0.0.1 +license: MIT +author: enso-dev@enso.org +maintainer: enso-dev@enso.org +prefer-local-libraries: true diff --git a/test/Test_Tests/src/Extensions_Spec.enso b/test/Test_Tests/src/Extensions_Spec.enso new file mode 100644 index 000000000000..afee91d94597 --- /dev/null +++ b/test/Test_Tests/src/Extensions_Spec.enso @@ -0,0 +1,86 @@ +from Standard.Base import all +import Standard.Base.Errors.Illegal_Argument.Illegal_Argument + +from Standard.Test import all + +from project.Helpers import expect_test_failure + +main filter=Nothing = + suite = Test.build suite_builder-> + add_specs suite_builder + suite.run_with_filter filter + +add_specs suite_builder = + suite_builder.group "should_equal extension method" group_builder-> + group_builder.specify "should report correct location for Text" <| + r1 = expect_test_failure <| + "a".should_equal "b" + r1.message.should_contain "Extensions_Spec.enso:17" + + group_builder.specify "should report correct location for numbers" <| + r1 = expect_test_failure <| + 1.should_equal 2 + r1.message.should_contain "Extensions_Spec.enso:22" + + r2 = expect_test_failure <| + 1.0 . should_equal 2 + r2.message.should_contain "Extensions_Spec.enso:26" + + r3 = expect_test_failure <| + 1.to_decimal . should_equal 2 + r3.message.should_contain "Extensions_Spec.enso:30" + + r4 = expect_test_failure <| + Number.nan.should_equal 2 + r4.message.should_contain "Extensions_Spec.enso:34" + + group_builder.specify "should report correct location for errors" <| + error = Error.throw (Illegal_Argument.Error "foo") + r1 = expect_test_failure <| + error.should_equal 10 + r1.message.should_contain "Extensions_Spec.enso:40" + + group_builder.specify "should panic if error is expected" <| + error = Error.throw (Illegal_Argument.Error "foo") + Test.expect_panic Illegal_Argument <| + 10.should_equal error + + suite_builder.group "should_not_equal extension method" group_builder-> + group_builder.specify "should report correct location" <| + r1 = expect_test_failure <| + 1.should_not_equal 1 + r1.message.should_contain "Extensions_Spec.enso:51" + + group_builder.specify "should report correct location for errors" <| + error = Error.throw (Illegal_Argument.Error "foo") + r1 = expect_test_failure <| + error.should_not_equal 1 + r1.message.should_contain "Extensions_Spec.enso:57" + + suite_builder.group "should_contain extension method" group_builder-> + group_builder.specify "should report correct location" <| + r1 = expect_test_failure <| + [1, 2].should_contain 3 + r1.message.should_contain "Extensions_Spec.enso:63" + + r2 = expect_test_failure <| + "abc".should_contain "d" + r2.message.should_contain "Extensions_Spec.enso:67" + + suite_builder.group "should_not_contain extension method" group_builder-> + group_builder.specify "should report correct location" <| + r1 = expect_test_failure <| + [1, 2].should_not_contain 2 + r1.message.should_contain "Extensions_Spec.enso:73" + + suite_builder.group "should_start_with extension method" group_builder-> + group_builder.specify "should report correct location" <| + r1 = expect_test_failure <| + "abc".should_start_with "d" + r1.message.should_contain "Extensions_Spec.enso:79" + + suite_builder.group "should_end_with extension method" group_builder-> + group_builder.specify "should report correct location" <| + r1 = expect_test_failure <| + "abc".should_end_with "d" + r1.message.should_contain "Extensions_Spec.enso:85" diff --git a/test/Test_Tests/src/Helpers.enso b/test/Test_Tests/src/Helpers.enso new file mode 100644 index 000000000000..beaa75f34fcb --- /dev/null +++ b/test/Test_Tests/src/Helpers.enso @@ -0,0 +1,17 @@ +from Standard.Base import all + +import Standard.Test.Spec_Result.Spec_Result +from Standard.Test import Test + +## Expects the inner action to report a test failure exception and returns its payload. +expect_test_failure ~action -> Spec_Result = + loc = Meta.get_source_location 1 + handle_panic caught_panic = + result = caught_panic.payload + case result of + Spec_Result.Failure _ _ -> result + _ -> Test.fail "Expected test failure, but "+result.to_text+" was raised as error." + + Panic.catch Spec_Result handler=handle_panic <| + action + Test.fail "Expected the inner action to fail, but there was no failure (at "+loc+")." diff --git a/test/Test_Tests/src/Main.enso b/test/Test_Tests/src/Main.enso new file mode 100644 index 000000000000..a4542f7d522b --- /dev/null +++ b/test/Test_Tests/src/Main.enso @@ -0,0 +1,13 @@ +from Standard.Base import all + +from Standard.Test import Test + +import project.Extensions_Spec + +add_specs suite_builder = + Extensions_Spec.add_specs suite_builder + +main filter=Nothing = + suite = Test.build suite_builder-> + add_specs suite_builder + suite.run_with_filter filter From c336c765cdd39bd4f0542ac75dc54463f26e125c Mon Sep 17 00:00:00 2001 From: James Dunkerley Date: Thu, 19 Dec 2024 13:07:56 +0000 Subject: [PATCH 5/9] Missed one :( (#11918) --- app/ide-desktop/client/tasks/signArchivesMacOs.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/ide-desktop/client/tasks/signArchivesMacOs.ts b/app/ide-desktop/client/tasks/signArchivesMacOs.ts index 64310fad8816..979fa51c65bc 100644 --- a/app/ide-desktop/client/tasks/signArchivesMacOs.ts +++ b/app/ide-desktop/client/tasks/signArchivesMacOs.ts @@ -106,6 +106,7 @@ async function ensoPackageSignables(resourcesDir: string): Promise { [ 'org/jline/nativ/Mac/arm64/libjlinenative.jnilib', 'org/jline/nativ/Mac/x86_64/libjlinenative.jnilib', + 'org/jline/nativ/Mac/x86/libjlinenative.jnilib', ], ], [ From 6ddd4d312aa6ead21bfa60f7185b23a2c5814329 Mon Sep 17 00:00:00 2001 From: Sergei Garin Date: Thu, 19 Dec 2024 18:27:58 +0300 Subject: [PATCH 6/9] Remove query key (#11920) This PR removes obsolet query key from URL. Closes: https://github.com/enso-org/enso/issues/11912 --- app/gui/src/dashboard/pages/authentication/Setup/Setup.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/gui/src/dashboard/pages/authentication/Setup/Setup.tsx b/app/gui/src/dashboard/pages/authentication/Setup/Setup.tsx index b9218f4376c0..435928ae0449 100644 --- a/app/gui/src/dashboard/pages/authentication/Setup/Setup.tsx +++ b/app/gui/src/dashboard/pages/authentication/Setup/Setup.tsx @@ -331,11 +331,7 @@ const BASE_STEPS: Step[] = [ iconPosition="end" onPress={() => queryClient.invalidateQueries().then(() => { - navigate( - DASHBOARD_PATH + - '?' + - new URLSearchParams({ startModalDefaultOpen: 'true' }).toString(), - ) + navigate(DASHBOARD_PATH) }) } > From 0f88ffd7dc2acb9c0fdbd0f39756bcb698d77921 Mon Sep 17 00:00:00 2001 From: James Dunkerley Date: Thu, 19 Dec 2024 16:10:19 +0000 Subject: [PATCH 7/9] Small fixes from loading doc site. (#11921) Fixes from loading docs. --- .../AWS/0.0.0-dev/src/S3/S3_File.enso | 2 +- .../lib/Standard/Base/0.0.0-dev/src/Data.enso | 2 + .../Base/0.0.0-dev/src/Data/Decimal.enso | 48 +++++++++---------- .../Database/0.0.0-dev/src/DB_Table.enso | 4 +- .../0.0.0-dev/src/Internal/Table_Helpers.enso | 3 +- .../Standard/Table/0.0.0-dev/src/Table.enso | 28 +++++------ 6 files changed, 45 insertions(+), 42 deletions(-) diff --git a/distribution/lib/Standard/AWS/0.0.0-dev/src/S3/S3_File.enso b/distribution/lib/Standard/AWS/0.0.0-dev/src/S3/S3_File.enso index 7687176f6f1d..56ddae721bfc 100644 --- a/distribution/lib/Standard/AWS/0.0.0-dev/src/S3/S3_File.enso +++ b/distribution/lib/Standard/AWS/0.0.0-dev/src/S3/S3_File.enso @@ -357,7 +357,7 @@ type S3_File ## GROUP Output ICON folder_add Within S3 the concept of creating directories has slightly different - meaning than on other filesystems. Text + meaning than on other filesystems. The `create_directory` method is provided on `S3_File` only for compatibility - to allow easy switching between file-systems. diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data.enso index 64a3c3cdcbf9..b6342f1277c6 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data.enso @@ -189,6 +189,8 @@ read_text path=(Missing_Argument.throw "path") (encoding : Encoding = Encoding.d files from the subdirectories. If set to `False` (the default), only the immediate children of the listed directory are considered. + ? Name Filter Rules + The `name_filter` can contain the following special characters: - `"?"` - which matches a single filename character (so it will not match a `"/"`). diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Decimal.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Decimal.enso index f1aeebc7a78f..01074902e679 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Decimal.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Decimal.enso @@ -1246,41 +1246,41 @@ type Decimal ## GROUP Math ICON input_number - Construct a `Decimal` from a `Text`, `Integer` or `Float`. + Construct a `Decimal` from a `Text`, `Integer` or `Float`. - Arguments: - - x: The `Text`, `Integer`, or `Float` to construct a `Decimal` from. - - mc: The `Math_Context` to use to specify precision and `Rounding_Mode`. - If a `Math_Context` is used, there is a possibility of a loss of - precision. + Arguments: + - x: The `Text`, `Integer`, or `Float` to construct a `Decimal` from. + - mc: The `Math_Context` to use to specify precision and `Rounding_Mode`. + If a `Math_Context` is used, there is a possibility of a loss of + precision. - ? Number Format + ? Number Format - The textual format for a Decimal is defined at - https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#BigDecimal-java.lang.String-. + The textual format for a Decimal is defined at + https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#BigDecimal-java.lang.String-. - ! Error Conditions + ! Error Conditions - - If the `Text` argument is incorrectly formatted, a `Number_Parse_Error` - is thrown. - - If the construction of the Decimal results in a loss of precision, a - `Loss_Of_Numeric_Precision` warning is attached. This can only happen - if a `Math_Context` value is explicitly passed. + - If the `Text` argument is incorrectly formatted, a `Number_Parse_Error` + is thrown. + - If the construction of the Decimal results in a loss of precision, a + `Loss_Of_Numeric_Precision` warning is attached. This can only happen + if a `Math_Context` value is explicitly passed. - ^ Example - Create a `Decimal` from a `Text`. + ^ Example + Create a `Decimal` from a `Text`. - c = dec "12.345" + c = dec "12.345" - ^ Example - Create a `Decimal` from an `Integer`. + ^ Example + Create a `Decimal` from an `Integer`. - c = dec 12345 + c = dec 12345 - ^ Example - Create a `Decimal` from a `Float`. + ^ Example + Create a `Decimal` from a `Float`. - c = dec 12.345 + c = dec 12.345 dec : Text | Integer | Float -> Math_Context | Nothing -> Decimal ! Arithmetic_Error | Number_Parse_Error dec (x : Text | Integer | Float) (mc : Math_Context | Nothing = Nothing) -> Decimal ! Arithmetic_Error | Number_Parse_Error = handle_java_exception <| diff --git a/distribution/lib/Standard/Database/0.0.0-dev/src/DB_Table.enso b/distribution/lib/Standard/Database/0.0.0-dev/src/DB_Table.enso index c7f658c6f780..d5f921f15d24 100644 --- a/distribution/lib/Standard/Database/0.0.0-dev/src/DB_Table.enso +++ b/distribution/lib/Standard/Database/0.0.0-dev/src/DB_Table.enso @@ -8,8 +8,8 @@ import Standard.Base.Errors.Common.Additional_Warnings import Standard.Base.Errors.Common.Floating_Point_Equality import Standard.Base.Errors.Common.Incomparable_Values import Standard.Base.Errors.Common.Index_Out_Of_Bounds -import Standard.Base.Errors.Common.Type_Error import Standard.Base.Errors.Common.Missing_Argument +import Standard.Base.Errors.Common.Type_Error import Standard.Base.Errors.Deprecated.Deprecated import Standard.Base.Errors.File_Error.File_Error import Standard.Base.Errors.Illegal_Argument.Illegal_Argument @@ -927,7 +927,7 @@ type DB_Table updated_table = renamed_table.updated_columns (renamed_table.internal_columns + [new_column]) updated_table.as_subquery - ## PRIVATE add group column, group id, bucket, tile + ## ALIAS add group column, bucket, group id, tile GROUP Standard.Base.Values ICON column_add Adds a new column to the table enumerating groups of rows, assigning each diff --git a/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Table_Helpers.enso b/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Table_Helpers.enso index 8587e5449244..6b6a0b302829 100644 --- a/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Table_Helpers.enso +++ b/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Table_Helpers.enso @@ -588,7 +588,8 @@ replace_columns_with_transformed_columns table selectors transformer error_on_mi replace_columns_with_columns table columns new_columns -## Takes a table and a list of counts and returns a new table with the rows +## PRIVATE + Takes a table and a list of counts and returns a new table with the rows duplicated according to the counts. The vector should have the same number of elements as the number of rows in the table. duplicate_rows (table : Table) (counts : Vector Integer) -> Table = diff --git a/distribution/lib/Standard/Table/0.0.0-dev/src/Table.enso b/distribution/lib/Standard/Table/0.0.0-dev/src/Table.enso index 19fa076122a4..6c90131501af 100644 --- a/distribution/lib/Standard/Table/0.0.0-dev/src/Table.enso +++ b/distribution/lib/Standard/Table/0.0.0-dev/src/Table.enso @@ -691,7 +691,7 @@ type Table result = Table.new new_columns Warning.attach (Deprecated.Warning "Standard.Table.Table.Table" "remove_columns_by_type" "Deprecated: use `remove_columns` with a `By_Type` instead.") result - ## ALIAS drop_missing_rows, dropna, remove_blank_rows, remove_empty_rows, remove_missing_rows, filter_empty_rows, drop_empty_rows + ## ALIAS drop_empty_rows, drop_missing_rows, dropna, filter_empty_rows, remove_blank_rows, remove_empty_rows, remove_missing_rows GROUP Standard.Base.Selections ICON select_column @@ -731,7 +731,7 @@ type Table new_columns = self.columns_helper.select_blank_columns_helper when treat_nans_as_blank Table.new new_columns - ## ALIAS drop_missing_columns, drop_na, select_blank_columns, select_blank_fields, select_missing_columns, select_na, filter_blank_columns + ## ALIAS drop_missing_columns, drop_na, filter_blank_columns, select_blank_columns, select_blank_fields, select_missing_columns, select_na GROUP Standard.Base.Selections ICON select_column @@ -1038,7 +1038,7 @@ type Table Warning.with_suspended new_names names-> Table.new (self.columns.map c-> c.rename (names.at c.name)) - ## ALIAS rename, header + ## ALIAS header, rename GROUP Standard.Base.Metadata ICON table_edit Returns a new table with the columns renamed based on entries in the @@ -1078,7 +1078,7 @@ type Table problem_builder.attach_problems_before on_problems <| self.drop (..First 1) . rename_columns new_names_cleaned on_problems=on_problems - ## ALIAS group by, summarize, count, count distinct, sum, average, mean, median, percentile, mode, standard deviation, variance, minimum, maximum, first, last, shortest, longest + ## ALIAS average, count, count distinct, first, group by, last, longest, maximum, mean, median, minimum, mode, percentile, shortest, standard deviation, sum, summarize, variance GROUP Standard.Base.Calculations ICON transform4 @@ -1856,7 +1856,7 @@ type Table Warning.attach (Deprecated.Warning "Standard.Table.Table.Table" "auto_value_types" "Deprecated: `auto_value_types` has been replaced by `auto_cast`.") <| self.auto_cast columns shrink_types error_on_missing_columns on_problems - ## ALIAS tokenize, parse + ## ALIAS parse, tokenize GROUP Standard.Base.Conversions ICON split Creates a new table by splitting the chosen column of text, by the @@ -1887,7 +1887,7 @@ type Table split_to_columns self column delimiter="," (column_count : Columns_To_Add = ..All_Columns) on_problems:Problem_Behavior=..Report_Warning = Split_Tokenize.split_to_columns self column delimiter column_count=column_count on_problems - ## ALIAS tokenize, parse + ## ALIAS parse, tokenize GROUP Standard.Base.Conversions ICON split Creates a new table by splitting the chosen column of text, by the @@ -1907,7 +1907,7 @@ type Table split_to_rows self column delimiter="," = Split_Tokenize.split_to_rows self column delimiter - ## ALIAS split, parse, regex + ## ALIAS parse, regex, split GROUP Standard.Base.Conversions ICON split @@ -1940,7 +1940,7 @@ type Table tokenize_to_columns self column pattern="." case_sensitivity:Case_Sensitivity=..Sensitive (column_count : Columns_To_Add = ..All_Columns) on_problems:Problem_Behavior=..Report_Warning = Split_Tokenize.tokenize_to_columns self column pattern case_sensitivity column_count on_problems - ## ALIAS split, parse, regex + ## ALIAS parse, regex, split GROUP Standard.Base.Conversions ICON split @@ -1969,7 +1969,7 @@ type Table tokenize_to_rows self column pattern="." case_sensitivity:Case_Sensitivity=..Sensitive at_least_one_row:Boolean=False = Split_Tokenize.tokenize_to_rows self column pattern case_sensitivity at_least_one_row - ## ALIAS split, tokenize, regex + ## ALIAS regex, split, tokenize GROUP Standard.Base.Conversions ICON split Converts a Text column into new columns using a regular expression @@ -2325,7 +2325,7 @@ type Table add_row_number self (name:Text="Row") (from:Integer=0) (step:Integer=1) (group_by:(Vector | Text | Integer | Regex)=[]) (order_by:(Vector | Text)=[]) (on_problems:Problem_Behavior=..Report_Warning) = Incomparable_Values.handle_errors <| Add_Row_Number.add_row_number self name from step group_by order_by on_problems - ## PRIVATE add group column, group id, bucket, tile + ## ALIAS add group column, bucket, group id, tile GROUP Standard.Base.Values ICON column_add Adds a new column to the table enumerating groups of rows, assigning each @@ -2637,7 +2637,7 @@ type Table if self.row_count == 0 then Error.throw (Index_Out_Of_Bounds.Error 0 0) else Row.Value self (self.row_count-1) - ## ALIAS merge, xlookup, vlookup, hlookup, lookup + ## ALIAS hlookup, lookup, merge, vlookup, xlookup GROUP Standard.Base.Calculations ICON join Joins two tables according to the specified join conditions. @@ -2820,7 +2820,7 @@ type Table self.java_table.crossJoin right.java_table right_prefix java_aggregator Table.Value new_java_table - ## ALIAS join, xlookup, vlookup, hlookup, lookup + ## ALIAS hlookup, join, lookup, vlookup, xlookup GROUP Standard.Base.Calculations ICON join Merges this table with a lookup table @@ -3430,7 +3430,7 @@ type Table mask = OrderMask.reverse self.row_count Table.Value <| self.java_table.applyMask mask - ## ALIAS export, save, output, to_file + ## ALIAS export, output, save, to_file GROUP Standard.Base.Output ICON data_output This function writes a table from memory into a file. @@ -3744,7 +3744,7 @@ type Table transformer col = col.text_cleanse remove Table_Helpers.replace_columns_with_transformed_columns self from transformer - ## ALIAS cumulative, count, sum, total, minimum, maximum, sum, mean, product, variance, standard deviation + ## ALIAS count, cumulative, maximum, mean, minimum, product, standard deviation, sum, sum, total, variance GROUP Standard.Base.Values ICON column_add Adds a new column to the table with a running calculation. From 071a14a894ffbcc1ed53f3c5c7a450ed661cbf52 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 19 Dec 2024 19:25:36 +0100 Subject: [PATCH 8/9] Ensure isAllTypes is compilation constant (#11913) Fixes #11901 up by making sure `isAllTypes()` is a compilation constant. --- .../node/typecheck/AbstractTypeCheckNode.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/typecheck/AbstractTypeCheckNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/typecheck/AbstractTypeCheckNode.java index 1dba321b3649..1246a3f89b90 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/typecheck/AbstractTypeCheckNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/typecheck/AbstractTypeCheckNode.java @@ -1,7 +1,9 @@ package org.enso.interpreter.node.typecheck; +import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.ExplodeLoop; import com.oracle.truffle.api.nodes.Node; import java.util.List; import org.enso.interpreter.node.ExpressionNode; @@ -29,11 +31,16 @@ abstract Object executeCheckOrConversion( abstract String expectedTypeMessage(); + @ExplodeLoop final boolean isAllTypes() { Node p = this; + CompilerAsserts.compilationConstant(p); for (; ; ) { if (p instanceof TypeCheckValueNode vn) { - return vn.isAllTypes(); + CompilerAsserts.compilationConstant(vn); + var allTypes = vn.isAllTypes(); + CompilerAsserts.compilationConstant(allTypes); + return allTypes; } p = p.getParent(); } From 6f211799da80db8b63c3e5080a98dec704c9a693 Mon Sep 17 00:00:00 2001 From: Dmitry Bushev Date: Fri, 20 Dec 2024 00:26:57 +0300 Subject: [PATCH 9/9] Update required checks (#11919) * update: required checks * update: rename GUI Packaging to IDE --- .github/workflows/engine-pull-request.yml | 2 +- .github/workflows/gui-pull-request.yml | 2 +- ...ptional.yml => ide-packaging-optional.yml} | 4 ++-- .../{gui-packaging.yml => ide-packaging.yml} | 4 ++-- ...-pull-request.yml => ide-pull-request.yml} | 20 +++++++++---------- .github/workflows/wasm-pull-request.yml | 2 +- build/build/paths.yaml | 4 ++-- build/build/src/ci_gen.rs | 16 +++++++-------- 8 files changed, 27 insertions(+), 27 deletions(-) rename .github/workflows/{gui-packaging-optional.yml => ide-packaging-optional.yml} (99%) rename .github/workflows/{gui-packaging.yml => ide-packaging.yml} (99%) rename .github/workflows/{gui-packaging-pull-request.yml => ide-pull-request.yml} (73%) diff --git a/.github/workflows/engine-pull-request.yml b/.github/workflows/engine-pull-request.yml index 47b2d7adf5f2..7231da64327d 100644 --- a/.github/workflows/engine-pull-request.yml +++ b/.github/workflows/engine-pull-request.yml @@ -36,7 +36,7 @@ jobs: secrets: inherit required-checks: - name: Required Checks + name: Engine Required Checks runs-on: ubuntu-latest needs: [engine-checks] if: always() diff --git a/.github/workflows/gui-pull-request.yml b/.github/workflows/gui-pull-request.yml index f360b23be5e5..56040e07291f 100644 --- a/.github/workflows/gui-pull-request.yml +++ b/.github/workflows/gui-pull-request.yml @@ -79,7 +79,7 @@ jobs: secrets: inherit required-checks: - name: Required Checks + name: GUI Required Checks runs-on: ubuntu-latest needs: [prettier, gui-checks, storybook] if: always() diff --git a/.github/workflows/gui-packaging-optional.yml b/.github/workflows/ide-packaging-optional.yml similarity index 99% rename from .github/workflows/gui-packaging-optional.yml rename to .github/workflows/ide-packaging-optional.yml index 4f5ab0bfd79a..300955745908 100644 --- a/.github/workflows/gui-packaging-optional.yml +++ b/.github/workflows/ide-packaging-optional.yml @@ -1,7 +1,7 @@ # This file is auto-generated. Do not edit it manually! # Edit the enso_build::ci_gen module instead and run `cargo run --package enso-build-ci-gen`. -name: GUI Packaging (Optional) +name: IDE Packaging (Optional) on: workflow_dispatch: inputs: @@ -12,7 +12,7 @@ on: default: false workflow_call: {} concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-gui-packaging-optional + group: ${{ github.workflow }}-${{ github.ref }}-ide-packaging-optional cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: enso-build-ci-gen-job-build-backend-macos-amd64: diff --git a/.github/workflows/gui-packaging.yml b/.github/workflows/ide-packaging.yml similarity index 99% rename from .github/workflows/gui-packaging.yml rename to .github/workflows/ide-packaging.yml index 52fcced5cb4e..b6a94a5150d8 100644 --- a/.github/workflows/gui-packaging.yml +++ b/.github/workflows/ide-packaging.yml @@ -1,7 +1,7 @@ # This file is auto-generated. Do not edit it manually! # Edit the enso_build::ci_gen module instead and run `cargo run --package enso-build-ci-gen`. -name: GUI Packaging +name: IDE Packaging on: workflow_dispatch: inputs: @@ -12,7 +12,7 @@ on: default: false workflow_call: {} concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-gui-packaging + group: ${{ github.workflow }}-${{ github.ref }}-ide-packaging cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: enso-build-ci-gen-job-build-backend-linux-amd64: diff --git a/.github/workflows/gui-packaging-pull-request.yml b/.github/workflows/ide-pull-request.yml similarity index 73% rename from .github/workflows/gui-packaging-pull-request.yml rename to .github/workflows/ide-pull-request.yml index f38628a231fe..f21d23266998 100644 --- a/.github/workflows/gui-packaging-pull-request.yml +++ b/.github/workflows/ide-pull-request.yml @@ -1,6 +1,6 @@ # This file is not auto-generated. Feel free to edit it. -name: ✨ GUI Packaging +name: ✨ IDE on: push: @@ -9,7 +9,7 @@ on: pull_request: concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-gui-packaging-pull-request + group: ${{ github.workflow }}-${{ github.ref }}-ide-pull-request cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: @@ -23,31 +23,31 @@ jobs: uses: ./.github/workflows/engine-changed-files.yml secrets: inherit - gui-packaging: + ide-packaging: name: 📦 Package - uses: ./.github/workflows/gui-packaging.yml + uses: ./.github/workflows/ide-packaging.yml needs: [gui-changed-files, engine-changed-files] if: needs.gui-changed-files.outputs.any_changed == 'true' || needs.engine-changed-files.outputs.any_changed == 'true' || github.ref == 'refs/heads/develop' secrets: inherit - gui-packaging-optional: + ide-packaging-optional: name: 📦 Package (Optional) - uses: ./.github/workflows/gui-packaging-optional.yml + uses: ./.github/workflows/ide-packaging-optional.yml needs: [gui-changed-files, engine-changed-files] if: needs.gui-changed-files.outputs.any_changed == 'true' || needs.engine-changed-files.outputs.any_changed == 'true' || github.ref == 'refs/heads/develop' secrets: inherit required-checks: - name: Required Checks + name: IDE Required Checks runs-on: ubuntu-latest - needs: [gui-packaging] + needs: [ide-packaging] if: always() steps: - name: Checks Summary run: | - echo "GUI Packaging: ${{ needs.gui-packaging.result }}" + echo "IDE: ${{ needs.ide-packaging.result }}" - if [[ "${{ needs.gui-packaging.result }}" == "failure" ]]; then + if [[ "${{ needs.ide-packaging.result }}" == "failure" ]]; then exit 1 fi diff --git a/.github/workflows/wasm-pull-request.yml b/.github/workflows/wasm-pull-request.yml index 18a9c6d48a1d..2f0a22b8443b 100644 --- a/.github/workflows/wasm-pull-request.yml +++ b/.github/workflows/wasm-pull-request.yml @@ -26,7 +26,7 @@ jobs: secrets: inherit required-checks: - name: Required Checks + name: WASM Required Checks runs-on: ubuntu-latest needs: [wasm-checks] if: always() diff --git a/build/build/paths.yaml b/build/build/paths.yaml index 288c22dd6efa..f5539e706ce8 100644 --- a/build/build/paths.yaml +++ b/build/build/paths.yaml @@ -11,8 +11,8 @@ engine-checks-optional.yml: engine-checks.yml: extra-nightly-tests.yml: - gui-packaging-optional.yml: - gui-packaging.yml: + ide-packaging-optional.yml: + ide-packaging.yml: nightly.yml: promote.yml: release.yml: diff --git a/build/build/src/ci_gen.rs b/build/build/src/ci_gen.rs index 6163c84baf54..f6f831b9e503 100644 --- a/build/build/src/ci_gen.rs +++ b/build/build/src/ci_gen.rs @@ -687,15 +687,15 @@ pub fn typical_check_triggers() -> Event { } } -pub fn gui_packaging() -> Result { +pub fn ide_packaging() -> Result { let on = Event { workflow_dispatch: Some(manual_workflow_dispatch()), workflow_call: Some(default()), ..default() }; let mut workflow = Workflow { - name: "GUI Packaging".into(), - concurrency: Some(concurrency("gui-packaging")), + name: "IDE Packaging".into(), + concurrency: Some(concurrency("ide-packaging")), on, ..default() }; @@ -710,15 +710,15 @@ pub fn gui_packaging() -> Result { Ok(workflow) } -pub fn gui_packaging_optional() -> Result { +pub fn ide_packaging_optional() -> Result { let on = Event { workflow_dispatch: Some(manual_workflow_dispatch()), workflow_call: Some(default()), ..default() }; let mut workflow = Workflow { - name: "GUI Packaging (Optional)".into(), - concurrency: Some(concurrency("gui-packaging-optional")), + name: "IDE Packaging (Optional)".into(), + concurrency: Some(concurrency("ide-packaging-optional")), on, ..default() }; @@ -906,8 +906,8 @@ pub fn generate( (repo_root.engine_checks_optional_yml.to_path_buf(), engine_checks_optional()?), (repo_root.engine_checks_nightly_yml.to_path_buf(), engine_checks_nightly()?), (repo_root.extra_nightly_tests_yml.to_path_buf(), extra_nightly_tests()?), - (repo_root.gui_packaging_yml.to_path_buf(), gui_packaging()?), - (repo_root.gui_packaging_optional_yml.to_path_buf(), gui_packaging_optional()?), + (repo_root.ide_packaging_yml.to_path_buf(), ide_packaging()?), + (repo_root.ide_packaging_optional_yml.to_path_buf(), ide_packaging_optional()?), (repo_root.wasm_checks_yml.to_path_buf(), wasm_checks()?), (repo_root.engine_benchmark_yml.to_path_buf(), engine_benchmark()?), (repo_root.std_libs_benchmark_yml.to_path_buf(), std_libs_benchmark()?),