Compare commits

...

4 commits

Author SHA1 Message Date
99290235f5 Add bin/deploy:rollback to go back to a previous version
While I'm messing with production builds, I keep having to rollback a
bunch, so now we finally add tooling for it, lol
2025-04-27 13:05:44 -07:00
00ec7002cb Upgrade esbuild to 0.25.3
Both just a good idea, but also I'm debugging an issue with serving the
production build of React, and I'm wondering if it's an esbuild version
issue.
2025-04-27 12:23:12 -07:00
bdd4356894 Add cached gems for x86_64
This is part of what happens when you develop on multiple devices with
different chipsets! 😅
2025-04-27 12:02:46 -07:00
a72d043659 Remove Sentry from wardrobe JS
I haven't opened Sentry in a long time, and it's clogging up my Network
logs while debugging. Let's delete some telemetry!
2025-04-27 12:02:20 -07:00
10 changed files with 229 additions and 260 deletions

View file

@ -1,6 +1,4 @@
import React from "react"; import React from "react";
import * as Sentry from "@sentry/react";
import { Integrations } from "@sentry/tracing";
import { import {
ChakraProvider, ChakraProvider,
Box, Box,
@ -43,8 +41,6 @@ const globalStyles = theme.styles.global;
theme.styles.global = {}; theme.styles.global = {};
export default function AppProvider({ children }) { export default function AppProvider({ children }) {
React.useEffect(() => setupLogging(), []);
return ( return (
<BrowserRouter> <BrowserRouter>
<QueryClientProvider client={reactQueryClient}> <QueryClientProvider client={reactQueryClient}>
@ -58,47 +54,6 @@ export default function AppProvider({ children }) {
); );
} }
function setupLogging() {
Sentry.init({
dsn: "https://c55875c3b0904264a1a99e5b741a221e@o506079.ingest.sentry.io/5595379",
autoSessionTracking: true,
integrations: [
new Integrations.BrowserTracing({
beforeNavigate: (context) => ({
...context,
// Assume any path segment starting with a digit is an ID, and replace
// it with `:id`. This will help group related routes in Sentry stats.
// NOTE: I'm a bit uncertain about the timing on this for tracking
// client-side navs... but we now only track first-time
// pageloads, and it definitely works correctly for them!
name: window.location.pathname.replaceAll(/\/[0-9][^/]*/g, "/:id"),
}),
// We have a _lot_ of location changes that don't actually signify useful
// navigations, like in the wardrobe page. It could be useful to trace
// them with better filtering someday, but frankly we don't use the perf
// features besides Web Vitals right now, and those only get tracked on
// first-time pageloads, anyway. So, don't track client-side navs!
startTransactionOnLocationChange: false,
}),
],
denyUrls: [
// Don't log errors that were probably triggered by extensions and not by
// our own app. (Apparently Sentry's setting to ignore browser extension
// errors doesn't do this anywhere near as consistently as I'd expect?)
//
// Adapted from https://gist.github.com/impressiver/5092952, as linked in
// https://docs.sentry.io/platforms/javascript/configuration/filtering/.
/^chrome-extension:\/\//,
/^moz-extension:\/\//,
],
// Since we're only tracking first-page loads and not navigations, 100%
// sampling isn't actually so much! Tune down if it becomes a problem, tho.
tracesSampleRate: 1.0,
});
}
/** /**
* ScopedCSSReset applies a copy of Chakra UI's CSS reset, but only to its * ScopedCSSReset applies a copy of Chakra UI's CSS reset, but only to its
* children (or, well, any element with the chakra-css-reset class). It also * children (or, well, any element with the chakra-css-reset class). It also

View file

@ -1,11 +1,10 @@
import React from "react"; import React from "react";
import { Box, Flex, useBreakpointValue } from "@chakra-ui/react"; import { Box, Flex, useBreakpointValue } from "@chakra-ui/react";
import * as Sentry from "@sentry/react";
import ItemsPanel from "./ItemsPanel"; import ItemsPanel from "./ItemsPanel";
import SearchToolbar, { searchQueryIsEmpty } from "./SearchToolbar"; import SearchToolbar, { searchQueryIsEmpty } from "./SearchToolbar";
import SearchPanel from "./SearchPanel"; import SearchPanel from "./SearchPanel";
import { MajorErrorMessage, TestErrorSender, useLocalStorage } from "../util"; import { ErrorBoundary, TestErrorSender, useLocalStorage } from "../util";
/** /**
* ItemsAndSearchPanels manages the shared layout and state for: * ItemsAndSearchPanels manages the shared layout and state for:
@ -40,7 +39,7 @@ function ItemsAndSearchPanels({
const isShowingSearchFooter = canUseSearchFooter && hasRoomForSearchFooter; const isShowingSearchFooter = canUseSearchFooter && hasRoomForSearchFooter;
return ( return (
<Sentry.ErrorBoundary fallback={MajorErrorMessage}> <ErrorBoundary>
<TestErrorSender /> <TestErrorSender />
<Flex direction="column" height="100%"> <Flex direction="column" height="100%">
{isShowingSearchFooter && <Box height="2" />} {isShowingSearchFooter && <Box height="2" />}
@ -85,7 +84,7 @@ function ItemsAndSearchPanels({
</Box> </Box>
)} )}
</Flex> </Flex>
</Sentry.ErrorBoundary> </ErrorBoundary>
); );
} }

View file

@ -1,8 +1,7 @@
import React from "react"; import React from "react";
import * as Sentry from "@sentry/react";
import { Box, Flex } from "@chakra-ui/react"; import { Box, Flex } from "@chakra-ui/react";
import SearchToolbar from "./SearchToolbar"; import SearchToolbar from "./SearchToolbar";
import { MajorErrorMessage, TestErrorSender, useLocalStorage } from "../util"; import { ErrorBoundary, TestErrorSender, useLocalStorage } from "../util";
import PaginationToolbar from "../components/PaginationToolbar"; import PaginationToolbar from "../components/PaginationToolbar";
import { useSearchResults } from "./useSearchResults"; import { useSearchResults } from "./useSearchResults";
@ -34,7 +33,7 @@ function SearchFooter({ searchQuery, onChangeSearchQuery, outfitState }) {
} }
return ( return (
<Sentry.ErrorBoundary fallback={MajorErrorMessage}> <ErrorBoundary>
<TestErrorSender /> <TestErrorSender />
<Box> <Box>
<Box paddingX="4" paddingY="4"> <Box paddingX="4" paddingY="4">
@ -73,7 +72,7 @@ function SearchFooter({ searchQuery, onChangeSearchQuery, outfitState }) {
</Box> </Box>
</Box> </Box>
</Box> </Box>
</Sentry.ErrorBoundary> </ErrorBoundary>
); );
} }

View file

@ -2,11 +2,10 @@ import React from "react";
import { Box, Center, DarkMode } from "@chakra-ui/react"; import { Box, Center, DarkMode } from "@chakra-ui/react";
import gql from "graphql-tag"; import gql from "graphql-tag";
import { useQuery } from "@apollo/client"; import { useQuery } from "@apollo/client";
import * as Sentry from "@sentry/react";
import OutfitThumbnail from "../components/OutfitThumbnail"; import OutfitThumbnail from "../components/OutfitThumbnail";
import { useOutfitPreview } from "../components/OutfitPreview"; import { useOutfitPreview } from "../components/OutfitPreview";
import { loadable, MajorErrorMessage, TestErrorSender } from "../util"; import { loadable, ErrorBoundary, TestErrorSender } from "../util";
const OutfitControls = loadable(() => import("./OutfitControls")); const OutfitControls = loadable(() => import("./OutfitControls"));
@ -33,7 +32,7 @@ function WardrobePreviewAndControls({
}); });
return ( return (
<Sentry.ErrorBoundary fallback={MajorErrorMessage}> <ErrorBoundary>
<TestErrorSender /> <TestErrorSender />
<Center position="absolute" top="0" bottom="0" left="0" right="0"> <Center position="absolute" top="0" bottom="0" left="0" right="0">
<DarkMode>{preview}</DarkMode> <DarkMode>{preview}</DarkMode>
@ -46,7 +45,7 @@ function WardrobePreviewAndControls({
appearance={appearance} appearance={appearance}
/> />
</Box> </Box>
</Sentry.ErrorBoundary> </ErrorBoundary>
); );
} }

View file

@ -8,7 +8,6 @@ import {
useColorModeValue, useColorModeValue,
} from "@chakra-ui/react"; } from "@chakra-ui/react";
import loadableLibrary from "@loadable/component"; import loadableLibrary from "@loadable/component";
import * as Sentry from "@sentry/react";
import { WarningIcon } from "@chakra-ui/icons"; import { WarningIcon } from "@chakra-ui/icons";
import { buildImpress2020Url } from "./impress-2020-config"; import { buildImpress2020Url } from "./impress-2020-config";
@ -414,14 +413,17 @@ export function loadable(load, options) {
} }
/** /**
* logAndCapture will print an error to the console, and send it to Sentry. * logAndCapture will print an error to the console.
*
* NOTE: Previously, this would log to Sentry, but we actually just don't log
* JS errors anymore, because we haven't done in-depth JS debugging in a
* while.
* *
* This is useful when there's a graceful recovery path, but it's still a * This is useful when there's a graceful recovery path, but it's still a
* genuinely unexpected error worth logging. * genuinely unexpected error worth logging.
*/ */
export function logAndCapture(e) { export function logAndCapture(e) {
console.error(e); console.error(e);
Sentry.captureException(e);
} }
export function getGraphQLErrorMessage(error) { export function getGraphQLErrorMessage(error) {
@ -475,8 +477,8 @@ export function MajorErrorMessage({ error = null, variant = "unexpected" }) {
<Box gridArea="description" marginBottom="2"> <Box gridArea="description" marginBottom="2">
{variant === "unexpected" && ( {variant === "unexpected" && (
<> <>
There was an error displaying this page. I'll get info about it There was an error displaying this page. If it keeps happening,
automatically, but you can tell me more at{" "} you can tell me more at{" "}
<Link href="mailto:matchu@openneo.net" color="green.400"> <Link href="mailto:matchu@openneo.net" color="green.400">
matchu@openneo.net matchu@openneo.net
</Link> </Link>
@ -523,10 +525,29 @@ export function MajorErrorMessage({ error = null, variant = "unexpected" }) {
export function TestErrorSender() { export function TestErrorSender() {
React.useEffect(() => { React.useEffect(() => {
if (window.location.href.includes("send-test-error-for-sentry")) { if (window.location.href.includes("send-test-error")) {
throw new Error("Test error for Sentry"); throw new Error("Test error for debugging <ErrorBoundary>s");
} }
}); });
return null; return null;
} }
export class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { error: null };
}
static getDerivedStateFromError(error) {
return { error };
}
render() {
if (this.state.error != null) {
return <MajorErrorMessage error={this.state.error} />;
}
return this.props.children;
}
}

3
bin/deploy:rollback Executable file
View file

@ -0,0 +1,3 @@
#!/usr/bin/env bash
# Rollback to a previous version in production.
cd $(dirname $0)/../deploy && ansible-playbook rollback.yml --extra-vars="new_app_version=$1"

71
deploy/rollback.yml Normal file
View file

@ -0,0 +1,71 @@
---
- name: Rollback impress to a previous version
hosts: webserver
become: yes
become_user: impress
vars:
remote_project_root: "/srv/impress"
ruby_version: "3.3.7"
tasks:
- name: Read the second-to-most-recent version
command:
chdir: "{{ remote_project_root }}/versions"
cmd: bash -c 'ls | tail -n 2 | head -n 1'
register: new_app_version
- name: Print out the new version name
debug:
msg: "Rolling back to version: {{ new_app_version.stdout }}"
- name: Save new remote folder path to a variable
set_fact:
remote_app_root: "{{ remote_project_root }}/versions/{{ new_app_version.stdout }}"
- name: Configure Bundler to run in deployment mode
command:
chdir: "{{ remote_app_root }}"
cmd: /opt/ruby-{{ ruby_version }}/bin/bundle config set --local deployment true
# This ensures that, while attempting our current deploy, we don't
# accidentally delete gems out from under the currently-running version.
# NOTE: From reading the docs, I thiink this is the default behavior, but
# I can't be sure? Rather than deep-dive to find out, I'd rather just set
# it, to be clear about the default(?) behavior we're depending on.
- name: Configure Bundler to *not* clean up old gems when installing
command:
chdir: "{{ remote_app_root }}"
cmd: /opt/ruby-{{ ruby_version }}/bin/bundle config set --local clean false
# NOTE: Bundler recommends this, and they're pretty smart about it: if the
# Gemfile changes, this shouldn't disrupt the currently-running version,
# because we won't clean up its now-unused gems yet, and if we upgrade a
# gem it'll install *both* versions of the gem until we clean up.
- name: Configure Bundler to use the bundle folder shared by all app versions
command:
chdir: "{{ remote_app_root }}"
cmd: "/opt/ruby-{{ ruby_version }}/bin/bundle config set --local path {{ remote_project_root}}/shared/bundle"
- name: Run `bundle install` to install dependencies in remote folder
command:
chdir: "{{ remote_app_root }}"
# The `--local` flag instructs Bundler to use the cached dependencies
# in `vendor/cache`, instead of reading from the web, which is much
# faster and more reliable!
cmd: /opt/ruby-{{ ruby_version }}/bin/bundle install --local
- name: Update the `current` folder to point to the new version
file:
src: "{{ remote_app_root }}"
dest: /srv/impress/current
state: link
# NOTE: This uses the passwordless sudo rule we set up in deploy:setup.
# We write it as a command rather than using the built-in `systemd` Ansible
# module, to make sure we're invoking it exactly as we wrote in that rule.
#
# NOTE: We use `sudo` instead of `become_user: root`, because we don't have
# permission to *become* the root user; we only have permission to run this
# one command as them.
- name: Restart the app
become: no
command: sudo systemctl restart impress

View file

@ -9,12 +9,9 @@
"@emotion/styled": "^11.0.0", "@emotion/styled": "^11.0.0",
"@hotwired/turbo-rails": "^8.0.4", "@hotwired/turbo-rails": "^8.0.4",
"@loadable/component": "^5.12.0", "@loadable/component": "^5.12.0",
"@sentry/react": "^5.30.0",
"@sentry/tracing": "^5.30.0",
"@tanstack/react-query": "^5.4.3", "@tanstack/react-query": "^5.4.3",
"apollo-link-persisted-queries": "^0.2.2", "apollo-link-persisted-queries": "^0.2.2",
"easeljs": "^1.0.2", "easeljs": "^1.0.2",
"esbuild": "^0.19.0",
"framer-motion": "^4.1.11", "framer-motion": "^4.1.11",
"graphql": "^15.5.0", "graphql": "^15.5.0",
"graphql-tag": "^2.12.6", "graphql-tag": "^2.12.6",
@ -31,6 +28,7 @@
"devDependencies": { "devDependencies": {
"@typescript-eslint/eslint-plugin": "^7.8.0", "@typescript-eslint/eslint-plugin": "^7.8.0",
"@typescript-eslint/parser": "^7.8.0", "@typescript-eslint/parser": "^7.8.0",
"esbuild": "^0.25.3",
"eslint": "^8.52.0", "eslint": "^8.52.0",
"eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-react": "^7.33.2", "eslint-plugin-react": "^7.33.2",

Binary file not shown.

310
yarn.lock
View file

@ -1120,163 +1120,177 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/aix-ppc64@npm:0.19.12": "@esbuild/aix-ppc64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/aix-ppc64@npm:0.19.12" resolution: "@esbuild/aix-ppc64@npm:0.25.3"
conditions: os=aix & cpu=ppc64 conditions: os=aix & cpu=ppc64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-arm64@npm:0.19.12": "@esbuild/android-arm64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/android-arm64@npm:0.19.12" resolution: "@esbuild/android-arm64@npm:0.25.3"
conditions: os=android & cpu=arm64 conditions: os=android & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-arm@npm:0.19.12": "@esbuild/android-arm@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/android-arm@npm:0.19.12" resolution: "@esbuild/android-arm@npm:0.25.3"
conditions: os=android & cpu=arm conditions: os=android & cpu=arm
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-x64@npm:0.19.12": "@esbuild/android-x64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/android-x64@npm:0.19.12" resolution: "@esbuild/android-x64@npm:0.25.3"
conditions: os=android & cpu=x64 conditions: os=android & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/darwin-arm64@npm:0.19.12": "@esbuild/darwin-arm64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/darwin-arm64@npm:0.19.12" resolution: "@esbuild/darwin-arm64@npm:0.25.3"
conditions: os=darwin & cpu=arm64 conditions: os=darwin & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/darwin-x64@npm:0.19.12": "@esbuild/darwin-x64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/darwin-x64@npm:0.19.12" resolution: "@esbuild/darwin-x64@npm:0.25.3"
conditions: os=darwin & cpu=x64 conditions: os=darwin & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/freebsd-arm64@npm:0.19.12": "@esbuild/freebsd-arm64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/freebsd-arm64@npm:0.19.12" resolution: "@esbuild/freebsd-arm64@npm:0.25.3"
conditions: os=freebsd & cpu=arm64 conditions: os=freebsd & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/freebsd-x64@npm:0.19.12": "@esbuild/freebsd-x64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/freebsd-x64@npm:0.19.12" resolution: "@esbuild/freebsd-x64@npm:0.25.3"
conditions: os=freebsd & cpu=x64 conditions: os=freebsd & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-arm64@npm:0.19.12": "@esbuild/linux-arm64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/linux-arm64@npm:0.19.12" resolution: "@esbuild/linux-arm64@npm:0.25.3"
conditions: os=linux & cpu=arm64 conditions: os=linux & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-arm@npm:0.19.12": "@esbuild/linux-arm@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/linux-arm@npm:0.19.12" resolution: "@esbuild/linux-arm@npm:0.25.3"
conditions: os=linux & cpu=arm conditions: os=linux & cpu=arm
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-ia32@npm:0.19.12": "@esbuild/linux-ia32@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/linux-ia32@npm:0.19.12" resolution: "@esbuild/linux-ia32@npm:0.25.3"
conditions: os=linux & cpu=ia32 conditions: os=linux & cpu=ia32
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-loong64@npm:0.19.12": "@esbuild/linux-loong64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/linux-loong64@npm:0.19.12" resolution: "@esbuild/linux-loong64@npm:0.25.3"
conditions: os=linux & cpu=loong64 conditions: os=linux & cpu=loong64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-mips64el@npm:0.19.12": "@esbuild/linux-mips64el@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/linux-mips64el@npm:0.19.12" resolution: "@esbuild/linux-mips64el@npm:0.25.3"
conditions: os=linux & cpu=mips64el conditions: os=linux & cpu=mips64el
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-ppc64@npm:0.19.12": "@esbuild/linux-ppc64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/linux-ppc64@npm:0.19.12" resolution: "@esbuild/linux-ppc64@npm:0.25.3"
conditions: os=linux & cpu=ppc64 conditions: os=linux & cpu=ppc64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-riscv64@npm:0.19.12": "@esbuild/linux-riscv64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/linux-riscv64@npm:0.19.12" resolution: "@esbuild/linux-riscv64@npm:0.25.3"
conditions: os=linux & cpu=riscv64 conditions: os=linux & cpu=riscv64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-s390x@npm:0.19.12": "@esbuild/linux-s390x@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/linux-s390x@npm:0.19.12" resolution: "@esbuild/linux-s390x@npm:0.25.3"
conditions: os=linux & cpu=s390x conditions: os=linux & cpu=s390x
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-x64@npm:0.19.12": "@esbuild/linux-x64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/linux-x64@npm:0.19.12" resolution: "@esbuild/linux-x64@npm:0.25.3"
conditions: os=linux & cpu=x64 conditions: os=linux & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/netbsd-x64@npm:0.19.12": "@esbuild/netbsd-arm64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/netbsd-x64@npm:0.19.12" resolution: "@esbuild/netbsd-arm64@npm:0.25.3"
conditions: os=netbsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/netbsd-x64@npm:0.25.3":
version: 0.25.3
resolution: "@esbuild/netbsd-x64@npm:0.25.3"
conditions: os=netbsd & cpu=x64 conditions: os=netbsd & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/openbsd-x64@npm:0.19.12": "@esbuild/openbsd-arm64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/openbsd-x64@npm:0.19.12" resolution: "@esbuild/openbsd-arm64@npm:0.25.3"
conditions: os=openbsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/openbsd-x64@npm:0.25.3":
version: 0.25.3
resolution: "@esbuild/openbsd-x64@npm:0.25.3"
conditions: os=openbsd & cpu=x64 conditions: os=openbsd & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/sunos-x64@npm:0.19.12": "@esbuild/sunos-x64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/sunos-x64@npm:0.19.12" resolution: "@esbuild/sunos-x64@npm:0.25.3"
conditions: os=sunos & cpu=x64 conditions: os=sunos & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-arm64@npm:0.19.12": "@esbuild/win32-arm64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/win32-arm64@npm:0.19.12" resolution: "@esbuild/win32-arm64@npm:0.25.3"
conditions: os=win32 & cpu=arm64 conditions: os=win32 & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-ia32@npm:0.19.12": "@esbuild/win32-ia32@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/win32-ia32@npm:0.19.12" resolution: "@esbuild/win32-ia32@npm:0.25.3"
conditions: os=win32 & cpu=ia32 conditions: os=win32 & cpu=ia32
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-x64@npm:0.19.12": "@esbuild/win32-x64@npm:0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "@esbuild/win32-x64@npm:0.19.12" resolution: "@esbuild/win32-x64@npm:0.25.3"
conditions: os=win32 & cpu=x64 conditions: os=win32 & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
@ -1477,100 +1491,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@sentry/browser@npm:5.30.0":
version: 5.30.0
resolution: "@sentry/browser@npm:5.30.0"
dependencies:
"@sentry/core": "npm:5.30.0"
"@sentry/types": "npm:5.30.0"
"@sentry/utils": "npm:5.30.0"
tslib: "npm:^1.9.3"
checksum: 10c0/6793e1b49a8cdb1f025115bcc591bf67c97b6515f62a33ffcbb7b1ab66e459ebc471797d02e471be1ebf14092b56eb25ed914f043962388cc224bc961e334a17
languageName: node
linkType: hard
"@sentry/core@npm:5.30.0":
version: 5.30.0
resolution: "@sentry/core@npm:5.30.0"
dependencies:
"@sentry/hub": "npm:5.30.0"
"@sentry/minimal": "npm:5.30.0"
"@sentry/types": "npm:5.30.0"
"@sentry/utils": "npm:5.30.0"
tslib: "npm:^1.9.3"
checksum: 10c0/6407b9c2a6a56f90c198f5714b3257df24d89d1b4ca6726bd44760d0adabc25798b69fef2c88ccea461c7e79e3c78861aaebfd51fd3cb892aee656c3f7e11801
languageName: node
linkType: hard
"@sentry/hub@npm:5.30.0":
version: 5.30.0
resolution: "@sentry/hub@npm:5.30.0"
dependencies:
"@sentry/types": "npm:5.30.0"
"@sentry/utils": "npm:5.30.0"
tslib: "npm:^1.9.3"
checksum: 10c0/386c91d06aa44be0465fc11330d748a113e464d41cd562a9e1d222a682cbcb14e697a3e640953e7a0239997ad8a02b223a0df3d9e1d8816cb823fd3613be3e2f
languageName: node
linkType: hard
"@sentry/minimal@npm:5.30.0":
version: 5.30.0
resolution: "@sentry/minimal@npm:5.30.0"
dependencies:
"@sentry/hub": "npm:5.30.0"
"@sentry/types": "npm:5.30.0"
tslib: "npm:^1.9.3"
checksum: 10c0/34ec05503de46d01f98c94701475d5d89cc044892c86ccce30e01f62f28344eb23b718e7cf573815e46f30a4ac9da3129bed9b3d20c822938acfb40cbe72437b
languageName: node
linkType: hard
"@sentry/react@npm:^5.30.0":
version: 5.30.0
resolution: "@sentry/react@npm:5.30.0"
dependencies:
"@sentry/browser": "npm:5.30.0"
"@sentry/minimal": "npm:5.30.0"
"@sentry/types": "npm:5.30.0"
"@sentry/utils": "npm:5.30.0"
hoist-non-react-statics: "npm:^3.3.2"
tslib: "npm:^1.9.3"
peerDependencies:
react: 15.x || 16.x || 17.x
react-dom: 15.x || 16.x || 17.x
checksum: 10c0/2a80eb40038ac3d9b2ff9346cfecb39a248a14fedfc45ca5f32a4194620ea6dccf9f53ccc43c6d151687178e4741f80e4218c5e0ac66e174c341088a30517abf
languageName: node
linkType: hard
"@sentry/tracing@npm:^5.30.0":
version: 5.30.0
resolution: "@sentry/tracing@npm:5.30.0"
dependencies:
"@sentry/hub": "npm:5.30.0"
"@sentry/minimal": "npm:5.30.0"
"@sentry/types": "npm:5.30.0"
"@sentry/utils": "npm:5.30.0"
tslib: "npm:^1.9.3"
checksum: 10c0/46830265bc54a3203d7d9f0d8d9f2f7d9d2c6a977e07ccdae317fa3ea29c388b904b3bef28f7a0ba9c074845d67feab63c6d3c0ddce9aeb275b6c966253fb415
languageName: node
linkType: hard
"@sentry/types@npm:5.30.0":
version: 5.30.0
resolution: "@sentry/types@npm:5.30.0"
checksum: 10c0/99c6e55c0a82c8ca95be2e9dbb35f581b29e4ff7af74b23bc62b690de4e35febfa15868184a2303480ef86babd4fea5273cf3b5ddf4a27685b841a72f13a0c88
languageName: node
linkType: hard
"@sentry/utils@npm:5.30.0":
version: 5.30.0
resolution: "@sentry/utils@npm:5.30.0"
dependencies:
"@sentry/types": "npm:5.30.0"
tslib: "npm:^1.9.3"
checksum: 10c0/ca8eebfea7ac7db6d16f6c0b8a66ac62587df12a79ce9d0d8393f4d69880bb8d40d438f9810f7fb107a9880fe0d68bbf797b89cbafd113e89a0829eb06b205f8
languageName: node
linkType: hard
"@tanstack/query-core@npm:5.32.1": "@tanstack/query-core@npm:5.32.1":
version: 5.32.1 version: 5.32.1
resolution: "@tanstack/query-core@npm:5.32.1" resolution: "@tanstack/query-core@npm:5.32.1"
@ -2731,33 +2651,35 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"esbuild@npm:^0.19.0": "esbuild@npm:^0.25.3":
version: 0.19.12 version: 0.25.3
resolution: "esbuild@npm:0.19.12" resolution: "esbuild@npm:0.25.3"
dependencies: dependencies:
"@esbuild/aix-ppc64": "npm:0.19.12" "@esbuild/aix-ppc64": "npm:0.25.3"
"@esbuild/android-arm": "npm:0.19.12" "@esbuild/android-arm": "npm:0.25.3"
"@esbuild/android-arm64": "npm:0.19.12" "@esbuild/android-arm64": "npm:0.25.3"
"@esbuild/android-x64": "npm:0.19.12" "@esbuild/android-x64": "npm:0.25.3"
"@esbuild/darwin-arm64": "npm:0.19.12" "@esbuild/darwin-arm64": "npm:0.25.3"
"@esbuild/darwin-x64": "npm:0.19.12" "@esbuild/darwin-x64": "npm:0.25.3"
"@esbuild/freebsd-arm64": "npm:0.19.12" "@esbuild/freebsd-arm64": "npm:0.25.3"
"@esbuild/freebsd-x64": "npm:0.19.12" "@esbuild/freebsd-x64": "npm:0.25.3"
"@esbuild/linux-arm": "npm:0.19.12" "@esbuild/linux-arm": "npm:0.25.3"
"@esbuild/linux-arm64": "npm:0.19.12" "@esbuild/linux-arm64": "npm:0.25.3"
"@esbuild/linux-ia32": "npm:0.19.12" "@esbuild/linux-ia32": "npm:0.25.3"
"@esbuild/linux-loong64": "npm:0.19.12" "@esbuild/linux-loong64": "npm:0.25.3"
"@esbuild/linux-mips64el": "npm:0.19.12" "@esbuild/linux-mips64el": "npm:0.25.3"
"@esbuild/linux-ppc64": "npm:0.19.12" "@esbuild/linux-ppc64": "npm:0.25.3"
"@esbuild/linux-riscv64": "npm:0.19.12" "@esbuild/linux-riscv64": "npm:0.25.3"
"@esbuild/linux-s390x": "npm:0.19.12" "@esbuild/linux-s390x": "npm:0.25.3"
"@esbuild/linux-x64": "npm:0.19.12" "@esbuild/linux-x64": "npm:0.25.3"
"@esbuild/netbsd-x64": "npm:0.19.12" "@esbuild/netbsd-arm64": "npm:0.25.3"
"@esbuild/openbsd-x64": "npm:0.19.12" "@esbuild/netbsd-x64": "npm:0.25.3"
"@esbuild/sunos-x64": "npm:0.19.12" "@esbuild/openbsd-arm64": "npm:0.25.3"
"@esbuild/win32-arm64": "npm:0.19.12" "@esbuild/openbsd-x64": "npm:0.25.3"
"@esbuild/win32-ia32": "npm:0.19.12" "@esbuild/sunos-x64": "npm:0.25.3"
"@esbuild/win32-x64": "npm:0.19.12" "@esbuild/win32-arm64": "npm:0.25.3"
"@esbuild/win32-ia32": "npm:0.25.3"
"@esbuild/win32-x64": "npm:0.25.3"
dependenciesMeta: dependenciesMeta:
"@esbuild/aix-ppc64": "@esbuild/aix-ppc64":
optional: true optional: true
@ -2793,8 +2715,12 @@ __metadata:
optional: true optional: true
"@esbuild/linux-x64": "@esbuild/linux-x64":
optional: true optional: true
"@esbuild/netbsd-arm64":
optional: true
"@esbuild/netbsd-x64": "@esbuild/netbsd-x64":
optional: true optional: true
"@esbuild/openbsd-arm64":
optional: true
"@esbuild/openbsd-x64": "@esbuild/openbsd-x64":
optional: true optional: true
"@esbuild/sunos-x64": "@esbuild/sunos-x64":
@ -2807,7 +2733,7 @@ __metadata:
optional: true optional: true
bin: bin:
esbuild: bin/esbuild esbuild: bin/esbuild
checksum: 10c0/0f2d21ffe24ebead64843f87c3aebe2e703a5ed9feb086a0728b24907fac2eb9923e4a79857d3df9059c915739bd7a870dd667972eae325c67f478b592b8582d checksum: 10c0/127aff654310ede4e2eb232a7b1d8823f5b5d69222caf17aa7f172574a5b6b75f71ce78c6d8a40030421d7c75b784dc640de0fb1b87b7ea77ab2a1c832fa8df8
languageName: node languageName: node
linkType: hard linkType: hard
@ -3557,14 +3483,12 @@ __metadata:
"@emotion/styled": "npm:^11.0.0" "@emotion/styled": "npm:^11.0.0"
"@hotwired/turbo-rails": "npm:^8.0.4" "@hotwired/turbo-rails": "npm:^8.0.4"
"@loadable/component": "npm:^5.12.0" "@loadable/component": "npm:^5.12.0"
"@sentry/react": "npm:^5.30.0"
"@sentry/tracing": "npm:^5.30.0"
"@tanstack/react-query": "npm:^5.4.3" "@tanstack/react-query": "npm:^5.4.3"
"@typescript-eslint/eslint-plugin": "npm:^7.8.0" "@typescript-eslint/eslint-plugin": "npm:^7.8.0"
"@typescript-eslint/parser": "npm:^7.8.0" "@typescript-eslint/parser": "npm:^7.8.0"
apollo-link-persisted-queries: "npm:^0.2.2" apollo-link-persisted-queries: "npm:^0.2.2"
easeljs: "npm:^1.0.2" easeljs: "npm:^1.0.2"
esbuild: "npm:^0.19.0" esbuild: "npm:^0.25.3"
eslint: "npm:^8.52.0" eslint: "npm:^8.52.0"
eslint-plugin-jsx-a11y: "npm:^6.8.0" eslint-plugin-jsx-a11y: "npm:^6.8.0"
eslint-plugin-react: "npm:^7.33.2" eslint-plugin-react: "npm:^7.33.2"