From fb50eea20c499f7c4bd56388602f6bfbb744acad Mon Sep 17 00:00:00 2001 From: tylerbarna Date: Tue, 12 Nov 2024 13:21:12 -0600 Subject: [PATCH 01/60] add in-page lucene docs --- .../circulars._archive._index/LuceneMenu.tsx | 19 +++++++++++++++++++ .../circulars._archive._index/route.tsx | 4 +++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 app/routes/circulars._archive._index/LuceneMenu.tsx diff --git a/app/routes/circulars._archive._index/LuceneMenu.tsx b/app/routes/circulars._archive._index/LuceneMenu.tsx new file mode 100644 index 000000000..e499844aa --- /dev/null +++ b/app/routes/circulars._archive._index/LuceneMenu.tsx @@ -0,0 +1,19 @@ +import { Link } from '@remix-run/react' + +export function LuceneAccordion() { + return ( +
+ Advanced Search + +
+ To narrow the search results, use Lucene search syntax. This allows for + specifying which circular field to search (submitter, subject, and/or + body). Further documentation can be found on the{' '} + + Lucene Search Syntax Page + + {'. '} +
+
+ ) +} diff --git a/app/routes/circulars._archive._index/route.tsx b/app/routes/circulars._archive._index/route.tsx index 005443b3a..717c55735 100644 --- a/app/routes/circulars._archive._index/route.tsx +++ b/app/routes/circulars._archive._index/route.tsx @@ -37,6 +37,7 @@ import { import CircularsHeader from './CircularsHeader' import CircularsIndex from './CircularsIndex' import { DateSelector } from './DateSelectorMenu' +import { LuceneAccordion } from './LuceneMenu' import { SortSelector } from './SortSelectorButton' import Hint from '~/components/Hint' import { ToolbarButtonGroup } from '~/components/ToolbarButtonGroup' @@ -44,7 +45,7 @@ import PaginationSelectionFooter from '~/components/pagination/PaginationSelecti import { origin } from '~/lib/env.server' import { getFormDataString } from '~/lib/utils' import { postZendeskRequest } from '~/lib/zendesk.server' -import { useModStatus } from '~/root' +import { useFeature, useModStatus } from '~/root' import searchImg from 'nasawds/src/img/usa-icons-bg/search--white.svg' @@ -271,6 +272,7 @@ export default function () { To navigate to a specific circular, enter the associated Circular ID (e.g. 'gcn123', 'Circular 123', or '123'). + {useFeature('CIRCULARS_LUCENE') && } {clean && ( <> Date: Sun, 8 Dec 2024 14:19:22 -0600 Subject: [PATCH 02/60] add lucene examples back this restores the lucene example buttons, but rather than populating the search bar, this copies them to the clipboard. There is not a visual feedback for this at the moment, but something like (https://remix.run/resources/remix-toast)[this] could be useful --- .../circulars._archive._index/LuceneMenu.tsx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/routes/circulars._archive._index/LuceneMenu.tsx b/app/routes/circulars._archive._index/LuceneMenu.tsx index e499844aa..1c197f4f4 100644 --- a/app/routes/circulars._archive._index/LuceneMenu.tsx +++ b/app/routes/circulars._archive._index/LuceneMenu.tsx @@ -1,6 +1,17 @@ import { Link } from '@remix-run/react' +import { Button } from '@trussworks/react-uswds' +import CopyToClipboard from 'react-copy-to-clipboard' export function LuceneAccordion() { + function copyableButton(text: string) { + return ( + + + + ) + } return (
Advanced Search @@ -13,6 +24,12 @@ export function LuceneAccordion() { Lucene Search Syntax Page {'. '} +

Lucene Examples (click to copy):

+
+ {copyableButton('subject:"Swift"')} + {copyableButton('body:"GRB"')} + {copyableButton('submitter:"Tomas Ahumada Mena"')} +
) From 4cdd37a8f2c6c0fc9c7d89de7aa423173f9baa4c Mon Sep 17 00:00:00 2001 From: Tyler Barna Date: Thu, 12 Dec 2024 12:54:52 -0600 Subject: [PATCH 03/60] add copyright --- app/routes/circulars._archive._index/LuceneMenu.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/routes/circulars._archive._index/LuceneMenu.tsx b/app/routes/circulars._archive._index/LuceneMenu.tsx index 1c197f4f4..465c9d3e4 100644 --- a/app/routes/circulars._archive._index/LuceneMenu.tsx +++ b/app/routes/circulars._archive._index/LuceneMenu.tsx @@ -1,3 +1,10 @@ +/*! + * Copyright © 2023 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ import { Link } from '@remix-run/react' import { Button } from '@trussworks/react-uswds' import CopyToClipboard from 'react-copy-to-clipboard' From 6361cc6844758ca7245051e2be4b38f67246ed09 Mon Sep 17 00:00:00 2001 From: Tyler Barna Date: Thu, 12 Dec 2024 12:57:08 -0600 Subject: [PATCH 04/60] correct link to further docs --- app/routes/circulars._archive._index/LuceneMenu.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/routes/circulars._archive._index/LuceneMenu.tsx b/app/routes/circulars._archive._index/LuceneMenu.tsx index 465c9d3e4..1d82debf1 100644 --- a/app/routes/circulars._archive._index/LuceneMenu.tsx +++ b/app/routes/circulars._archive._index/LuceneMenu.tsx @@ -27,7 +27,7 @@ export function LuceneAccordion() { To narrow the search results, use Lucene search syntax. This allows for specifying which circular field to search (submitter, subject, and/or body). Further documentation can be found on the{' '} - + Lucene Search Syntax Page {'. '} From 4877cd8ff0d8a76b6253ca0f7ba79d120810c8f1 Mon Sep 17 00:00:00 2001 From: Tyler Barna Date: Thu, 12 Dec 2024 13:01:39 -0600 Subject: [PATCH 05/60] remove reference to "page" --- app/routes/circulars._archive._index/LuceneMenu.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/routes/circulars._archive._index/LuceneMenu.tsx b/app/routes/circulars._archive._index/LuceneMenu.tsx index 1d82debf1..9c185fa69 100644 --- a/app/routes/circulars._archive._index/LuceneMenu.tsx +++ b/app/routes/circulars._archive._index/LuceneMenu.tsx @@ -26,9 +26,9 @@ export function LuceneAccordion() {
To narrow the search results, use Lucene search syntax. This allows for specifying which circular field to search (submitter, subject, and/or - body). Further documentation can be found on the{' '} + body). Further documentation can be found{' '} - Lucene Search Syntax Page + here {'. '}

Lucene Examples (click to copy):

From a5b7d414fd18175add74463472bd4b687980b965 Mon Sep 17 00:00:00 2001 From: Tyler Barna Date: Thu, 12 Dec 2024 13:03:00 -0600 Subject: [PATCH 06/60] remove unneeded div --- .../circulars._archive._index/LuceneMenu.tsx | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/app/routes/circulars._archive._index/LuceneMenu.tsx b/app/routes/circulars._archive._index/LuceneMenu.tsx index 9c185fa69..9907761fe 100644 --- a/app/routes/circulars._archive._index/LuceneMenu.tsx +++ b/app/routes/circulars._archive._index/LuceneMenu.tsx @@ -22,21 +22,18 @@ export function LuceneAccordion() { return (
Advanced Search - + To narrow the search results, use Lucene search syntax. This allows for + specifying which circular field to search (submitter, subject, and/or + body). Further documentation can be found{' '} + + here + + {'. '} +

Lucene Examples (click to copy):

- To narrow the search results, use Lucene search syntax. This allows for - specifying which circular field to search (submitter, subject, and/or - body). Further documentation can be found{' '} - - here - - {'. '} -

Lucene Examples (click to copy):

-
- {copyableButton('subject:"Swift"')} - {copyableButton('body:"GRB"')} - {copyableButton('submitter:"Tomas Ahumada Mena"')} -
+ {copyableButton('subject:"Swift"')} + {copyableButton('body:"GRB"')} + {copyableButton('submitter:"Tomas Ahumada Mena"')}
) From 7e6a6fdfba10a1d903915316ba3fa0e5374b82c7 Mon Sep 17 00:00:00 2001 From: Tyler Barna Date: Thu, 12 Dec 2024 13:11:56 -0600 Subject: [PATCH 07/60] correct merge with main --- .../circulars._archive._index/route.tsx | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/app/routes/circulars._archive._index/route.tsx b/app/routes/circulars._archive._index/route.tsx index e66e66c5a..c4a3da84b 100644 --- a/app/routes/circulars._archive._index/route.tsx +++ b/app/routes/circulars._archive._index/route.tsx @@ -18,24 +18,6 @@ import { Alert, Button, Icon, Label, TextInput } from '@trussworks/react-uswds' import clamp from 'lodash/clamp' import { useId, useState } from 'react' -import CircularsHeader from './CircularsHeader' -import CircularsIndex from './CircularsIndex' -import { DateSelector } from './DateSelectorMenu' -import { SortSelector } from './SortSelectorButton' -import SynonymGroupIndex from './SynonymGroupIndex' -import Hint from '~/components/Hint' -import { ToolbarButtonGroup } from '~/components/ToolbarButtonGroup' -import PaginationSelectionFooter from '~/components/pagination/PaginationSelectionFooter' -import { feature, origin } from '~/lib/env.server' -import { getFormDataString } from '~/lib/utils' -import { postZendeskRequest } from '~/lib/zendesk.server' -import { useFeature, useModStatus } from '~/root' -import { getUser } from '~/routes/_auth/user.server' -import { - type CircularFormat, - type CircularMetadata, - circularFormats, -} from '~/routes/circulars/circulars.lib' import { circularRedirect, createChangeRequest, @@ -52,13 +34,20 @@ import CircularsIndex from './CircularsIndex' import { DateSelector } from './DateSelectorMenu' import { LuceneAccordion } from './LuceneMenu' import { SortSelector } from './SortSelectorButton' +import SynonymGroupIndex from './SynonymGroupIndex' import Hint from '~/components/Hint' import { ToolbarButtonGroup } from '~/components/ToolbarButtonGroup' import PaginationSelectionFooter from '~/components/pagination/PaginationSelectionFooter' -import { origin } from '~/lib/env.server' +import { feature, origin } from '~/lib/env.server' import { getFormDataString } from '~/lib/utils' import { postZendeskRequest } from '~/lib/zendesk.server' import { useFeature, useModStatus } from '~/root' +import { getUser } from '~/routes/_auth/user.server' +import { + type CircularFormat, + type CircularMetadata, + circularFormats, +} from '~/routes/circulars/circulars.lib' import type { SynonymGroupWithMembers } from '~/routes/synonyms/synonyms.lib' import { groupMembersByEventId } from '~/routes/synonyms/synonyms.server' From d34ed8fc25c26da35021de7bcdb9597ddb9fdd0d Mon Sep 17 00:00:00 2001 From: tylerbarna Date: Mon, 16 Dec 2024 10:12:43 -0600 Subject: [PATCH 08/60] restyle details --- .../circulars._archive._index/LuceneMenu.tsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/routes/circulars._archive._index/LuceneMenu.tsx b/app/routes/circulars._archive._index/LuceneMenu.tsx index 9907761fe..d925af684 100644 --- a/app/routes/circulars._archive._index/LuceneMenu.tsx +++ b/app/routes/circulars._archive._index/LuceneMenu.tsx @@ -22,13 +22,15 @@ export function LuceneAccordion() { return (
Advanced Search - To narrow the search results, use Lucene search syntax. This allows for - specifying which circular field to search (submitter, subject, and/or - body). Further documentation can be found{' '} - - here - - {'. '} +

+ To narrow the search results, use Lucene search syntax. This allows for + specifying which circular field to search (submitter, subject, and/or + body). Further documentation can be found{' '} + + here + + {'. '} +

Lucene Examples (click to copy):

{copyableButton('subject:"Swift"')} From e4ca0ba557e43d826fa7daf9e8e23c1d96bdecfa Mon Sep 17 00:00:00 2001 From: tylerbarna Date: Mon, 16 Dec 2024 10:20:42 -0600 Subject: [PATCH 09/60] change example method --- .../circulars._archive._index/LuceneMenu.tsx | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/app/routes/circulars._archive._index/LuceneMenu.tsx b/app/routes/circulars._archive._index/LuceneMenu.tsx index d925af684..c5c6e6485 100644 --- a/app/routes/circulars._archive._index/LuceneMenu.tsx +++ b/app/routes/circulars._archive._index/LuceneMenu.tsx @@ -6,19 +6,10 @@ * SPDX-License-Identifier: Apache-2.0 */ import { Link } from '@remix-run/react' -import { Button } from '@trussworks/react-uswds' -import CopyToClipboard from 'react-copy-to-clipboard' + +import { CopyableCode } from '~/components/CopyableCode' export function LuceneAccordion() { - function copyableButton(text: string) { - return ( - - - - ) - } return (
Advanced Search @@ -33,9 +24,11 @@ export function LuceneAccordion() {

Lucene Examples (click to copy):

- {copyableButton('subject:"Swift"')} - {copyableButton('body:"GRB"')} - {copyableButton('submitter:"Tomas Ahumada Mena"')} + +
+ +
+
) From a1768560ec142bcf37ae1f15f32cc954aa841f92 Mon Sep 17 00:00:00 2001 From: tylerbarna Date: Tue, 17 Dec 2024 12:29:35 -0600 Subject: [PATCH 10/60] rerun checks From 1a40586bb3f042d2ddecea751be170c2205ea922 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Fri, 10 Jan 2025 16:40:44 -0500 Subject: [PATCH 11/60] draft announcement for eventID backfill --- app/routes/news._index/route.mdx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/routes/news._index/route.mdx b/app/routes/news._index/route.mdx index a3567546f..802705995 100644 --- a/app/routes/news._index/route.mdx +++ b/app/routes/news._index/route.mdx @@ -27,6 +27,24 @@ import { Anchor } from '~/components/Anchor' ## 2025 + + } + > + + Circulars over Kafka EventID Backfill + + + In preparation for new search and sort features in the GCN Circulars archive, we will be backfilling the automatically assigned eventID (e.g. GRB YYMMDDA) derived from each GCN Circular subject. EventIDs have been included in all JSON versions of Circulars starting with GCN Circ 37912. The backfill of all prior Circulars will result in the following behavior that may impact some users: + - a revision of each Circular will lead to a new version in the archive, with the only change as adding the JSON eventID + - ~38k Circular revision will be distributed over Kafka + - revised Circulars will not be redistributed over email + The eventID backfill will be done in batches beginning on DATE. + + + Date: Mon, 13 Jan 2025 11:22:22 +0000 Subject: [PATCH 12/60] Bump isbot from 5.1.20 to 5.1.21 Bumps [isbot](https://github.com/omrilotan/isbot) from 5.1.20 to 5.1.21. - [Changelog](https://github.com/omrilotan/isbot/blob/main/CHANGELOG.md) - [Commits](https://github.com/omrilotan/isbot/compare/v5.1.20...v5.1.21) --- updated-dependencies: - dependency-name: isbot dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 92ddb954f..83658d3ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "hast-util-find-and-replace": "^5.0.1", "hastscript": "^8.0.0", "highlight.js": "^11.10.0", - "isbot": "^5.1.20", + "isbot": "^5.1.21", "lodash": "^4.17.21", "lucene": "^2.1.1", "mailparser": "^3.6.5", @@ -16873,9 +16873,9 @@ "dev": true }, "node_modules/isbot": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.20.tgz", - "integrity": "sha512-cW535S5c05UBfx8bTAZHACjEXyY/p10bvAx5YeqoLEFoGC1HQ6A5n3ScpZRYd1zSwwNF8yYkEOq2F7WjFhX2ig==", + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.21.tgz", + "integrity": "sha512-0q3naRVpENL0ReKHeNcwn/G7BDynp0DqZUckKyFtM9+hmpnPqgm8+8wbjiVZ0XNhq1wPQV28/Pb8Snh5adeUHA==", "engines": { "node": ">=18" } diff --git a/package.json b/package.json index 2bb1b95bd..369c7519e 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "hast-util-find-and-replace": "^5.0.1", "hastscript": "^8.0.0", "highlight.js": "^11.10.0", - "isbot": "^5.1.20", + "isbot": "^5.1.21", "lodash": "^4.17.21", "lucene": "^2.1.1", "mailparser": "^3.6.5", From fbc5db03d646331b44375d7f2d56609f6c198206 Mon Sep 17 00:00:00 2001 From: Leo Singer Date: Wed, 15 Jan 2025 22:34:54 -0500 Subject: [PATCH 13/60] Replace aws-lambda-ses-forwarder fork with release This was a workaround for https://github.com/arithmetric/aws-lambda-ses-forwarder/pull/146, which has now been fixed upstream. --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 83658d3ca..6ff62690b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@remix-run/react": "~2.15.0", "@trussworks/react-uswds": "github:lpsinger/react-uswds#gcn", "@xmldom/xmldom": "^0.9.6", - "aws-lambda-ses-forwarder": "github:lpsinger/aws-lambda-ses-forwarder#aws-sdk-v3", + "aws-lambda-ses-forwarder": "^6.0.0", "classnames": "^2.5.1", "color-convert": "^2.0.1", "cross-env": "^7.0.3", @@ -10267,16 +10267,16 @@ } }, "node_modules/aws-lambda-ses-forwarder": { - "version": "5.0.0", - "resolved": "git+ssh://git@github.com/lpsinger/aws-lambda-ses-forwarder.git#f72bb794c18494cc5e1384a751d47656ab28c623", - "integrity": "sha512-iRq/vhvLj20YhIf44OgEB9xgsX7SXFLUtc9YCPSeTVqqnRbJTQGpbTT8e0Q4hwllEtkW13fRwbksca5YW8b56A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/aws-lambda-ses-forwarder/-/aws-lambda-ses-forwarder-6.0.0.tgz", + "integrity": "sha512-1jqYpZXoUUYuMoGcDkTz9yxlZ0fkzSwRrR057kei4ZBgEfhTDs/EW94MBakoO7auPDDrOFDroGy0/sievGLjYQ==", "license": "MIT", "dependencies": { "@aws-sdk/client-s3": "^3.188.0", "@aws-sdk/client-sesv2": "^3.188.0" }, "engines": { - "node": ">=8.0" + "node": ">=18.0" } }, "node_modules/aws-sdk": { diff --git a/package.json b/package.json index 369c7519e..2f4d08a57 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@remix-run/react": "~2.15.0", "@trussworks/react-uswds": "github:lpsinger/react-uswds#gcn", "@xmldom/xmldom": "^0.9.6", - "aws-lambda-ses-forwarder": "github:lpsinger/aws-lambda-ses-forwarder#aws-sdk-v3", + "aws-lambda-ses-forwarder": "^6.0.0", "classnames": "^2.5.1", "color-convert": "^2.0.1", "cross-env": "^7.0.3", From 6c4cf089c1242718b9b5a368fa9f2d9e7ca85164 Mon Sep 17 00:00:00 2001 From: Leo Singer Date: Fri, 17 Jan 2025 11:39:38 -0500 Subject: [PATCH 14/60] Add rehype-citation plugin --- app/routes/docs.history/route.mdx | 4 +- package-lock.json | 518 +++++++++++++++++++++++++++++- package.json | 1 + references.bib | 14 + remix.config.js | 7 + 5 files changed, 533 insertions(+), 11 deletions(-) create mode 100644 references.bib diff --git a/app/routes/docs.history/route.mdx b/app/routes/docs.history/route.mdx index 48cf22882..1f6d33e43 100644 --- a/app/routes/docs.history/route.mdx +++ b/app/routes/docs.history/route.mdx @@ -24,7 +24,7 @@ Dr. Scott Barthelmy at NASA/GSFC realized that this new data mode created an opp The [GCN Notices](/notices) gained new distribution mechanisms over the following years: phone connections (July 1993), e-mail (December 1993), direct computer-to-computer socket connections over the Internet (January 1994), and by alpha-numeric pagers (September 1994) to any interested follow-up observatories within seconds of detection. -The first robotic follow-up instrument to connect to BACODINE was the Gamma-Ray Optical Counterpart Search Experiments ([GROCSE](https://ui.adsabs.harvard.edu/abs/1995Ap%26SS.231..255A/abstract)) in August 1993. Additional capabilities were added to BACODINE throughout the mid 1990's including trigger classification (GRBs from non-GRBs), monitoring (including 24/7 staffing) and the modern incarnation of the interplanetary network ([IPN](https://heasarc.gsfc.nasa.gov/docs/heasarc/missions/ipn.html)). +The first robotic follow-up instrument to connect to BACODINE was the Gamma-Ray Optical Counterpart Search Experiments [GROCSE, @1995Ap&SS.231..255A] in August 1993. Additional capabilities were added to BACODINE throughout the mid 1990's including trigger classification (GRBs from non-GRBs), monitoring (including 24/7 staffing) and the modern incarnation of the interplanetary network ([IPN](https://heasarc.gsfc.nasa.gov/docs/heasarc/missions/ipn.html)). ## Gamma-ray Burst Coordinates Network @@ -51,3 +51,5 @@ The GCN user community experienced significant growth in the number of users and In the tradition of renaming the GCN, but maintaining the acronym, the General Coordinates Network (also GCN; [https://gcn.nasa.gov](https://gcn.nasa.gov)) debuted in [July 2022](/news) distributing GCN Notices from a cluster of Kafka brokers in the cloud. The legacy GCN system, now known as GCN Classic, is being maintained in parallel to the new GCN, but features are gradually being migrated. GCN Notices became available via email in September 2022 with self-service subscriptions to all three legacy formats (text, 160-byte binary, and VOEvent). The GCN Circulars service was migrated in its entirety from GCN Classic to the new GCN in [April 2023](/news). Over the next few years, GCN Classic services will be fully migrated to the new GCN. New Notice types will only be available via the new GCN, and we look forward to many [new capabilities](/docs/roadmap) and the growth of our GCN community. + +## Bibilography diff --git a/package-lock.json b/package-lock.json index 6ff62690b..69f49a746 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,6 +48,7 @@ "react-google-recaptcha": "^3.1.0", "react-tag-autocomplete": "^7.0.0", "react-topbar-progress-indicator": "^4.1.1", + "rehype-citation": "^2.2.2", "rehype-class-names": "^1.0.13", "rehype-react": "^7.0.0", "remark-gfm": "^3.0.1", @@ -4115,6 +4116,88 @@ "dev": true, "license": "MIT" }, + "node_modules/@citation-js/core": { + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@citation-js/core/-/core-0.7.14.tgz", + "integrity": "sha512-dgeGqYDSQmn2MtnWZkwPGpJQPh43yr1lAAr9jl1NJ9pIY1RXUQxtlAUZVur0V9PHdbfQC+kkvB1KC3VpgVV3MA==", + "license": "MIT", + "dependencies": { + "@citation-js/date": "^0.5.0", + "@citation-js/name": "^0.4.2", + "fetch-ponyfill": "^7.1.0", + "sync-fetch": "^0.4.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@citation-js/date": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@citation-js/date/-/date-0.5.1.tgz", + "integrity": "sha512-1iDKAZ4ie48PVhovsOXQ+C6o55dWJloXqtznnnKy6CltJBQLIuLLuUqa8zlIvma0ZigjVjgDUhnVaNU1MErtZw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@citation-js/name": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@citation-js/name/-/name-0.4.2.tgz", + "integrity": "sha512-brSPsjs2fOVzSnARLKu0qncn6suWjHVQtrqSUrnqyaRH95r/Ad4wPF5EsoWr+Dx8HzkCGb/ogmoAzfCsqlTwTQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@citation-js/plugin-bibjson": { + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-bibjson/-/plugin-bibjson-0.7.14.tgz", + "integrity": "sha512-Hcmk01KrpHwcl5uVoLE6TRaJRFg7/qUvpJDcKqx3LLLCsNbaBlISfRDeFETrjjipTetkX70RvtS7FfGUN58gCQ==", + "license": "MIT", + "dependencies": { + "@citation-js/date": "^0.5.0", + "@citation-js/name": "^0.4.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@citation-js/core": "^0.7.0" + } + }, + "node_modules/@citation-js/plugin-bibtex": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-bibtex/-/plugin-bibtex-0.7.17.tgz", + "integrity": "sha512-pyMW6UR6iMPCk1mVwagNHabprajOCQO+TibxKI6ymdv5VOX3zoqeQF0utwjFnViquL/BZfM5SGUZCQdu+ZZYag==", + "license": "MIT", + "dependencies": { + "@citation-js/date": "^0.5.0", + "@citation-js/name": "^0.4.2", + "moo": "^0.5.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@citation-js/core": "^0.7.0" + } + }, + "node_modules/@citation-js/plugin-csl": { + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-csl/-/plugin-csl-0.7.14.tgz", + "integrity": "sha512-7AKB8lMz1IqdtoE33NnWIpteLYMuSl3xqT+Cax7sQKwAIJEoq2HBmb43Ja8xQQ36nREAupQJv1V6XksIAmYnCg==", + "license": "MIT", + "dependencies": { + "@citation-js/date": "^0.5.0", + "citeproc": "^2.4.6" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@citation-js/core": "^0.7.0" + } + }, "node_modules/@emotion/hash": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", @@ -10040,8 +10123,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { "version": "5.3.0", @@ -11219,6 +11301,12 @@ "dev": true, "license": "MIT" }, + "node_modules/citeproc": { + "version": "2.4.63", + "resolved": "https://registry.npmjs.org/citeproc/-/citeproc-2.4.63.tgz", + "integrity": "sha512-68F95Bp4UbgZU/DBUGQn0qV3HDZLCdI9+Bb2ByrTaNJDL5VEm9LqaiNaxljsvoaExSLEXe1/r6n2Z06SCzW3/Q==", + "license": "CPAL-1.0 OR AGPL-1.0" + }, "node_modules/cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", @@ -11766,6 +11854,15 @@ "yarn": ">=1" } }, + "node_modules/cross-fetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -12728,7 +12825,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -12762,7 +12858,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -14489,6 +14584,35 @@ "bser": "2.1.1" } }, + "node_modules/fetch-ponyfill": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-7.1.0.tgz", + "integrity": "sha512-FhbbL55dj/qdVO3YNK7ZEkshvj3eQ7EuIGV2I6ic/2YiocvyWv+7jg2s4AyS0wdRU75s3tA8ZxI/xPigb0v5Aw==", + "license": "MIT", + "dependencies": { + "node-fetch": "~2.6.1" + } + }, + "node_modules/fetch-ponyfill/node_modules/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -15449,6 +15573,140 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-from-dom": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz", + "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==", + "license": "ISC", + "dependencies": { + "@types/hast": "^3.0.0", + "hastscript": "^9.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-dom/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-from-dom/node_modules/hastscript": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", + "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz", + "integrity": "sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-from-parse5/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/hast-util-from-parse5/node_modules/hastscript": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", + "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-has-property": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", @@ -18114,7 +18372,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -21225,6 +21482,12 @@ "obliterator": "^1.6.1" } }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "license": "BSD-3-Clause" + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -21383,7 +21646,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -22251,7 +22513,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, "dependencies": { "entities": "^4.4.0" }, @@ -23535,6 +23796,148 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-citation": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/rehype-citation/-/rehype-citation-2.2.2.tgz", + "integrity": "sha512-a9+njSn4yJ3/bePz+T8AkCLXhSb3fK+HKlG9xEcLJraN3W92jGV91a10XEvSy6gJ5BvRdtDtu3aEd1uqvNDHRQ==", + "license": "MIT", + "dependencies": { + "@citation-js/core": "^0.7.14", + "@citation-js/date": "^0.5.1", + "@citation-js/name": "^0.4.2", + "@citation-js/plugin-bibjson": "^0.7.14", + "@citation-js/plugin-bibtex": "^0.7.14", + "@citation-js/plugin-csl": "^0.7.14", + "citeproc": "^2.4.63", + "cross-fetch": "^4.0.0", + "hast-util-from-dom": "^5.0.0", + "hast-util-from-parse5": "^8.0.1", + "js-yaml": "^4.1.0", + "parse5": "^7.1.2", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0" + } + }, + "node_modules/rehype-citation/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/rehype-citation/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rehype-citation/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-citation/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-citation/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-citation/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-citation/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-citation/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-citation/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-class-names": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/rehype-class-names/-/rehype-class-names-1.0.13.tgz", @@ -25646,6 +26049,43 @@ "dev": true, "license": "MIT" }, + "node_modules/sync-fetch": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.4.5.tgz", + "integrity": "sha512-esiWJ7ixSKGpd9DJPBTC4ckChqdOjIwJfYhVHkcQ2Gnm41323p1TRmEI+esTQ9ppD+b5opps2OTEGTCGX5kF+g==", + "license": "MIT", + "dependencies": { + "buffer": "^5.7.1", + "node-fetch": "^2.6.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/sync-fetch/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/synckit": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", @@ -25949,7 +26389,6 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, "license": "MIT" }, "node_modules/traverse": { @@ -26904,6 +27343,67 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/vfile-location/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vfile-message": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", @@ -27964,7 +28464,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/whatwg-encoding": { @@ -28011,7 +28510,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "license": "MIT", "dependencies": { "tr46": "~0.0.3", diff --git a/package.json b/package.json index 2f4d08a57..765cd51e4 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "react-google-recaptcha": "^3.1.0", "react-tag-autocomplete": "^7.0.0", "react-topbar-progress-indicator": "^4.1.1", + "rehype-citation": "^2.2.2", "rehype-class-names": "^1.0.13", "rehype-react": "^7.0.0", "remark-gfm": "^3.0.1", diff --git a/references.bib b/references.bib new file mode 100644 index 000000000..872ba1ef6 --- /dev/null +++ b/references.bib @@ -0,0 +1,14 @@ +@ARTICLE{1995Ap&SS.231..255A, + author = {{Akerlof}, Carl and {Ables}, Elden and {Barthelmy}, Scott and {Bionta}, Richard and {Cline}, Thomas and {Ferguson}, Donald and {Fishman}, Gerald and {Gehrels}, Neil and {Kouveliotou}, Chryssa and {Lee}, Brian and {Meegan}, Charles and {Ott}, Linda and {Park}, Hye-Sook and {Parker}, Eric}, + title = "{Results from GROCSE, a Real-Time Search for the Optical Counterparts of Gamma-Ray Bursts}", + journal = {Astrophysics and Space Science}, + keywords = {Response Time, Optical Image, Rapid Response, Generation Detector, Optical Counterpart}, + year = 1995, + month = sep, + volume = {231}, + number = {1-2}, + pages = {255-258}, + doi = {10.1007/BF00658627}, + adsurl = {https://ui.adsabs.harvard.edu/abs/1995Ap&SS.231..255A}, + adsnote = {Provided by the SAO/NASA Astrophysics Data System} +} diff --git a/remix.config.js b/remix.config.js index 375cf6877..29c41ce3a 100644 --- a/remix.config.js +++ b/remix.config.js @@ -1,6 +1,7 @@ import properties from 'highlight.js/lib/languages/properties' import { common } from 'lowlight' import rehypeAutolinkHeadings from 'rehype-autolink-headings' +import rehypeCitation from 'rehype-citation' import rehypeClassNames from 'rehype-class-names' import rehypeExternalLinks from 'rehype-external-links' import rehypeHighlight from 'rehype-highlight' @@ -76,6 +77,12 @@ export default { ...options, }), (options) => rehypeAutolinkHeadings({ behavior: 'wrap', ...options }), + (options) => + rehypeCitation({ + bibliography: 'references.bib', + linkCitations: true, + ...options, + }), ], remarkPlugins: [remarkGfm], }, From 7bbdc1d80cfa0912a2ee5087d92324733cc24dc0 Mon Sep 17 00:00:00 2001 From: dakota002 Date: Fri, 17 Jan 2025 12:07:58 -0500 Subject: [PATCH 15/60] Remove the CopyableCode component, Highlight should be used --- app/components/CopyableCode.tsx | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 app/components/CopyableCode.tsx diff --git a/app/components/CopyableCode.tsx b/app/components/CopyableCode.tsx deleted file mode 100644 index 6df987da3..000000000 --- a/app/components/CopyableCode.tsx +++ /dev/null @@ -1,31 +0,0 @@ -/*! - * Copyright © 2023 United States Government as represented by the - * Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * SPDX-License-Identifier: Apache-2.0 - */ -import { Button, Icon } from '@trussworks/react-uswds' -import CopyToClipboard from 'react-copy-to-clipboard' - -export interface CopyableCodeProps { - text: string -} - -export function CopyableCode(props: CopyableCodeProps) { - return ( - - - - ) -} From fa4ec9c0dcbafb7566056cf3a36154f6754d527c Mon Sep 17 00:00:00 2001 From: Tyler Barna Date: Fri, 17 Jan 2025 12:28:04 -0500 Subject: [PATCH 16/60] switch to using Highlight also tweak highlight to allow for styling --- app/components/Highlight.tsx | 5 ++++- .../circulars._archive._index/LuceneMenu.tsx | 20 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/components/Highlight.tsx b/app/components/Highlight.tsx index b3de311a9..21d396b66 100644 --- a/app/components/Highlight.tsx +++ b/app/components/Highlight.tsx @@ -6,6 +6,7 @@ * SPDX-License-Identifier: Apache-2.0 */ import { Icon, Tooltip } from '@trussworks/react-uswds' +import classNames from 'classnames' import hljs from 'highlight.js/lib/common' import properties from 'highlight.js/lib/languages/properties' import { useState } from 'react' @@ -17,10 +18,12 @@ export function Highlight({ code, language, filename, + className, }: { code: string language: string filename?: string + className?: string }) { const [copyTooltip, setCopyTooltip] = useState('Copy') @@ -32,7 +35,7 @@ export function Highlight({ } return ( -
+
{filename && (

Lucene Examples (click to copy):

- -
- -
- + + + + +
) From f4ed9db41532c4ba022c80e93be65de696d720fc Mon Sep 17 00:00:00 2001 From: Tyler Barna Date: Fri, 17 Jan 2025 12:46:52 -0500 Subject: [PATCH 17/60] address dakota`s demands --- app/routes/circulars._archive._index/LuceneMenu.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/routes/circulars._archive._index/LuceneMenu.tsx b/app/routes/circulars._archive._index/LuceneMenu.tsx index 16011510f..fab1836d8 100644 --- a/app/routes/circulars._archive._index/LuceneMenu.tsx +++ b/app/routes/circulars._archive._index/LuceneMenu.tsx @@ -29,9 +29,7 @@ export function LuceneAccordion() { code='subject:"Swift"' className="grid-col-4" /> - - Date: Fri, 17 Jan 2025 15:46:22 +0000 Subject: [PATCH 18/60] Bump the remix group across 1 directory with 6 updates Bumps the remix group with 6 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@remix-run/architect](https://github.com/remix-run/remix/tree/HEAD/packages/remix-architect) | `2.15.0` | `2.15.2` | | [@remix-run/css-bundle](https://github.com/remix-run/remix/tree/HEAD/packages/remix-css-bundle) | `2.15.0` | `2.15.2` | | [@remix-run/node](https://github.com/remix-run/remix/tree/HEAD/packages/remix-node) | `2.15.0` | `2.15.2` | | [@remix-run/react](https://github.com/remix-run/remix/tree/HEAD/packages/remix-react) | `2.15.0` | `2.15.2` | | [@remix-run/dev](https://github.com/remix-run/remix/tree/HEAD/packages/remix-dev) | `2.15.0` | `2.15.2` | | [@remix-run/eslint-config](https://github.com/remix-run/remix/tree/HEAD/packages/remix-eslint-config) | `2.15.0` | `2.15.2` | Updates `@remix-run/architect` from 2.15.0 to 2.15.2 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-architect/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/architect@2.15.2/packages/remix-architect) Updates `@remix-run/css-bundle` from 2.15.0 to 2.15.2 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-css-bundle/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/css-bundle@2.15.2/packages/remix-css-bundle) Updates `@remix-run/node` from 2.15.0 to 2.15.2 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-node/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/node@2.15.2/packages/remix-node) Updates `@remix-run/react` from 2.15.0 to 2.15.2 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-react/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/react@2.15.2/packages/remix-react) Updates `@remix-run/dev` from 2.15.0 to 2.15.2 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-dev/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/dev@2.15.2/packages/remix-dev) Updates `@remix-run/eslint-config` from 2.15.0 to 2.15.2 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-eslint-config/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/eslint-config@2.15.2/packages/remix-eslint-config) --- updated-dependencies: - dependency-name: "@remix-run/architect" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: remix - dependency-name: "@remix-run/css-bundle" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: remix - dependency-name: "@remix-run/node" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: remix - dependency-name: "@remix-run/react" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: remix - dependency-name: "@remix-run/dev" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: remix - dependency-name: "@remix-run/eslint-config" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: remix ... Signed-off-by: dependabot[bot] --- package-lock.json | 95 +++++++++++++++++++++-------------------------- package.json | 12 +++--- 2 files changed, 49 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index 69f49a746..73d55e3c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,10 +15,10 @@ "@nasa-gcn/schema": "^4.2.0", "@octokit/rest": "^21.0.2", "@opensearch-project/opensearch": "^2.11.0", - "@remix-run/architect": "~2.15.0", - "@remix-run/css-bundle": "~2.15.0", - "@remix-run/node": "~2.15.0", - "@remix-run/react": "~2.15.0", + "@remix-run/architect": "~2.15.2", + "@remix-run/css-bundle": "~2.15.2", + "@remix-run/node": "~2.15.2", + "@remix-run/react": "~2.15.2", "@trussworks/react-uswds": "github:lpsinger/react-uswds#gcn", "@xmldom/xmldom": "^0.9.6", "aws-lambda-ses-forwarder": "^6.0.0", @@ -81,8 +81,8 @@ "@nasa-gcn/architect-plugin-search": "^1.5.0", "@nasa-gcn/eslint-config-gitignore": "^0.0.2", "@playwright/test": "^1.49.0", - "@remix-run/dev": "~2.15.0", - "@remix-run/eslint-config": "~2.15.0", + "@remix-run/dev": "~2.15.2", + "@remix-run/eslint-config": "~2.15.2", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.1.0", "@trivago/prettier-plugin-sort-imports": "^4.2.1", @@ -6366,13 +6366,12 @@ } }, "node_modules/@remix-run/architect": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/architect/-/architect-2.15.0.tgz", - "integrity": "sha512-qRJWhXHn/fieIeJuAjh053YaKvu3KCtEcuF/ixr8h2CF+TNKodi8jmp31V9vpt5FJ3QkDDfmJ35e3NAe7YJKiQ==", - "license": "MIT", + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/@remix-run/architect/-/architect-2.15.2.tgz", + "integrity": "sha512-dP6VCo8tdkA1kXSBEDrUQUr+jTHSZuOz8RuhGEy9NUiMDHtvy+IyWHuZR8TaWuEn0NBd10hoL/Pxnf0/97JXUg==", "dependencies": { "@architect/functions": "^5.2.0", - "@remix-run/node": "2.15.0", + "@remix-run/node": "2.15.2", "@remix-run/web-fetch": "^4.4.2", "@types/aws-lambda": "^8.10.82" }, @@ -6389,20 +6388,18 @@ } }, "node_modules/@remix-run/css-bundle": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/css-bundle/-/css-bundle-2.15.0.tgz", - "integrity": "sha512-Jf4AHdObVyGbPf5V4rIB7cRLdluFkzKvrHglDUrrH1KvbD+jNulQt+Kz3bjbEeEdyUSK+LdVMD2E2zOx+ZNXyg==", - "license": "MIT", + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/@remix-run/css-bundle/-/css-bundle-2.15.2.tgz", + "integrity": "sha512-/GX8qPfUa9lZI0rx270/JH8oq4X3KFy7FlYV5dSB9pJjc5uR0BVkfb5htpS/U55o7d0qVwa28Wa9y5Z8D01CEQ==", "engines": { "node": ">=18.0.0" } }, "node_modules/@remix-run/dev": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/dev/-/dev-2.15.0.tgz", - "integrity": "sha512-iXV6u9PBwFc7KriDpVcjqLGJzZZd6ZOrxewen7hoH0OBzGwjkhtm46BTQEJrZ/e/dzlU1IU/0ylH29tN9BZoyg==", + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/@remix-run/dev/-/dev-2.15.2.tgz", + "integrity": "sha512-o8lix8t4GBhtXjo/G1IzwtHVW5GRMs7amtFtBHiR1bhSyK7VyX5qGtTDmJyny5QDv83pxaLOCiE0dUng2BCoyQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.21.8", "@babel/generator": "^7.21.5", @@ -6414,9 +6411,9 @@ "@babel/types": "^7.22.5", "@mdx-js/mdx": "^2.3.0", "@npmcli/package-json": "^4.0.1", - "@remix-run/node": "2.15.0", + "@remix-run/node": "2.15.2", "@remix-run/router": "1.21.0", - "@remix-run/server-runtime": "2.15.0", + "@remix-run/server-runtime": "2.15.2", "@types/mdx": "^2.0.5", "@vanilla-extract/integration": "^6.2.0", "arg": "^5.0.1", @@ -6467,8 +6464,8 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@remix-run/react": "^2.15.0", - "@remix-run/serve": "^2.15.0", + "@remix-run/react": "^2.15.2", + "@remix-run/serve": "^2.15.2", "typescript": "^5.1.0", "vite": "^5.1.0", "wrangler": "^3.28.2" @@ -7081,11 +7078,10 @@ } }, "node_modules/@remix-run/eslint-config": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/eslint-config/-/eslint-config-2.15.0.tgz", - "integrity": "sha512-Vx5eOQu0gU9wkK6eboWjGVWRzjZw/GzT6OPIL45HdxTAeZ5KETSUkWpI5pJZ1lGK/rhH9QLd5pR0UUfwWLKUvA==", + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/@remix-run/eslint-config/-/eslint-config-2.15.2.tgz", + "integrity": "sha512-zch4J6ImrEjSvCbT9qufhubm6ym8E7LgGWpRihR2KB6oZndKEnSNe4ZklrwFXxIeGG+ACFSVm9JPR0lmAcAbTg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.21.8", "@babel/eslint-parser": "^7.21.8", @@ -7143,12 +7139,11 @@ } }, "node_modules/@remix-run/node": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.15.0.tgz", - "integrity": "sha512-tWbR7pQ6gwj+MkGf6WVIYnjgfGfpdU8EOIa6xsCIRlrm0p3BtMz4jA3GvBWEpOuEnN5MV7CarVzhduaRzkZ0SQ==", - "license": "MIT", + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.15.2.tgz", + "integrity": "sha512-NS/h5uxje7DYCNgcKqKAiUhf0r2HVnoYUBWLyIIMmCUP1ddWurBP6xTPcWzGhEvV/EvguniYi1wJZ5+X8sonWw==", "dependencies": { - "@remix-run/server-runtime": "2.15.0", + "@remix-run/server-runtime": "2.15.2", "@remix-run/web-fetch": "^4.4.2", "@web3-storage/multipart-parser": "^1.0.0", "cookie-signature": "^1.1.0", @@ -7169,15 +7164,14 @@ } }, "node_modules/@remix-run/react": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.15.0.tgz", - "integrity": "sha512-puqDbi9N/WfaUhzDnw2pACXtCB7ukrtFJ9ILwpEuhlaTBpjefifJ89igokW+tt1ePphIFMivAm/YspcbZdCQsA==", - "license": "MIT", + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.15.2.tgz", + "integrity": "sha512-NAAMsSgoC/sdOgovUewwRCE/RUm3F+MBxxZKfwu3POCNeHaplY5qGkH/y8PUXvdN1EBG7Z0Ko43dyzCfcEy5PA==", "dependencies": { "@remix-run/router": "1.21.0", - "@remix-run/server-runtime": "2.15.0", - "react-router": "6.28.0", - "react-router-dom": "6.28.0", + "@remix-run/server-runtime": "2.15.2", + "react-router": "6.28.1", + "react-router-dom": "6.28.1", "turbo-stream": "2.4.0" }, "engines": { @@ -7204,10 +7198,9 @@ } }, "node_modules/@remix-run/server-runtime": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.15.0.tgz", - "integrity": "sha512-FuM8vAg1sPskf4wn0ivbuj/7s9Qdh2wnKu+sVXqYz0a95gH5b73TuMzk6n3NMSkFVKKc6+UmlG1WLYre7L2LTg==", - "license": "MIT", + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.15.2.tgz", + "integrity": "sha512-OqiPcvEnnU88B8b1LIWHHkQ3Tz2GDAmQ1RihFNQsbrFKpDsQLkw0lJlnfgKA/uHd0CEEacpfV7C9qqJT3V6Z2g==", "dependencies": { "@remix-run/router": "1.21.0", "@types/cookie": "^0.6.0", @@ -23495,10 +23488,9 @@ } }, "node_modules/react-router": { - "version": "6.28.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.0.tgz", - "integrity": "sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==", - "license": "MIT", + "version": "6.28.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.1.tgz", + "integrity": "sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==", "dependencies": { "@remix-run/router": "1.21.0" }, @@ -23510,13 +23502,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.28.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.0.tgz", - "integrity": "sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==", - "license": "MIT", + "version": "6.28.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.1.tgz", + "integrity": "sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==", "dependencies": { "@remix-run/router": "1.21.0", - "react-router": "6.28.0" + "react-router": "6.28.1" }, "engines": { "node": ">=14.0.0" diff --git a/package.json b/package.json index 765cd51e4..1c17986e9 100644 --- a/package.json +++ b/package.json @@ -33,10 +33,10 @@ "@nasa-gcn/schema": "^4.2.0", "@octokit/rest": "^21.0.2", "@opensearch-project/opensearch": "^2.11.0", - "@remix-run/architect": "~2.15.0", - "@remix-run/css-bundle": "~2.15.0", - "@remix-run/node": "~2.15.0", - "@remix-run/react": "~2.15.0", + "@remix-run/architect": "~2.15.2", + "@remix-run/css-bundle": "~2.15.2", + "@remix-run/node": "~2.15.2", + "@remix-run/react": "~2.15.2", "@trussworks/react-uswds": "github:lpsinger/react-uswds#gcn", "@xmldom/xmldom": "^0.9.6", "aws-lambda-ses-forwarder": "^6.0.0", @@ -99,8 +99,8 @@ "@nasa-gcn/architect-plugin-search": "^1.5.0", "@nasa-gcn/eslint-config-gitignore": "^0.0.2", "@playwright/test": "^1.49.0", - "@remix-run/dev": "~2.15.0", - "@remix-run/eslint-config": "~2.15.0", + "@remix-run/dev": "~2.15.2", + "@remix-run/eslint-config": "~2.15.2", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.1.0", "@trivago/prettier-plugin-sort-imports": "^4.2.1", From 78f126ca537533ee7d409ed87d8c580b7d9f1508 Mon Sep 17 00:00:00 2001 From: Courey Elliott Date: Fri, 17 Jan 2025 13:46:52 -0500 Subject: [PATCH 19/60] Courey/update table stream (#2781) --- __tests__/table-streams/synonyms.ts | 318 +++++++++++++++++++------ app/routes/synonyms/synonyms.server.ts | 1 - app/table-streams/synonyms/index.ts | 29 ++- 3 files changed, 260 insertions(+), 88 deletions(-) diff --git a/__tests__/table-streams/synonyms.ts b/__tests__/table-streams/synonyms.ts index 67ecbf6c0..16e110cf2 100644 --- a/__tests__/table-streams/synonyms.ts +++ b/__tests__/table-streams/synonyms.ts @@ -8,13 +8,18 @@ import { tables } from '@architect/functions' import { search } from '@nasa-gcn/architect-functions-search' import type { DynamoDBRecord } from 'aws-lambda' +import crypto from 'crypto' -import type { Synonym } from '~/routes/synonyms/synonyms.lib' import { handler } from '~/table-streams/synonyms/index' -const synonymId = 'abcde-abcde-abcde-abcde-abcde' +const synonymId = crypto.randomUUID() const eventId = 'GRB 123' const existingEventId = 'GRB 99999999' +const additionalEventId = 'GRB 424242A' +const previousSynonymId = crypto.randomUUID() +const existingEventSlug = existingEventId.replace(' ', '-').toLowerCase() +const eventSlug = eventId.replace(' ', '-').toLowerCase() +const additionalEventSlug = additionalEventId.replace(' ', '-').toLowerCase() const putData = { index: 'synonym-groups', @@ -26,27 +31,10 @@ const putData = { }, } -jest.mock('@nasa-gcn/architect-functions-search', () => ({ - search: jest.fn(), -})) - -// Github-slugger is mocked to prevent jest failing to properly load the package. If Jest attempts -// to load it, it will encounter a syntax error. Since these eventIds do not have any characters that -// would be changed by the slugger, ensuring they are all lowercase is enough to mock the behavior -// of github-slugger in this case. -jest.mock('github-slugger', () => ({ - slug: (eventId: string) => { - return eventId.toLowerCase() - }, -})) - -jest.mock('@architect/functions', () => ({ - tables: jest.fn(), -})) - -const mockIndex = jest.fn() -const mockDelete = jest.fn() -const mockQuery = jest.fn() +const deleteData = { + index: 'synonym-groups', + id: previousSynonymId, +} const mockStreamEvent = { Records: [ @@ -64,6 +52,50 @@ const mockStreamEvent = { eventId: { S: eventId, }, + slug: { + S: eventSlug, + }, + }, + NewImage: { + synonymId: { + S: synonymId, + }, + eventId: { + S: eventId, + }, + slug: { + S: eventSlug, + }, + }, + SequenceNumber: '111', + SizeBytes: 26, + StreamViewType: 'NEW_IMAGE', + }, + eventSourceARN: + 'arn:aws:dynamodb:us-west-2:123456789012:table/synonym-groups/stream/2020-01-01T00:00:00.000', + } as DynamoDBRecord, + ], +} + +const mockStreamEventWithOldRecord = { + Records: [ + { + eventID: '1', + eventName: 'INSERT', + eventVersion: '1.0', + eventSource: 'aws:dynamodb', + awsRegion: 'us-west-2', + dynamodb: { + Keys: { + synonymId: { + S: synonymId, + }, + eventId: { + S: eventId, + }, + slug: { + S: eventSlug, + }, }, NewImage: { synonymId: { @@ -72,6 +104,20 @@ const mockStreamEvent = { eventId: { S: eventId, }, + slug: { + S: eventSlug, + }, + }, + OldImage: { + synonymId: { + S: previousSynonymId, + }, + eventId: { + S: eventId, + }, + slug: { + S: eventSlug, + }, }, SequenceNumber: '111', SizeBytes: 26, @@ -83,21 +129,47 @@ const mockStreamEvent = { ], } +// Github-slugger is mocked to prevent jest failing to properly load the package. If Jest attempts +// to load it, it will encounter a syntax error. Since all places where a slug would be created have been mocked, +// it doesn't need to return anything. +jest.mock('github-slugger', () => ({ + slug: jest.fn(), +})) + +jest.mock('@nasa-gcn/architect-functions-search', () => ({ + search: jest.fn(), +})) + +jest.mock('@architect/functions', () => ({ + tables: jest.fn(), +})) + +const mockIndex = jest.fn() +const mockDelete = jest.fn() +const mockQuery = jest.fn() + afterEach(() => { jest.clearAllMocks() }) -describe('testing put synonymGroup table-stream', () => { - test('insert new synonym group', async () => { - const mockItems = [{ synonymId, eventId }] +describe('testing synonymGroup table-stream', () => { + test('insert initial synonym record where no previous opensearch record exists', async () => { + putData.id = synonymId + putData.body.synonymId = synonymId + putData.body.eventIds = [eventId] + putData.body.slugs = [eventSlug] + + mockQuery.mockResolvedValue({ + Items: [{ synonymId, eventId, slug: eventSlug }], + }) + const mockClient = { synonyms: { query: mockQuery, }, } - mockQuery.mockResolvedValue({ Items: mockItems }) + ;(tables as unknown as jest.Mock).mockResolvedValue(mockClient) - putData.body.eventIds = [eventId] ;(search as unknown as jest.Mock).mockReturnValue({ index: mockIndex, delete: mockDelete, @@ -106,98 +178,192 @@ describe('testing put synonymGroup table-stream', () => { await handler(mockStreamEvent) expect(mockIndex).toHaveBeenCalledWith(putData) + expect(mockIndex).toHaveBeenCalledTimes(1) + expect(mockDelete).not.toHaveBeenCalled() + expect(mockQuery).toHaveBeenCalledTimes(1) }) - test('insert into existing synonym group', async () => { + test('insert into existing synonym group with removal of previous now unused group', async () => { + putData.id = synonymId + putData.body.synonymId = synonymId + putData.body.eventIds = [existingEventId, eventId] + putData.body.slugs = [existingEventSlug, eventSlug] + const mockItems = [ - { synonymId, eventId: existingEventId }, - { synonymId, eventId }, + { synonymId, eventId: existingEventId, slug: existingEventSlug }, + { synonymId, eventId, slug: eventSlug }, ] + + const implementedMockQuery = mockQuery.mockImplementation((query) => { + if (query.ExpressionAttributeValues[':synonymId'] == previousSynonymId) { + return { Items: [] } + } else { + return { Items: mockItems } + } + }) + + ;(search as unknown as jest.Mock).mockReturnValue({ + index: mockIndex, + delete: mockDelete, + }) + const mockClient = { synonyms: { - query: mockQuery, + query: implementedMockQuery, }, } - mockQuery.mockResolvedValue({ Items: mockItems }) + ;(tables as unknown as jest.Mock).mockResolvedValue(mockClient) - putData.body.eventIds = [existingEventId, eventId] - ;(search as unknown as jest.Mock).mockReturnValue({ - index: mockIndex, - delete: mockDelete, - }) - await handler(mockStreamEvent) + await handler(mockStreamEventWithOldRecord) + expect(mockQuery).toHaveBeenCalledTimes(2) + // the new group opensearch record is updated expect(mockIndex).toHaveBeenCalledWith(putData) + expect(mockIndex).toHaveBeenCalledTimes(1) + // the old group opensearch record is deleted + expect(mockDelete).toHaveBeenCalledWith(deleteData) + expect(mockDelete).toHaveBeenCalledTimes(1) }) - test('insert only once', async () => { + test('insert into existing synonym group with removal from old group with remaining members', async () => { const mockItems = [ - { synonymId, eventId: existingEventId }, - { synonymId, eventId }, + { synonymId, eventId: existingEventId, slug: existingEventSlug }, + { synonymId, eventId, slug: eventSlug }, ] + + const mockPreviousItems = [ + { + synonymId: previousSynonymId, + eventId: additionalEventId, + slug: additionalEventSlug, + }, + ] + + const implementedMockQuery = mockQuery.mockImplementation((query) => { + if (query.ExpressionAttributeValues[':synonymId'] == previousSynonymId) { + return { Items: mockPreviousItems } + } else { + return { Items: mockItems } + } + }) + + ;(search as unknown as jest.Mock).mockReturnValue({ + index: mockIndex, + delete: mockDelete, + }) + const mockClient = { synonyms: { - query: mockQuery, + query: implementedMockQuery, }, } - mockQuery.mockResolvedValue({ Items: mockItems }) + ;(tables as unknown as jest.Mock).mockResolvedValue(mockClient) + + await handler(mockStreamEventWithOldRecord) + + expect(mockQuery).toHaveBeenCalledTimes(2) + putData.id = synonymId + putData.body.synonymId = synonymId putData.body.eventIds = [existingEventId, eventId] + putData.body.slugs = [existingEventSlug, eventSlug] + expect(mockIndex).toHaveBeenCalledWith(putData) + putData.id = previousSynonymId + putData.body.synonymId = previousSynonymId + putData.body.eventIds = [additionalEventId] + putData.body.slugs = [additionalEventSlug] + expect(mockIndex).toHaveBeenCalledWith(putData) + expect(mockIndex).toHaveBeenCalledTimes(2) + expect(mockDelete).not.toHaveBeenCalled() + }) + + test('insert into new synonym group with removal from old group with remaining members', async () => { + const mockItems = [{ synonymId, eventId, slug: eventSlug }] + + const mockPreviousItems = [ + { + synonymId: previousSynonymId, + eventId: additionalEventId, + slug: additionalEventSlug, + }, + ] + + const implementedMockQuery = mockQuery.mockImplementation((query) => { + if (query.ExpressionAttributeValues[':synonymId'] == previousSynonymId) { + return { Items: mockPreviousItems } + } else { + return { Items: mockItems } + } + }) + ;(search as unknown as jest.Mock).mockReturnValue({ index: mockIndex, delete: mockDelete, }) - await handler(mockStreamEvent) - - expect(mockIndex).toHaveBeenCalledWith(putData) - }) -}) - -describe('testing delete synonymGroup table-stream', () => { - test('remove one eventId while leaving others', async () => { - const mockItems = [{ synonymId, eventId: existingEventId }] const mockClient = { synonyms: { - query: mockQuery, + query: implementedMockQuery, }, } - mockQuery.mockResolvedValue({ Items: mockItems }) + ;(tables as unknown as jest.Mock).mockResolvedValue(mockClient) - mockStreamEvent.Records[0].eventName = 'REMOVE' - putData.body.eventIds = [existingEventId] - ;(search as unknown as jest.Mock).mockReturnValue({ - index: mockIndex, - delete: mockDelete, - }) - await handler(mockStreamEvent) + await handler(mockStreamEventWithOldRecord) + expect(mockQuery).toHaveBeenCalledTimes(2) + putData.id = synonymId + putData.body.synonymId = synonymId + putData.body.eventIds = [eventId] + putData.body.slugs = [eventSlug] expect(mockIndex).toHaveBeenCalledWith(putData) + putData.id = previousSynonymId + putData.body.synonymId = previousSynonymId + putData.body.eventIds = [additionalEventId] + putData.body.slugs = [additionalEventSlug] + expect(mockIndex).toHaveBeenCalledWith(putData) + expect(mockIndex).toHaveBeenCalledTimes(2) + expect(mockDelete).not.toHaveBeenCalled() }) - test('remove final synonym and delete synonym group', async () => { - const mockItems = [] as Synonym[] + test('insert into new synonym group with removal of previous now unused group', async () => { + putData.id = synonymId + putData.body.synonymId = synonymId + putData.body.eventIds = [eventId] + putData.body.slugs = [eventSlug] + + const mockItems = [{ synonymId, eventId, slug: eventSlug }] + + const implementedMockQuery = mockQuery.mockImplementation((query) => { + if (query.ExpressionAttributeValues[':synonymId'] == previousSynonymId) { + return { Items: [] } + } else { + return { Items: mockItems } + } + }) + + ;(search as unknown as jest.Mock).mockReturnValue({ + index: mockIndex, + delete: mockDelete, + }) + const mockClient = { synonyms: { - query: mockQuery, + query: implementedMockQuery, }, } - mockQuery.mockResolvedValue({ Items: mockItems }) + ;(tables as unknown as jest.Mock).mockResolvedValue(mockClient) - mockStreamEvent.Records[0].eventName = 'REMOVE' - const deleteData = { - index: 'synonym-groups', - id: synonymId, - } - ;(search as unknown as jest.Mock).mockReturnValue({ - index: mockIndex, - delete: mockDelete, - }) - await handler(mockStreamEvent) + await handler(mockStreamEventWithOldRecord) + expect(mockQuery).toHaveBeenCalledTimes(2) + // the new group opensearch record is updated + expect(mockIndex).toHaveBeenCalledWith(putData) + expect(mockIndex).toHaveBeenCalledTimes(1) + // the old group opensearch record is deleted expect(mockDelete).toHaveBeenCalledWith(deleteData) + expect(mockDelete).toHaveBeenCalledTimes(1) }) }) diff --git a/app/routes/synonyms/synonyms.server.ts b/app/routes/synonyms/synonyms.server.ts index 4fe83f9b1..598f2c354 100644 --- a/app/routes/synonyms/synonyms.server.ts +++ b/app/routes/synonyms/synonyms.server.ts @@ -106,7 +106,6 @@ export async function searchSynonymsByEventId({ fields: { eventIds: string[]; synonymId: string; slugs: string[] } }) => body ) - return { items: results, totalItems, diff --git a/app/table-streams/synonyms/index.ts b/app/table-streams/synonyms/index.ts index d9d6cb339..e6c21fd9c 100644 --- a/app/table-streams/synonyms/index.ts +++ b/app/table-streams/synonyms/index.ts @@ -18,6 +18,7 @@ const index = 'synonym-groups' async function removeIndex(id: string) { const client = await getSearchClient() + try { await client.delete({ index, id }) } catch (e) { @@ -39,16 +40,22 @@ async function putIndex(synonymGroup: SynonymGroup) { export const handler = createTriggerHandler( async ({ eventName, dynamodb }: DynamoDBRecord) => { if (!eventName || !dynamodb) return - const { synonymId } = unmarshallTrigger(dynamodb!.NewImage) as Synonym - const dynamoSynonyms = await getSynonymsByUuid(synonymId) - if (dynamoSynonyms.length > 0) { - await putIndex({ - synonymId, - eventIds: dynamoSynonyms.map((synonym) => synonym.eventId), - slugs: dynamoSynonyms.map((synonym) => synonym.slug), - }) - } else { - await removeIndex(synonymId) - } + await Promise.all( + [dynamodb.OldImage, dynamodb.NewImage] + .filter((image) => image !== undefined) + .map(async (image) => { + const { synonymId } = unmarshallTrigger(image) as Synonym + const synonyms = await getSynonymsByUuid(synonymId) + if (synonyms.length > 0) { + await putIndex({ + synonymId, + eventIds: synonyms.map((synonym) => synonym.eventId), + slugs: synonyms.map((synonym) => synonym.slug), + }) + } else { + await removeIndex(synonymId) + } + }) + ) } ) From aa737a95495db50acf002e562739a627df3eb2a8 Mon Sep 17 00:00:00 2001 From: Leo Singer Date: Fri, 17 Jan 2025 13:42:51 -0500 Subject: [PATCH 20/60] Use released version of @architect/inventory We no longer need our branch because https://github.com/architect/inventory/pull/77 has been merged and released upstream. --- package-lock.json | 13 +++++++------ package.json | 3 +-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 73d55e3c9..fd0c25782 100644 --- a/package-lock.json +++ b/package-lock.json @@ -405,8 +405,9 @@ } }, "node_modules/@architect/inventory": { - "version": "4.0.5", - "resolved": "git+ssh://git@github.com/lpsinger/inventory.git#50f4f31d7aee291b6a80983576f2000a44762ffa", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@architect/inventory/-/inventory-4.0.6.tgz", + "integrity": "sha512-vCKfoogAQmHPXDgCU76lvHsmmMdMoLDOEi21f6kq31G++lpqhY6+68fsOxnV1iakDY6tXV5YeZ0WGLOBa37/fA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -415,7 +416,7 @@ "@architect/utils": "~4.0.6", "@aws-lite/client": "^0.21.1", "@aws-lite/ssm": "^0.2.3", - "lambda-runtimes": "~2.0.2" + "lambda-runtimes": "~2.0.5" }, "engines": { "node": ">=16" @@ -18727,9 +18728,9 @@ } }, "node_modules/lambda-runtimes": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lambda-runtimes/-/lambda-runtimes-2.0.3.tgz", - "integrity": "sha512-kctr26kT0sJoBU7OQTcuCbY1KQYpEm3GoeTMMHsud6ALemF8LNoWxkChDInwStZ9l6Vtae2PkNahY6JClT4LDA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lambda-runtimes/-/lambda-runtimes-2.0.5.tgz", + "integrity": "sha512-6BoLX9xuvr+B/f05MOhJnzRdF8Za5YYh82n45ndun9EU3uhJv9kIwnYrOrvuA7MoGwZgCMI7RUhBRzfw/l63SQ==", "dev": true, "license": "Apache-2.0", "engines": { diff --git a/package.json b/package.json index 1c17986e9..65aa7adab 100644 --- a/package.json +++ b/package.json @@ -150,8 +150,7 @@ "yarn": "^1.22.21" }, "overrides": { - "@architect/deploy": "github:DocLM/deploy#d3116f41d5fda00337ebfda543a69d3b3d4546be", - "@architect/inventory": "github:lpsinger/inventory#esm-graph-with-top-level-await" + "@architect/deploy": "github:DocLM/deploy#d3116f41d5fda00337ebfda543a69d3b3d4546be" }, "engines": { "node": ">=22" From fc81907914f94b59aeb25b81c9df62abaf19b868 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Fri, 17 Jan 2025 16:10:09 -0500 Subject: [PATCH 21/60] remove all mentions of the road map --- app/routes/_index/route.mdx | 6 ------ app/routes/docs._index.md | 4 ---- app/routes/docs.roadmap.md | 16 ---------------- app/routes/docs.tsx | 3 --- 4 files changed, 29 deletions(-) delete mode 100644 app/routes/docs.roadmap.md diff --git a/app/routes/_index/route.mdx b/app/routes/_index/route.mdx index c39f0bebf..6774c728b 100644 --- a/app/routes/_index/route.mdx +++ b/app/routes/_index/route.mdx @@ -124,10 +124,4 @@ There are three ways to stream GCN Notices in real time: - [NASA Honor Awards 2022: Group Achievement Award](https://science.gsfc.nasa.gov/sci/awards/1048) - [Robert H. Goddard Award 2023](https://science.gsfc.nasa.gov/sci/awards/1057) -## Coming Soon - -The [GCN Viewer](https://heasarc.gsfc.nasa.gov/tachgcn) is an interactive, searchable, filterable index of all GCN Notices and Circulars, updated in real time. In the near future, it will be integrated with this web site. - -See the [GCN Road Map](docs/roadmap) for more features that are coming soon to GCN. - diff --git a/app/routes/docs._index.md b/app/routes/docs._index.md index dc9baae5c..394b459a4 100644 --- a/app/routes/docs._index.md +++ b/app/routes/docs._index.md @@ -25,7 +25,3 @@ To begin receiving GCN notices via Kafka, users have two options for setting up ## History Learn about how and why GCN was created, and how it became an essential component of multimessenger astrophysics in the [History of GCN](/docs/history). - -## Roadmap - -Check out our [roadmap](/docs/roadmap) for features that are under development, including the Unified Schema and the GRB Name Server. diff --git a/app/routes/docs.roadmap.md b/app/routes/docs.roadmap.md deleted file mode 100644 index 9aae9a5a0..000000000 --- a/app/routes/docs.roadmap.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -handle: - breadcrumb: Road Map ---- - -# Road Map - -The following features are coming soon to GCN. - -## GRB Name Server - -In partnership with the [Transient Name Server](https://www.wis-tns.org), the GCN team is building a GRB name server that will allow GRB-detecting instruments to both name GRBs and retrieve names of already discovered GRBs. These names will be automatically ingested into GCN and associated with GCN Notices and Circulars for the same event. - -## Archive - -Similar in functionality to the [GCN Viewer](https://heasarc.gsfc.nasa.gov/wsgi-scripts/tach/gcn_v2/tach.wsgi/), but integrated into the new GCN site, the GCN team is building an archive organized by astronomical transient and tying together associated Circulars and Notices. diff --git a/app/routes/docs.tsx b/app/routes/docs.tsx index 0ca241621..2a4adb0b9 100644 --- a/app/routes/docs.tsx +++ b/app/routes/docs.tsx @@ -192,9 +192,6 @@ export default function () { ]} /> , - - Road Map - , Schema Browser , From 043bf4644f07612989cb275ce5962936f8a1c69e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 11:46:00 +0000 Subject: [PATCH 22/60] Bump lint-staged from 15.3.0 to 15.4.1 Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 15.3.0 to 15.4.1. - [Release notes](https://github.com/lint-staged/lint-staged/releases) - [Changelog](https://github.com/lint-staged/lint-staged/blob/master/CHANGELOG.md) - [Commits](https://github.com/lint-staged/lint-staged/compare/v15.3.0...v15.4.1) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index fd0c25782..4e7b05f02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -114,7 +114,7 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-transform-stub": "^2.0.0", - "lint-staged": "^15.3.0", + "lint-staged": "^15.4.1", "lowlight": "^3.3.0", "nasawds": "^4.0.63", "npm-run-all": "^4.1.5", @@ -19015,9 +19015,9 @@ } }, "node_modules/lint-staged": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.3.0.tgz", - "integrity": "sha512-vHFahytLoF2enJklgtOtCtIjZrKD/LoxlaUusd5nh7dWv/dkKQJY74ndFSzxCdv7g0ueGg1ORgTSt4Y9LPZn9A==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.4.1.tgz", + "integrity": "sha512-P8yJuVRyLrm5KxCtFx+gjI5Bil+wO7wnTl7C3bXhvtTaAFGirzeB24++D0wGoUwxrUKecNiehemgCob9YL39NA==", "dev": true, "dependencies": { "chalk": "~5.4.1", diff --git a/package.json b/package.json index 65aa7adab..84bd28bc9 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-transform-stub": "^2.0.0", - "lint-staged": "^15.3.0", + "lint-staged": "^15.4.1", "lowlight": "^3.3.0", "nasawds": "^4.0.63", "npm-run-all": "^4.1.5", From 210e916746b8429719fa6327b5bbf4c4a6281939 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 11:46:44 +0000 Subject: [PATCH 23/60] Bump eslint-config-prettier from 9.1.0 to 10.0.1 Bumps [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier) from 9.1.0 to 10.0.1. - [Release notes](https://github.com/prettier/eslint-config-prettier/releases) - [Changelog](https://github.com/prettier/eslint-config-prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/eslint-config-prettier/compare/v9.1.0...v10.0.1) --- updated-dependencies: - dependency-name: eslint-config-prettier dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e7b05f02..78f5ab4a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -107,7 +107,7 @@ "aws-sdk-mock": "^5.9.0", "esbuild": "^0.24.2", "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", + "eslint-config-prettier": "^10.0.1", "eslint-plugin-jest": "^27.9.0", "glob": "^10.3.4", "husky": "^9.1.7", @@ -13349,12 +13349,12 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz", + "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", "dev": true, "bin": { - "eslint-config-prettier": "bin/cli.js" + "eslint-config-prettier": "build/bin/cli.js" }, "peerDependencies": { "eslint": ">=7.0.0" diff --git a/package.json b/package.json index 84bd28bc9..58d4337e0 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "aws-sdk-mock": "^5.9.0", "esbuild": "^0.24.2", "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", + "eslint-config-prettier": "^10.0.1", "eslint-plugin-jest": "^27.9.0", "glob": "^10.3.4", "husky": "^9.1.7", From 0242bde9e85f2c2bcc309494f04e42d8bf641691 Mon Sep 17 00:00:00 2001 From: Vidushi Sharma <103223246+Vidushi-GitHub@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:32:50 -0500 Subject: [PATCH 24/60] Healpix doc (#2498) Resolves: #2035 --- app/routes/docs.client.samples.md | 178 ++++++++++++++++++++++++++++++ references.bib | 36 ++++++ 2 files changed, 214 insertions(+) diff --git a/app/routes/docs.client.samples.md b/app/routes/docs.client.samples.md index 1cf3f3f89..0d543dcdf 100644 --- a/app/routes/docs.client.samples.md +++ b/app/routes/docs.client.samples.md @@ -12,6 +12,9 @@ and some samples from the FAQs section of the [gcn-kafka-python](https://github. To contribute your own ideas, make a GitHub pull request to add it to [the Markdown source for this document](https://github.com/nasa-gcn/gcn.nasa.gov/blob/CodeSamples/app/routes/docs.client.samples.md), or [contact us](/contact). +- [Working with Kafka messages](#parsing) +- [HEALPix Sky Maps](#healpix-sky-maps) + ## Parsing Within your consumer loop, use the following functions to convert the @@ -162,3 +165,178 @@ for message in consumer.consume(end[0].offset - start[0].offset, timeout=1): continue print(message.value()) ``` + +## HEALPix Sky Maps + +[HEALPix](https://healpix.sourceforge.io) (Hierarchical, Equal Area, and iso-Latitude Pixelisation) is a scheme for indexing positions on the unit sphere. +For localization of events, the multi-messenger community uses the standard HEALPix [@2005ApJ...622..759G] with the file extension `.fits.gz`, as well as multi-resolution HEALPix [@2015A&A...578A.114F] with the file extension `.multiorder.fits`. The preferred format is the multi-resolution HEALPix format. + +### Multi-Order Sky Maps + +GCN strongly encourages the use of multi-order sky maps. They utilize a variable resolution, with higher probability regions having higher resolution and lower probability regions being encoded with a lower resolution. Variable resolution allows multi-order sky maps to be significantly more efficient than single-resolution HEALPix sky maps with respect to both storage footprint and read speed. + +#### Reading Sky Maps + +Sky maps can be parsed using Python and a small number of packages. While this documentation covers the use of `astropy-healpix`, there are several packages that can be used for this purpose; a number of [alternatives](#other-documentation-and-healpix-packages) are listed at the bottom of this page. + +```python +import astropy_healpix as ah +import numpy as np + +from astropy import units as u +from astropy.table import QTable +``` + +A given sky map can then be read in as: + +```python +skymap = QTable.read('skymap.multiorder.fits') +``` + +#### Most Probable Sky Location + +Let's calculate the index of the sky point with the highest probability density, as follows: + +```python +hp_index = np.argmax(skymap['PROBDENSITY']) +uniq = skymap[hp_index]['UNIQ'] + +level, ipix = ah.uniq_to_level_ipix(uniq) +nside = ah.level_to_nside(level) + +ra, dec = ah.healpix_to_lonlat(ipix, nside, order='nested') +``` + +#### Probability Density at a Known Position + +Similarly, one can calculate the probability density at a known position: + +```python +ra, dec = 197.450341598 * u.deg, -23.3814675445 * u.deg + +level, ipix = ah.uniq_to_level_ipix(skymap['UNIQ']) +nside = ah.level_to_nside(level) + +match_ipix = ah.lonlat_to_healpix(ra, dec, nside, order='nested') + +match_index = np.flatnonzero(ipix == match_ipix)[0] + +prob_density = skymap[match_index]['PROBDENSITY'].to_value(u.deg**-2) +``` + +#### 90% Probability Region + +The estimation of a 90% probability region involves sorting the pixels, calculating the area of each pixel, and then summing the probability of each pixel until 90% is reached. + +```python +#Sort the pixels by decending probability density +skymap.sort('PROBDENSITY', reverse=True) + +#Area of each pixel +level, ipix = ah.uniq_to_level_ipix(skymap['UNIQ']) +pixel_area = ah.nside_to_pixel_area(ah.level_to_nside(level)) + +#Pixel area times the probability +prob = pixel_area * skymap['PROBDENSITY'] + +#Cummulative sum of probability +cumprob = np.cumsum(prob) + +#Pixels for which cummulative is 0.9 +i = cumprob.searchsorted(0.9) + +#Sum of the areas of the pixels up to that one +area_90 = pixel_area[:i].sum() +area_90.to_value(u.deg**2) +``` + +### Flat Resolution HEALPix Sky maps + +A sky map `.fits.gz` file can be read in using `healpy`: + +```python +import healpy as hp +import numpy as np +from matplotlib import pyplot as plt + +# Read both the HEALPix image data and the FITS header +hpx, header = hp.read_map('skymap.fits.gz', h=True) + +# Plot a Mollweide-projection all-sky image +np.mollview(hpx) +plt.show() +``` + +#### Most Probable Sky Location + +The point on the sky with the highest probability can be found by finding the maximum value in the HEALPix sky map: + +```python +# Reading Sky Maps with Healpy +healpix_image = hp.read_map('bayestar.fits.gz,0') +npix = len(hpx) + +# Lateral resolution of the HEALPix map +nside = hp.npix2nside(npix) + +# Find the highest probability pixel +ipix_max = np.argmax(hpx) + +# Probability density per square degree at that position +hpx[ipix_max] / hp.nside2pixarea(nside, degrees=True) + +# Highest probability pixel on the sky +ra, dec = hp.pix2ang(nside, ipix_max, lonlat=True) +ra, dec +``` + +#### Integrated probability in a Circle + +We can calculate the integrated probability within an arbitrary circle on the sky: + +```python +# First define the Cartesian coordinates of the center of the circle +ra = 180.0 +dec = -45.0 +radius = 2.5 + +# Calculate Cartesian coordinates of the center of the Circle +xyz = hp.ang2vec(ra, dec, lonlat=True) + +# Obtain an array of indices for the pixels inside the circle +ipix_disc = hp.query_disc(nside, xyz, np.deg2rad(radius)) + +# Sum the probability in all of the matching pixels: +hpx[ipix_disc].sum() +``` + +#### Integrated probability in a Polygon + +Similar to the integrated probability within a circle, it is possible to calculate the integrated probability of the source lying within an arbitrary polygon: + +```python +# Indices of the pixels within a polygon (defined by the Cartesian coordinates of its vertices) + +xyz = [[0, 0, 0], + [1, 0, 0], + [1, 1, 0], + [0, 1, 0]] +ipix_poly = hp.query_polygon(nside, xyz) +hpx[ipix_poly].sum() +``` + +#### Other Documentation and HEALPix Packages + +For more information and resources on the analysis of pixelated data on a sphere, explore the following links: + +- Additional information can be found on the [LIGO website](https://emfollow.docs.ligo.org/userguide/tutorial/multiorder_skymaps.html) + +- [healpy](https://healpy.readthedocs.io/en/latest/): Official Python library for handling the pixelated data on sphere + +- [astropy-healpix](https://pypi.org/project/astropy-healpix/): Integrates HEALPix with Astropy for data manipulation and analysis + +- [mhealpy](https://mhealpy.readthedocs.io/en/latest/): Object-oriented wrapper of healpy for handling the multi-resolution maps + +- [MOCpy](https://cds-astro.github.io/mocpy/): Python library allowing easy creation, parsing and manipulation of Multi-Order Coverage maps. + +## Bibilography diff --git a/references.bib b/references.bib index 872ba1ef6..ca79daebd 100644 --- a/references.bib +++ b/references.bib @@ -12,3 +12,39 @@ @ARTICLE{1995Ap&SS.231..255A adsurl = {https://ui.adsabs.harvard.edu/abs/1995Ap&SS.231..255A}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } + +@ARTICLE{2005ApJ...622..759G, + author = {{G{\'o}rski}, K.~M. and {Hivon}, E. and {Banday}, A.~J. and {Wandelt}, B.~D. and {Hansen}, F.~K. and {Reinecke}, M. and {Bartelmann}, M.}, + title = "{HEALPix: A Framework for High-Resolution Discretization and Fast Analysis of Data Distributed on the Sphere}", + journal = {Astrophysical Journal}, + keywords = {Cosmology: Cosmic Microwave Background, Cosmology: Observations, Methods: Statistical, Astrophysics}, + year = 2005, + month = apr, + volume = {622}, + number = {2}, + pages = {759-771}, + doi = {10.1086/427976}, +archivePrefix = {arXiv}, + eprint = {astro-ph/0409513}, + primaryClass = {astro-ph}, + adsurl = {https://ui.adsabs.harvard.edu/abs/2005ApJ...622..759G}, + adsnote = {Provided by the SAO/NASA Astrophysics Data System} +} + +@ARTICLE{2015A&A...578A.114F, + author = {{Fernique}, P. and {Allen}, M.~G. and {Boch}, T. and {Oberto}, A. and {Pineau}, F. -X. and {Durand}, D. and {Bot}, C. and {Cambr{\'e}sy}, L. and {Derriere}, S. and {Genova}, F. and {Bonnarel}, F.}, + title = "{Hierarchical progressive surveys. Multi-resolution HEALPix data structures for astronomical images, catalogues, and 3-dimensional data cubes}", + journal = {Astronomy and Astrophysics}, + keywords = {surveys, atlases, astronomical databases: miscellaneous, catalogs, virtual observatory tools, methods: statistical, Astrophysics - Instrumentation and Methods for Astrophysics}, + year = 2015, + month = jun, + volume = {578}, + eid = {A114}, + pages = {A114}, + doi = {10.1051/0004-6361/201526075}, +archivePrefix = {arXiv}, + eprint = {1505.02291}, + primaryClass = {astro-ph.IM}, + adsurl = {https://ui.adsabs.harvard.edu/abs/2015A&A...578A.114F}, + adsnote = {Provided by the SAO/NASA Astrophysics Data System} +} From a82a6e1446dbe405b09ae93c0d437c05557bae4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 22:08:13 +0000 Subject: [PATCH 25/60] Bump undici from 6.19.8 to 6.21.1 Bumps [undici](https://github.com/nodejs/undici) from 6.19.8 to 6.21.1. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v6.19.8...v6.21.1) --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78f5ab4a6..574651831 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26758,9 +26758,9 @@ } }, "node_modules/undici": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", - "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "version": "6.21.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.1.tgz", + "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==", "license": "MIT", "engines": { "node": ">=18.17" From e2be6c96c309e8d3107d67874e43f1db0742fc21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 22:36:30 +0000 Subject: [PATCH 26/60] Bump vite Bumps and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). These dependencies needed to be updated together. Updates `vite` from 5.4.6 to 5.4.14 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.14/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.14/packages/vite) Updates `vite` from 4.5.5 to 5.4.14 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.14/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.14/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: indirect - dependency-name: vite dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 574651831..ed4deb27b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9425,10 +9425,11 @@ } }, "node_modules/@vanilla-extract/integration/node_modules/vite": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", - "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.9.tgz", + "integrity": "sha512-qK9W4xjgD3gXbC0NmdNFFnVFLMWSNiR3swj957yutwzzN16xF/E7nmtAyp1rT9hviDroQANjE4HK3H4WqWdFtw==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -27411,10 +27412,11 @@ } }, "node_modules/vite": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", - "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -27912,10 +27914,11 @@ } }, "node_modules/vite-node/node_modules/vite": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", - "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.9.tgz", + "integrity": "sha512-qK9W4xjgD3gXbC0NmdNFFnVFLMWSNiR3swj957yutwzzN16xF/E7nmtAyp1rT9hviDroQANjE4HK3H4WqWdFtw==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", From 13335f4b9c08fe6e174925cbbf1f4c2694f7aac4 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Thu, 23 Jan 2025 14:39:01 -0500 Subject: [PATCH 27/60] add VTP and code sample announcements --- app/routes/news._index/route.mdx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/routes/news._index/route.mdx b/app/routes/news._index/route.mdx index 802705995..51b4150dd 100644 --- a/app/routes/news._index/route.mdx +++ b/app/routes/news._index/route.mdx @@ -30,18 +30,25 @@ import { Anchor } from '~/components/Anchor' + } > - Circulars over Kafka EventID Backfill + Circulars over Kafka EventID Backfill, Planned Retirement of VOEvent Brokers, New JSON and HEALPix Code Samples - In preparation for new search and sort features in the GCN Circulars archive, we will be backfilling the automatically assigned eventID (e.g. GRB YYMMDDA) derived from each GCN Circular subject. EventIDs have been included in all JSON versions of Circulars starting with GCN Circ 37912. The backfill of all prior Circulars will result in the following behavior that may impact some users: + #### Circulars over Kafka EventID Backfill + In preparation for new search and sort features in the GCN Circulars archive, we will be backfilling the automatically assigned eventID (e.g. GRB YYMMDDA) derived from each GCN Circular subject. EventIDs have been included in all JSON versions of Circulars starting with GCN Circ 37912. The backfill of all prior Circulars will result in the following behavior that may impact some users: - a revision of each Circular will lead to a new version in the archive, with the only change as adding the JSON eventID - ~38k Circular revision will be distributed over Kafka - revised Circulars will not be redistributed over email The eventID backfill will be done in batches beginning on DATE. + #### Planned Retirement of VOEvent Brokers + The result of the November 2024 user survey of those utilizing the GCN VOEvent Brokers to receive VOEvent-format Notices with the VOEvent Transport Protocol is overwhelmingly in favor of retiring the brokers and users migrating to receive VOEvent Notices over Kafka. This service is already available for all GCN Classic Notice types with self-subscription via the [Start Streaming Notices Guide](/quickstart). The [GCN Classic VOEvent brokers](https://gcn.gsfc.nasa.gov/voevent.html) will be retired shortly after the conclusion of the O4 gravitational wave network observing run, [currently scheduled for June 9, 2025](https://observing.docs.ligo.org/plan/). We recommend the following actions for users currently utilizing VOEvent via GCN Classic. + - Sign up to receive VOEvent format Notices via [Kafka or email](/docs/notices/consuming) + - [Let the GCN Team know](/contact) when you're ready to unsubscribe from receiving them via the GCN Classic brokers (if prior to the end of O4) + #### New Parsing and HEALPix Code Samples + The GCN team has created new [Python code samples](/docs/samples) to aid users in setting up their scripts to consume GCN Notices (both GCN Classic legacy formats and new JSON format), and utilize HEALPix localization probability maps. We welcome [contributions](/docs/contributing) of addtional code samples that would be useful for other GCN users. From 1386c8fac682f12da9471f7a5500e5b612b6b368 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Thu, 23 Jan 2025 14:40:02 -0500 Subject: [PATCH 28/60] add announcements --- app/routes/news._index/route.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/routes/news._index/route.mdx b/app/routes/news._index/route.mdx index 51b4150dd..38f059564 100644 --- a/app/routes/news._index/route.mdx +++ b/app/routes/news._index/route.mdx @@ -34,7 +34,7 @@ import { Anchor } from '~/components/Anchor' } > - Circulars over Kafka EventID Backfill, Planned Retirement of VOEvent Brokers, New JSON and HEALPix Code Samples + Circulars over Kafka EventID Backfill, Planned Retirement of VOEvent Brokers, New Code Samples #### Circulars over Kafka EventID Backfill @@ -46,9 +46,9 @@ import { Anchor } from '~/components/Anchor' #### Planned Retirement of VOEvent Brokers The result of the November 2024 user survey of those utilizing the GCN VOEvent Brokers to receive VOEvent-format Notices with the VOEvent Transport Protocol is overwhelmingly in favor of retiring the brokers and users migrating to receive VOEvent Notices over Kafka. This service is already available for all GCN Classic Notice types with self-subscription via the [Start Streaming Notices Guide](/quickstart). The [GCN Classic VOEvent brokers](https://gcn.gsfc.nasa.gov/voevent.html) will be retired shortly after the conclusion of the O4 gravitational wave network observing run, [currently scheduled for June 9, 2025](https://observing.docs.ligo.org/plan/). We recommend the following actions for users currently utilizing VOEvent via GCN Classic. - Sign up to receive VOEvent format Notices via [Kafka or email](/docs/notices/consuming) - - [Let the GCN Team know](/contact) when you're ready to unsubscribe from receiving them via the GCN Classic brokers (if prior to the end of O4) + - [Let the GCN Team know](/contact) when you're ready to unsubscribe from receiving them via the GCN Classic brokers. All GCN Classic VOEvent subscribers will be unsubscribed after the end of O4 and the brokers will be taken offline. #### New Parsing and HEALPix Code Samples - The GCN team has created new [Python code samples](/docs/samples) to aid users in setting up their scripts to consume GCN Notices (both GCN Classic legacy formats and new JSON format), and utilize HEALPix localization probability maps. We welcome [contributions](/docs/contributing) of addtional code samples that would be useful for other GCN users. + The GCN team has created new [Python code samples](/docs/samples) to aid users in setting up their scripts to consume GCN Notices (both GCN Classic legacy formats and new JSON format), and utilize HEALPix localization probability maps. We welcome [contributions](/docs/contributing) of additional code samples that would be useful for other GCN users. From f3b25c76623d57dd6d6e8de4943f81421131629c Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Mon, 27 Jan 2025 14:15:20 -0500 Subject: [PATCH 29/60] remove link to ASD statement --- app/routes/docs.code-of-conduct.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/routes/docs.code-of-conduct.md b/app/routes/docs.code-of-conduct.md index 596e6d8a6..790c40fb6 100644 --- a/app/routes/docs.code-of-conduct.md +++ b/app/routes/docs.code-of-conduct.md @@ -9,8 +9,6 @@ GCN Notices and Circulars are rapid communications which are by definition preli The sharing of preliminary analysis and results in an open and respectful manner enables the productive exchange of information and ideas. Notices and Circulars contain factual information on observations and analysis of astronomical transients, not opinions, speculation, or disagreements with individuals or groups. The Circulars [style guide](/circulars/styleguide) provides additional criteria and community standards for Circular content. -GCN is committed to adhere to the [NASA Astrophysics Statement of Principles](https://cor.gsfc.nasa.gov/docs/HQ/NASA-Astrophysics-Statement-of-Principles-Nov2022.pdf). - ## Retractions If an initial automated or manually-generated Notice/Circular is later deemed to be misclassified as an astronomical object, the generating team should promptly submit another Notice/Circular informing the community of the retracted claim. From 204b92fba4140f074031daacffbc48d7e3ff2ab5 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Fri, 31 Jan 2025 15:46:03 -0500 Subject: [PATCH 30/60] update language --- app/routes/docs.code-of-conduct.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/routes/docs.code-of-conduct.md b/app/routes/docs.code-of-conduct.md index 790c40fb6..f04a6af88 100644 --- a/app/routes/docs.code-of-conduct.md +++ b/app/routes/docs.code-of-conduct.md @@ -23,7 +23,7 @@ The GCN team welcomes cross-compatibility between community astronomical resourc ## Enforcement -The GCN system and community aim to foster an inclusive environment for the exchange of information and ideas. Mistakes are completely understandable in these forms of rapid communication, and the GCN team is happy to work with users to correct any unintentional errors. GCN will not tolerate users who are intentionally disrespectful, misrepresent data or analysis, plagiarize, or reproduce data or analysis without permission of the originator or proper citation. +The GCN system and community aim to foster an open environment for the exchange of information and ideas. Mistakes are completely understandable in these forms of rapid communication, and the GCN team is happy to work with users to correct any unintentional errors. GCN will not tolerate users who are intentionally disrespectful, misrepresent data or analysis, plagiarize, or reproduce data or analysis without permission of the originator or proper citation. Circulars submitting privileges are granted for new users via the GCN [peer endorsement system](/user/endorsements). Any user found to intentionally violate these policies will have their Circulars/Notices submission privileges revoked. This may lead to a review of the peer endorser who approved the offending user. From 9fc7b85e0eb830423102d28bd9fbdff11636d281 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 11:06:19 +0000 Subject: [PATCH 31/60] Bump the remix group with 6 updates Bumps the remix group with 6 updates: | Package | From | To | | --- | --- | --- | | [@remix-run/architect](https://github.com/remix-run/remix/tree/HEAD/packages/remix-architect) | `2.15.2` | `2.15.3` | | [@remix-run/css-bundle](https://github.com/remix-run/remix/tree/HEAD/packages/remix-css-bundle) | `2.15.2` | `2.15.3` | | [@remix-run/node](https://github.com/remix-run/remix/tree/HEAD/packages/remix-node) | `2.15.2` | `2.15.3` | | [@remix-run/react](https://github.com/remix-run/remix/tree/HEAD/packages/remix-react) | `2.15.2` | `2.15.3` | | [@remix-run/dev](https://github.com/remix-run/remix/tree/HEAD/packages/remix-dev) | `2.15.2` | `2.15.3` | | [@remix-run/eslint-config](https://github.com/remix-run/remix/tree/HEAD/packages/remix-eslint-config) | `2.15.2` | `2.15.3` | Updates `@remix-run/architect` from 2.15.2 to 2.15.3 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-architect/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/architect@2.15.3/packages/remix-architect) Updates `@remix-run/css-bundle` from 2.15.2 to 2.15.3 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-css-bundle/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/css-bundle@2.15.3/packages/remix-css-bundle) Updates `@remix-run/node` from 2.15.2 to 2.15.3 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-node/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/node@2.15.3/packages/remix-node) Updates `@remix-run/react` from 2.15.2 to 2.15.3 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-react/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/react@2.15.3/packages/remix-react) Updates `@remix-run/dev` from 2.15.2 to 2.15.3 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-dev/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/dev@2.15.3/packages/remix-dev) Updates `@remix-run/eslint-config` from 2.15.2 to 2.15.3 - [Release notes](https://github.com/remix-run/remix/releases) - [Changelog](https://github.com/remix-run/remix/blob/main/packages/remix-eslint-config/CHANGELOG.md) - [Commits](https://github.com/remix-run/remix/commits/@remix-run/eslint-config@2.15.3/packages/remix-eslint-config) --- updated-dependencies: - dependency-name: "@remix-run/architect" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: remix - dependency-name: "@remix-run/css-bundle" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: remix - dependency-name: "@remix-run/node" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: remix - dependency-name: "@remix-run/react" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: remix - dependency-name: "@remix-run/dev" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: remix - dependency-name: "@remix-run/eslint-config" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: remix ... Signed-off-by: dependabot[bot] --- package-lock.json | 113 +++++++++++++++++++++++++--------------------- package.json | 12 ++--- 2 files changed, 67 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index ed4deb27b..586380d3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,10 +15,10 @@ "@nasa-gcn/schema": "^4.2.0", "@octokit/rest": "^21.0.2", "@opensearch-project/opensearch": "^2.11.0", - "@remix-run/architect": "~2.15.2", - "@remix-run/css-bundle": "~2.15.2", - "@remix-run/node": "~2.15.2", - "@remix-run/react": "~2.15.2", + "@remix-run/architect": "~2.15.3", + "@remix-run/css-bundle": "~2.15.3", + "@remix-run/node": "~2.15.3", + "@remix-run/react": "~2.15.3", "@trussworks/react-uswds": "github:lpsinger/react-uswds#gcn", "@xmldom/xmldom": "^0.9.6", "aws-lambda-ses-forwarder": "^6.0.0", @@ -81,8 +81,8 @@ "@nasa-gcn/architect-plugin-search": "^1.5.0", "@nasa-gcn/eslint-config-gitignore": "^0.0.2", "@playwright/test": "^1.49.0", - "@remix-run/dev": "~2.15.2", - "@remix-run/eslint-config": "~2.15.2", + "@remix-run/dev": "~2.15.3", + "@remix-run/eslint-config": "~2.15.3", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.1.0", "@trivago/prettier-plugin-sort-imports": "^4.2.1", @@ -6367,12 +6367,13 @@ } }, "node_modules/@remix-run/architect": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/@remix-run/architect/-/architect-2.15.2.tgz", - "integrity": "sha512-dP6VCo8tdkA1kXSBEDrUQUr+jTHSZuOz8RuhGEy9NUiMDHtvy+IyWHuZR8TaWuEn0NBd10hoL/Pxnf0/97JXUg==", + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/architect/-/architect-2.15.3.tgz", + "integrity": "sha512-iC6E/KjtxI75H/MRZsk9HCVJtBMfbyNMYALI+zVAg0AAwpJcDhOJ37Js8lloZ4ngGW0Z99vMLqxX4wpCtz0laQ==", + "license": "MIT", "dependencies": { "@architect/functions": "^5.2.0", - "@remix-run/node": "2.15.2", + "@remix-run/node": "2.15.3", "@remix-run/web-fetch": "^4.4.2", "@types/aws-lambda": "^8.10.82" }, @@ -6389,18 +6390,20 @@ } }, "node_modules/@remix-run/css-bundle": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/@remix-run/css-bundle/-/css-bundle-2.15.2.tgz", - "integrity": "sha512-/GX8qPfUa9lZI0rx270/JH8oq4X3KFy7FlYV5dSB9pJjc5uR0BVkfb5htpS/U55o7d0qVwa28Wa9y5Z8D01CEQ==", + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/css-bundle/-/css-bundle-2.15.3.tgz", + "integrity": "sha512-4vOuD+StpDzYOfsMQV0iAdVEpmLghuZEHxFcHReE+X8UXEzPRNAKy2hIM3N8Q7o9ciEaC5Ix8F3KS2g1O6HGsA==", + "license": "MIT", "engines": { "node": ">=18.0.0" } }, "node_modules/@remix-run/dev": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/@remix-run/dev/-/dev-2.15.2.tgz", - "integrity": "sha512-o8lix8t4GBhtXjo/G1IzwtHVW5GRMs7amtFtBHiR1bhSyK7VyX5qGtTDmJyny5QDv83pxaLOCiE0dUng2BCoyQ==", + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/dev/-/dev-2.15.3.tgz", + "integrity": "sha512-agndQJHs7qISPXXH/Zet0VHWvcwtQGoEOXxltjerNQ2zWcAJQBm9i06tS6n6v/ZP0sHIVdo/IsvgAA4wetqmNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.21.8", "@babel/generator": "^7.21.5", @@ -6412,9 +6415,9 @@ "@babel/types": "^7.22.5", "@mdx-js/mdx": "^2.3.0", "@npmcli/package-json": "^4.0.1", - "@remix-run/node": "2.15.2", - "@remix-run/router": "1.21.0", - "@remix-run/server-runtime": "2.15.2", + "@remix-run/node": "2.15.3", + "@remix-run/router": "1.22.0", + "@remix-run/server-runtime": "2.15.3", "@types/mdx": "^2.0.5", "@vanilla-extract/integration": "^6.2.0", "arg": "^5.0.1", @@ -6465,8 +6468,8 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@remix-run/react": "^2.15.2", - "@remix-run/serve": "^2.15.2", + "@remix-run/react": "^2.15.3", + "@remix-run/serve": "^2.15.3", "typescript": "^5.1.0", "vite": "^5.1.0", "wrangler": "^3.28.2" @@ -7079,10 +7082,11 @@ } }, "node_modules/@remix-run/eslint-config": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/@remix-run/eslint-config/-/eslint-config-2.15.2.tgz", - "integrity": "sha512-zch4J6ImrEjSvCbT9qufhubm6ym8E7LgGWpRihR2KB6oZndKEnSNe4ZklrwFXxIeGG+ACFSVm9JPR0lmAcAbTg==", + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/eslint-config/-/eslint-config-2.15.3.tgz", + "integrity": "sha512-p9V3rvFAgFRPyjxZnW9bTR7WZfTl13wcbfWtySWcNdeqJZauCN9xdkB1r+PnsjaK77RXWtSCsEgRn/+mwx9Kzg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.21.8", "@babel/eslint-parser": "^7.21.8", @@ -7140,11 +7144,12 @@ } }, "node_modules/@remix-run/node": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.15.2.tgz", - "integrity": "sha512-NS/h5uxje7DYCNgcKqKAiUhf0r2HVnoYUBWLyIIMmCUP1ddWurBP6xTPcWzGhEvV/EvguniYi1wJZ5+X8sonWw==", + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.15.3.tgz", + "integrity": "sha512-TYfS6BPhbABBpSRZ6WBA4qIWSwWvJhRVQGXCHUtgOwkuW863rcFmjh9g2Xj/IHyTmbOYPdcjHsIgZ9el4CHOKQ==", + "license": "MIT", "dependencies": { - "@remix-run/server-runtime": "2.15.2", + "@remix-run/server-runtime": "2.15.3", "@remix-run/web-fetch": "^4.4.2", "@web3-storage/multipart-parser": "^1.0.0", "cookie-signature": "^1.1.0", @@ -7165,14 +7170,15 @@ } }, "node_modules/@remix-run/react": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.15.2.tgz", - "integrity": "sha512-NAAMsSgoC/sdOgovUewwRCE/RUm3F+MBxxZKfwu3POCNeHaplY5qGkH/y8PUXvdN1EBG7Z0Ko43dyzCfcEy5PA==", - "dependencies": { - "@remix-run/router": "1.21.0", - "@remix-run/server-runtime": "2.15.2", - "react-router": "6.28.1", - "react-router-dom": "6.28.1", + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.15.3.tgz", + "integrity": "sha512-AynCltIk8KLlxV9a+4dORtEMNtF5wJAzBNBZLJMdw3FCJNQZRYQSen8rDnIovOOiz9UNZ2SmBTFERiFMKS16jw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.22.0", + "@remix-run/server-runtime": "2.15.3", + "react-router": "6.29.0", + "react-router-dom": "6.29.0", "turbo-stream": "2.4.0" }, "engines": { @@ -7190,20 +7196,21 @@ } }, "node_modules/@remix-run/router": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz", - "integrity": "sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.22.0.tgz", + "integrity": "sha512-MBOl8MeOzpK0HQQQshKB7pABXbmyHizdTpqnrIseTbsv0nAepwC2ENZa1aaBExNQcpLoXmWthhak8SABLzvGPw==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/@remix-run/server-runtime": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.15.2.tgz", - "integrity": "sha512-OqiPcvEnnU88B8b1LIWHHkQ3Tz2GDAmQ1RihFNQsbrFKpDsQLkw0lJlnfgKA/uHd0CEEacpfV7C9qqJT3V6Z2g==", + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.15.3.tgz", + "integrity": "sha512-taHBe1DEqxZNjjj6OfkSYbup+sZPjbTgUhykaI+nHqrC2NDQuTiisBXhLwtx60GctONR/x0lWhF7R9ZGC5WsHw==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.21.0", + "@remix-run/router": "1.22.0", "@types/cookie": "^0.6.0", "@web3-storage/multipart-parser": "^1.0.0", "cookie": "^0.6.0", @@ -23490,11 +23497,12 @@ } }, "node_modules/react-router": { - "version": "6.28.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.1.tgz", - "integrity": "sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==", + "version": "6.29.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.29.0.tgz", + "integrity": "sha512-DXZJoE0q+KyeVw75Ck6GkPxFak63C4fGqZGNijnWgzB/HzSP1ZfTlBj5COaGWwhrMQ/R8bXiq5Ooy4KG+ReyjQ==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.21.0" + "@remix-run/router": "1.22.0" }, "engines": { "node": ">=14.0.0" @@ -23504,12 +23512,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.28.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.1.tgz", - "integrity": "sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==", + "version": "6.29.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.29.0.tgz", + "integrity": "sha512-pkEbJPATRJ2iotK+wUwHfy0xs2T59YPEN8BQxVCPeBZvK7kfPESRc/nyxzdcxR17hXgUPYx2whMwl+eo9cUdnQ==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.21.0", - "react-router": "6.28.1" + "@remix-run/router": "1.22.0", + "react-router": "6.29.0" }, "engines": { "node": ">=14.0.0" diff --git a/package.json b/package.json index 58d4337e0..80ec9692f 100644 --- a/package.json +++ b/package.json @@ -33,10 +33,10 @@ "@nasa-gcn/schema": "^4.2.0", "@octokit/rest": "^21.0.2", "@opensearch-project/opensearch": "^2.11.0", - "@remix-run/architect": "~2.15.2", - "@remix-run/css-bundle": "~2.15.2", - "@remix-run/node": "~2.15.2", - "@remix-run/react": "~2.15.2", + "@remix-run/architect": "~2.15.3", + "@remix-run/css-bundle": "~2.15.3", + "@remix-run/node": "~2.15.3", + "@remix-run/react": "~2.15.3", "@trussworks/react-uswds": "github:lpsinger/react-uswds#gcn", "@xmldom/xmldom": "^0.9.6", "aws-lambda-ses-forwarder": "^6.0.0", @@ -99,8 +99,8 @@ "@nasa-gcn/architect-plugin-search": "^1.5.0", "@nasa-gcn/eslint-config-gitignore": "^0.0.2", "@playwright/test": "^1.49.0", - "@remix-run/dev": "~2.15.2", - "@remix-run/eslint-config": "~2.15.2", + "@remix-run/dev": "~2.15.3", + "@remix-run/eslint-config": "~2.15.3", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.1.0", "@trivago/prettier-plugin-sort-imports": "^4.2.1", From d6f64a86b5d4e55161d5164615dc2202230caae2 Mon Sep 17 00:00:00 2001 From: Courey Elliott Date: Thu, 6 Feb 2025 13:20:17 -0500 Subject: [PATCH 32/60] fixing grouping locally --- sandbox-search.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sandbox-search.js b/sandbox-search.js index f2b881765..c7b523a1b 100644 --- a/sandbox-search.js +++ b/sandbox-search.js @@ -11,7 +11,7 @@ export default async function () { const text = await readFile('sandbox-seed.json', { encoding: 'utf-8' }) const { circulars, synonyms } = JSON.parse(text) const groups = Object.entries( - Object.groupBy(synonyms, ({ synonymId }) => ({ synonymId })) + Object.groupBy(synonyms, ({ synonymId }) => synonymId) ).flatMap(([synonymId, values]) => [ { synonymId, From a1375e5310460321ccbb2eb3438ddcd226d36921 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Fri, 7 Feb 2025 16:12:16 -0500 Subject: [PATCH 33/60] add FRB keyword --- app/routes/circulars/circulars.lib.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/routes/circulars/circulars.lib.ts b/app/routes/circulars/circulars.lib.ts index 53e8501ca..8e9bf2e7b 100644 --- a/app/routes/circulars/circulars.lib.ts +++ b/app/routes/circulars/circulars.lib.ts @@ -162,6 +162,7 @@ export const validSubjectKeywords = [ 'Chandra', 'EP', 'Fermi', + 'FRB', 'FXT', 'GRANDMA', 'GRB', From 87745292d9d22e80e2bdfdcf75ebb3ad70084a8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 04:48:26 +0000 Subject: [PATCH 34/60] Bump esbuild from 0.24.2 to 0.25.0 Bumps [esbuild](https://github.com/evanw/esbuild) from 0.24.2 to 0.25.0. - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2024.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.24.2...v0.25.0) --- updated-dependencies: - dependency-name: esbuild dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 270 +++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 150 insertions(+), 122 deletions(-) diff --git a/package-lock.json b/package-lock.json index 586380d3e..e17444413 100644 --- a/package-lock.json +++ b/package-lock.json @@ -105,7 +105,7 @@ "@types/tar-stream": "^3.1.1", "autoprefixer": "^10.4.20", "aws-sdk-mock": "^5.9.0", - "esbuild": "^0.24.2", + "esbuild": "^0.25.0", "eslint": "^8.57.1", "eslint-config-prettier": "^10.0.1", "eslint-plugin-jest": "^27.9.0", @@ -4206,13 +4206,14 @@ "dev": true }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -4222,13 +4223,14 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -4238,13 +4240,14 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -4254,13 +4257,14 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -4270,13 +4274,14 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4286,13 +4291,14 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4302,13 +4308,14 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -4318,13 +4325,14 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -4334,13 +4342,14 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4350,13 +4359,14 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4366,13 +4376,14 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4382,13 +4393,14 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4398,13 +4410,14 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4414,13 +4427,14 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4430,13 +4444,14 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4446,13 +4461,14 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4462,13 +4478,14 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4478,13 +4495,14 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -4494,13 +4512,14 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -4510,13 +4529,14 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -4526,13 +4546,14 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -4542,13 +4563,14 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -4558,13 +4580,14 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -4574,13 +4597,14 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -4590,13 +4614,14 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -6887,6 +6912,24 @@ "@esbuild/win32-x64": "0.17.6" } }, + "node_modules/@remix-run/dev/node_modules/esbuild-plugins-node-modules-polyfill": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.6.8.tgz", + "integrity": "sha512-bRB4qbgUDWrdY1eMk123KiaCSW9VzQ+QLZrmU7D//cCFkmksPd9mUMpmWoFK/rxjIeTfTSOpKCoGoimlvI+AWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jspm/core": "2.0.1", + "local-pkg": "^0.5.0", + "resolve.exports": "^2.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.14.0 <=0.24.x" + } + }, "node_modules/@remix-run/dev/node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -13177,11 +13220,12 @@ } }, "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -13189,48 +13233,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/esbuild-plugins-node-modules-polyfill": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.6.8.tgz", - "integrity": "sha512-bRB4qbgUDWrdY1eMk123KiaCSW9VzQ+QLZrmU7D//cCFkmksPd9mUMpmWoFK/rxjIeTfTSOpKCoGoimlvI+AWw==", - "dev": true, - "dependencies": { - "@jspm/core": "2.0.1", - "local-pkg": "^0.5.0", - "resolve.exports": "^2.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.14.0 <=0.24.x" + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" } }, "node_modules/escalade": { @@ -19260,6 +19287,7 @@ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", "dev": true, + "license": "MIT", "dependencies": { "mlly": "^1.7.3", "pkg-types": "^1.2.1" diff --git a/package.json b/package.json index 80ec9692f..f6238e677 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,7 @@ "@types/tar-stream": "^3.1.1", "autoprefixer": "^10.4.20", "aws-sdk-mock": "^5.9.0", - "esbuild": "^0.24.2", + "esbuild": "^0.25.0", "eslint": "^8.57.1", "eslint-config-prettier": "^10.0.1", "eslint-plugin-jest": "^27.9.0", From cb10d392cb8a776807fe48d65733b6bb2cef75a1 Mon Sep 17 00:00:00 2001 From: dakota002 Date: Tue, 11 Feb 2025 10:01:30 -0500 Subject: [PATCH 35/60] Adds regex and test for FRB matches in subject line --- __tests__/circulars.ts | 51 +++++++++++++++++++++++++++ app/routes/circulars/circulars.lib.ts | 1 + 2 files changed, 52 insertions(+) diff --git a/__tests__/circulars.ts b/__tests__/circulars.ts index 58aaf873f..408f230ce 100644 --- a/__tests__/circulars.ts +++ b/__tests__/circulars.ts @@ -72,6 +72,7 @@ describe('parseEventFromSubject', () => { const sgrEvent = 'SGR 1935+2154' const ztfEvent = 'ZTF23aabmzlp' const epEvent = 'EP241119a' + const frbEvent = 'FRB 20250206A' test('handles nonsense subject cases', () => { expect(parseEventFromSubject('zawxdrcftvgbhnjm')).toBe(undefined) @@ -572,6 +573,56 @@ describe('parseEventFromSubject', () => { expect(parseEventFromSubject(baksanSubjectWithHyphen)).toBe(baksanEvent) }) }) + + describe('FRB', () => { + test('handles FRB event names', () => { + const frbSubject = + 'FRB 20250206A: MASTER observations and possible mother galaxy' + expect(parseEventFromSubject(frbSubject)).toBe(frbEvent) + }) + + test('handles FRB event names in misc positions', () => { + const frbSubjectWithSpace = + 'MASTER observations:FRB 20250206A and possible mother galaxy' + expect(parseEventFromSubject(frbSubjectWithSpace)).toBe(frbEvent) + }) + + test('handles FRB event names without space', () => { + const frbSubjectWithNoSpace = + 'FRB20250206A: MASTER observations and possible mother galaxy' + expect(parseEventFromSubject(frbSubjectWithNoSpace)).toBe(frbEvent) + }) + + test('handles FRB event names without spaces in misc positions', () => { + const frbSubjectWithSpace = + 'MASTER observations: FRB20250206A and possible mother galaxy' + expect(parseEventFromSubject(frbSubjectWithSpace)).toBe(frbEvent) + }) + + test('handles FRB event name with an underscore', () => { + const frbSubjectWithUnderscore = + 'FRB_20250206A: MASTER observations and possible mother galaxy' + expect(parseEventFromSubject(frbSubjectWithUnderscore)).toBe(frbEvent) + }) + + test('handles FRB event names with an underscore in misc positions', () => { + const frbSubjectWithUnderscore = + 'MASTER observations and FRB_20250206A: possible mother galaxy' + expect(parseEventFromSubject(frbSubjectWithUnderscore)).toBe(frbEvent) + }) + + test('handles FRB event name with a hyphen', () => { + const frbSubjectWithHyphen = + 'FRB-20250206A: MASTER observations and possible mother galaxy' + expect(parseEventFromSubject(frbSubjectWithHyphen)).toBe(frbEvent) + }) + + test('handles FRB event name with a hyphen in misc positions', () => { + const frbSubjectWithHyphen = + 'MASTER observations: FRB-20250206A and possible mother galaxy' + expect(parseEventFromSubject(frbSubjectWithHyphen)).toBe(frbEvent) + }) + }) }) describe('emailIsAutoReply', () => { diff --git a/app/routes/circulars/circulars.lib.ts b/app/routes/circulars/circulars.lib.ts index 8e9bf2e7b..80eee4cf2 100644 --- a/app/routes/circulars/circulars.lib.ts +++ b/app/routes/circulars/circulars.lib.ts @@ -71,6 +71,7 @@ const subjectMatchers: SubjectMatcher[] = [ ([, id]) => `Baksan Neutrino Observatory Alert ${id}`, ], [/EP[.\s_-]*(\d{6}[a-z])/i, ([, id]) => `EP${id}`], + [/FRB[.\s_-]*(\d{8}[a-z])/i, ([, id]) => `FRB ${id}`.toUpperCase()], ] /** Format a Circular as plain text. */ From fa1c8b8298fc0466dbfd218877cfccca1a15cb50 Mon Sep 17 00:00:00 2001 From: dakota002 Date: Tue, 11 Feb 2025 11:03:52 -0500 Subject: [PATCH 36/60] Makes the event id not required for edits --- app/routes/circulars._archive._index/route.tsx | 2 +- .../CircularEditForm.tsx | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/app/routes/circulars._archive._index/route.tsx b/app/routes/circulars._archive._index/route.tsx index c4a3da84b..7e08625d1 100644 --- a/app/routes/circulars._archive._index/route.tsx +++ b/app/routes/circulars._archive._index/route.tsx @@ -120,7 +120,7 @@ export async function action({ request }: ActionFunctionArgs) { } const eventId = getFormDataString(data, 'eventId') - if (!createdOnDate || !createdOn || !eventId) + if (!createdOnDate || !createdOn) throw new Response(null, { status: 400 }) let zendeskTicketId: number | undefined diff --git a/app/routes/circulars.edit.$circularId/CircularEditForm.tsx b/app/routes/circulars.edit.$circularId/CircularEditForm.tsx index 7caf49128..ecfc37134 100644 --- a/app/routes/circulars.edit.$circularId/CircularEditForm.tsx +++ b/app/routes/circulars.edit.$circularId/CircularEditForm.tsx @@ -149,7 +149,11 @@ export function CircularEditForm({ const dateTimeValid = circularId ? dateTimeIsValid(dateTime) : true const sending = Boolean(useNavigation().formData) const valid = - subjectValid && bodyValid && dateTimeValid && submitterValid && eventIdValid + subjectValid && + bodyValid && + dateTimeValid && + submitterValid && + (!eventId || eventIdValid) let headerText, saveButtonText @@ -278,12 +282,7 @@ export function CircularEditForm({ {intent !== 'new' && ( - + Event ID { setEventId(value) - setEventIdValid(eventIdIsValid(value)) + setEventIdValid(!value || eventIdIsValid(value)) }} /> From 9e00deb07601d498d42966fa64506d4b979d9b42 Mon Sep 17 00:00:00 2001 From: dakota002 Date: Tue, 11 Feb 2025 11:23:39 -0500 Subject: [PATCH 37/60] Fix logic --- app/routes/circulars.edit.$circularId/CircularEditForm.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/routes/circulars.edit.$circularId/CircularEditForm.tsx b/app/routes/circulars.edit.$circularId/CircularEditForm.tsx index ecfc37134..c40aa91a4 100644 --- a/app/routes/circulars.edit.$circularId/CircularEditForm.tsx +++ b/app/routes/circulars.edit.$circularId/CircularEditForm.tsx @@ -149,11 +149,7 @@ export function CircularEditForm({ const dateTimeValid = circularId ? dateTimeIsValid(dateTime) : true const sending = Boolean(useNavigation().formData) const valid = - subjectValid && - bodyValid && - dateTimeValid && - submitterValid && - (!eventId || eventIdValid) + subjectValid && bodyValid && dateTimeValid && submitterValid && eventIdValid let headerText, saveButtonText From 054417b6822e7d444a0de1c0864ddc23108ce868 Mon Sep 17 00:00:00 2001 From: dakota002 Date: Tue, 11 Feb 2025 14:56:19 -0500 Subject: [PATCH 38/60] Moves the date filter button --- app/routes/circulars._archive._index/route.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/routes/circulars._archive._index/route.tsx b/app/routes/circulars._archive._index/route.tsx index c4a3da84b..0046f6d14 100644 --- a/app/routes/circulars._archive._index/route.tsx +++ b/app/routes/circulars._archive._index/route.tsx @@ -284,14 +284,6 @@ export default function () { - {!isGroupView && ( - - )} - {query && !isGroupView && ( )} @@ -313,6 +305,14 @@ export default function () { New + + {!isGroupView && ( + + )} Search for Circulars by submitter, subject, or body text (e.g. 'Fermi From 9a099a69cd11941acce6cac55d8046e38e47d519 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 20:41:32 +0000 Subject: [PATCH 39/60] Bump koa from 2.15.3 to 2.15.4 Bumps [koa](https://github.com/koajs/koa) from 2.15.3 to 2.15.4. - [Release notes](https://github.com/koajs/koa/releases) - [Changelog](https://github.com/koajs/koa/blob/2.15.4/History.md) - [Commits](https://github.com/koajs/koa/compare/2.15.3...2.15.4) --- updated-dependencies: - dependency-name: koa dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e17444413..db34eecd1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18676,10 +18676,11 @@ } }, "node_modules/koa": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", - "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.4.tgz", + "integrity": "sha512-7fNBIdrU2PEgLljXoPWoyY4r1e+ToWCmzS/wwMPbUNs7X+5MMET1ObhJBlUkF5uZG9B6QhM2zS1TsH6adegkiQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", From 7496c1558ac902421dd2ac721b76c343eaf8b9cd Mon Sep 17 00:00:00 2001 From: dakota002 Date: Fri, 14 Feb 2025 14:17:46 -0500 Subject: [PATCH 40/60] Allows undefined event Ids as default --- app/routes/circulars.edit.$circularId/CircularEditForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/routes/circulars.edit.$circularId/CircularEditForm.tsx b/app/routes/circulars.edit.$circularId/CircularEditForm.tsx index c40aa91a4..7a4dcb9a7 100644 --- a/app/routes/circulars.edit.$circularId/CircularEditForm.tsx +++ b/app/routes/circulars.edit.$circularId/CircularEditForm.tsx @@ -136,7 +136,7 @@ export function CircularEditForm({ subjectIsValid(defaultSubject) ) const [eventIdValid, setEventIdValid] = useState( - eventIdIsValid(defaultEventId ?? '') || intent === 'new' + eventIdIsValid(defaultEventId ?? '') || defaultEventId === undefined ) const [body, setBody] = useState(defaultBody) const [subject, setSubject] = useState(defaultSubject) From 596be8ac718b432fbc4dc2586227ec5e9e226ca1 Mon Sep 17 00:00:00 2001 From: dakota002 Date: Fri, 14 Feb 2025 14:26:06 -0500 Subject: [PATCH 41/60] Better formatting --- app/routes/circulars.edit.$circularId/CircularEditForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/routes/circulars.edit.$circularId/CircularEditForm.tsx b/app/routes/circulars.edit.$circularId/CircularEditForm.tsx index 7a4dcb9a7..7efe7727d 100644 --- a/app/routes/circulars.edit.$circularId/CircularEditForm.tsx +++ b/app/routes/circulars.edit.$circularId/CircularEditForm.tsx @@ -136,7 +136,7 @@ export function CircularEditForm({ subjectIsValid(defaultSubject) ) const [eventIdValid, setEventIdValid] = useState( - eventIdIsValid(defaultEventId ?? '') || defaultEventId === undefined + defaultEventId === undefined || eventIdIsValid(defaultEventId) ) const [body, setBody] = useState(defaultBody) const [subject, setSubject] = useState(defaultSubject) From 4c65332ab2a58461413817a53c9b48e8794b4783 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 18:41:47 +0000 Subject: [PATCH 42/60] Bump @octokit/plugin-paginate-rest from 11.3.0 to 11.4.2 Bumps [@octokit/plugin-paginate-rest](https://github.com/octokit/plugin-paginate-rest.js) from 11.3.0 to 11.4.2. - [Release notes](https://github.com/octokit/plugin-paginate-rest.js/releases) - [Commits](https://github.com/octokit/plugin-paginate-rest.js/compare/v11.3.0...v11.4.2) --- updated-dependencies: - dependency-name: "@octokit/plugin-paginate-rest" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index db34eecd1..cbb03ed8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6200,16 +6200,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz", + "integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==", + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.0.tgz", - "integrity": "sha512-n4znWfRinnUQF6TPyxs7EctSAA3yVSP4qlJP2YgI3g9d4Ae2n5F3XDOjbUluKRxPU3rfsgpOboI4O4VtPc6Ilg==", + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.2.tgz", + "integrity": "sha512-BXJ7XPCTDXFF+wxcg/zscfgw2O/iDPtNSkwwR1W1W5c4Mb3zav/M2XvxQ23nVmKj7jpweB4g8viMeCQdm7LMVA==", + "license": "MIT", "dependencies": { - "@octokit/types": "^13.5.0" + "@octokit/types": "^13.7.0" }, "engines": { "node": ">= 18" @@ -6283,11 +6285,12 @@ } }, "node_modules/@octokit/types": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz", + "integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==", + "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^22.2.0" + "@octokit/openapi-types": "^23.0.1" } }, "node_modules/@opensearch-project/opensearch": { From 918ddacb5903a6c84b7af699c3ab327d81a9e4db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 23:06:52 +0000 Subject: [PATCH 43/60] Bump @octokit/endpoint from 10.1.1 to 10.1.3 Bumps [@octokit/endpoint](https://github.com/octokit/endpoint.js) from 10.1.1 to 10.1.3. - [Release notes](https://github.com/octokit/endpoint.js/releases) - [Commits](https://github.com/octokit/endpoint.js/compare/v10.1.1...v10.1.3) --- updated-dependencies: - dependency-name: "@octokit/endpoint" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index cbb03ed8b..1118cf2cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6175,11 +6175,12 @@ } }, "node_modules/@octokit/endpoint": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", - "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.3.tgz", + "integrity": "sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==", + "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0", + "@octokit/types": "^13.6.2", "universal-user-agent": "^7.0.2" }, "engines": { From dde73ee7ef68ed7ea7de189c4db529a56f458679 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 23:10:14 +0000 Subject: [PATCH 44/60] Bump @octokit/request-error from 6.1.1 to 6.1.7 Bumps [@octokit/request-error](https://github.com/octokit/request-error.js) from 6.1.1 to 6.1.7. - [Release notes](https://github.com/octokit/request-error.js/releases) - [Commits](https://github.com/octokit/request-error.js/compare/v6.1.1...v6.1.7) --- updated-dependencies: - dependency-name: "@octokit/request-error" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1118cf2cf..d78c7cc82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6261,11 +6261,12 @@ } }, "node_modules/@octokit/request-error": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.1.tgz", - "integrity": "sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz", + "integrity": "sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==", + "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0" + "@octokit/types": "^13.6.2" }, "engines": { "node": ">= 18" From d4e05425cd7c6e4946cd0bd0d2fa66f8788da579 Mon Sep 17 00:00:00 2001 From: Leo Singer Date: Tue, 18 Feb 2025 11:22:53 -0500 Subject: [PATCH 45/60] Add SVOM to subject keyword list --- app/routes/circulars/circulars.lib.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/routes/circulars/circulars.lib.ts b/app/routes/circulars/circulars.lib.ts index 80eee4cf2..e435e8f59 100644 --- a/app/routes/circulars/circulars.lib.ts +++ b/app/routes/circulars/circulars.lib.ts @@ -195,6 +195,7 @@ export const validSubjectKeywords = [ 'SGR', 'Super-Kamiokande', 'Suzaku', + 'SVOM', 'Swift', 'transient', 'VLA', From adf0363c939eff0c2ca686cf25cb6980cf9107ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 17:39:23 +0000 Subject: [PATCH 46/60] Bump @octokit/request from 9.1.1 to 9.2.2 Bumps [@octokit/request](https://github.com/octokit/request.js) from 9.1.1 to 9.2.2. - [Release notes](https://github.com/octokit/request.js/releases) - [Commits](https://github.com/octokit/request.js/compare/v9.1.1...v9.2.2) --- updated-dependencies: - dependency-name: "@octokit/request" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d78c7cc82..d3fdd1e18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6247,13 +6247,15 @@ } }, "node_modules/@octokit/request": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.1.tgz", - "integrity": "sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.2.tgz", + "integrity": "sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==", + "license": "MIT", "dependencies": { - "@octokit/endpoint": "^10.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.1.0", + "@octokit/endpoint": "^10.1.3", + "@octokit/request-error": "^6.1.7", + "@octokit/types": "^13.6.2", + "fast-content-type-parse": "^2.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -14525,6 +14527,22 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, + "node_modules/fast-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", From a41ed38ef44ce756a2e143f73efe49d4c24840e0 Mon Sep 17 00:00:00 2001 From: Leo Singer Date: Tue, 18 Feb 2025 15:37:17 -0500 Subject: [PATCH 47/60] Fix some spelling errors --- __playwright__/circulars/archive.spec.ts | 2 +- __tests__/circulars.ts | 2 +- __tests__/cognito.server.ts | 14 +++++------ .../NoticeTypeCheckboxes.tsx | 4 ++-- app/components/ReCAPTCHA.tsx | 2 +- .../nested-checkboxes/NestedCheckboxes.tsx | 12 +++++----- app/lib/pagination.ts | 4 ++-- app/root.tsx | 2 +- app/routes/api.tooltip.arxiv.$.ts | 2 +- app/routes/circulars._archive.tsx | 2 +- .../docs.circulars.corrections/route.mdx | 12 +++++----- app/routes/docs.circulars.styleguide.mdx | 8 +++---- app/routes/docs.client.samples.md | 8 +++---- app/routes/docs.code-of-conduct.md | 2 +- .../docs.contributing.configuration/route.mdx | 2 +- .../docs.contributing.deployment/route.mdx | 4 ++-- app/routes/docs.contributing.npr7150.md | 6 ++--- .../docs.contributing.project/route.mdx | 2 +- app/routes/docs.contributing.testing.md | 2 +- app/routes/docs.faq/route.mdx | 2 +- app/routes/docs.history/route.mdx | 2 +- app/routes/docs.notices.consuming.mdx | 2 +- app/routes/docs.vtp.mdx | 2 +- app/routes/missions.calet/route.mdx | 6 ++--- app/routes/missions.chime/route.mdx | 2 +- app/routes/missions.maxi/route.mdx | 2 +- app/routes/missions.snews/route.mdx | 24 +++++++++---------- app/routes/news._index/route.mdx | 12 +++++----- app/routes/news/components.tsx | 2 +- app/routes/user.email._index/route.tsx | 6 ++--- .../user.email/email_announcements.server.ts | 2 +- .../user.endorsements/endorsements.server.ts | 2 +- 32 files changed, 79 insertions(+), 79 deletions(-) diff --git a/__playwright__/circulars/archive.spec.ts b/__playwright__/circulars/archive.spec.ts index 74d2ffd22..bd954d953 100644 --- a/__playwright__/circulars/archive.spec.ts +++ b/__playwright__/circulars/archive.spec.ts @@ -48,7 +48,7 @@ test.describe('Circulars archive page', () => { }) test('search finds no results for query with typo', async ({ page }) => { - // this highlights this search behaviour does not capture cases where there is a minor typo + // this highlights this search behavior does not capture cases where there is a minor typo await page.goto('/circulars?query=230812C') await page.waitForLoadState() await expect( diff --git a/__tests__/circulars.ts b/__tests__/circulars.ts index 408f230ce..85a5e6726 100644 --- a/__tests__/circulars.ts +++ b/__tests__/circulars.ts @@ -627,7 +627,7 @@ describe('parseEventFromSubject', () => { describe('emailIsAutoReply', () => { const invalidFwdSubject = 'FWD: Check this out' - test('detects valid subjectline', () => { + test('detects valid subject line', () => { expect(emailIsAutoReply(invalidFwdSubject)).toBe(true) }) }) diff --git a/__tests__/cognito.server.ts b/__tests__/cognito.server.ts index 7e3549e8f..7d881df6a 100644 --- a/__tests__/cognito.server.ts +++ b/__tests__/cognito.server.ts @@ -12,7 +12,7 @@ import { extractAttributeRequired, } from '~/lib/cognito.server' -const mockUserAttribues: AttributeType[] = [ +const mockUserAttributes: AttributeType[] = [ { Name: 'sub', Value: '00000000-0000-0000-0000-000000000000' }, { Name: 'email', Value: 'example@example.com' }, { Name: 'name', Value: 'Example User' }, @@ -21,17 +21,17 @@ const mockUserAttribues: AttributeType[] = [ describe('extractAttribute', () => { test('extracts name attribute', () => { - expect(extractAttribute(mockUserAttribues, 'name')).toBe('Example User') + expect(extractAttribute(mockUserAttributes, 'name')).toBe('Example User') }) test('extracts affiliation attribute', () => { - expect(extractAttribute(mockUserAttribues, 'custom:affiliation')).toBe( + expect(extractAttribute(mockUserAttributes, 'custom:affiliation')).toBe( 'The Example Institute' ) }) test('returns undefined if missing attribute', () => { - expect(extractAttribute(mockUserAttribues, 'username')).toBe(undefined) + expect(extractAttribute(mockUserAttributes, 'username')).toBe(undefined) }) test('returns undefined if attributes array is undefined', () => { @@ -41,20 +41,20 @@ describe('extractAttribute', () => { describe('extractAttributeRequired', () => { test('extracts email attribute', () => { - expect(extractAttributeRequired(mockUserAttribues, 'email')).toBe( + expect(extractAttributeRequired(mockUserAttributes, 'email')).toBe( 'example@example.com' ) }) test('extracts sub attribute', () => { - expect(extractAttributeRequired(mockUserAttribues, 'sub')).toBe( + expect(extractAttributeRequired(mockUserAttributes, 'sub')).toBe( '00000000-0000-0000-0000-000000000000' ) }) test('throws error when attribute key is missing', () => { expect(() => - extractAttributeRequired(mockUserAttribues, 'username') + extractAttributeRequired(mockUserAttributes, 'username') ).toThrow(new Error('required user attribute username is missing')) }) }) diff --git a/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx b/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx index 690b86b3e..1c66fd2ea 100644 --- a/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx +++ b/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx @@ -254,7 +254,7 @@ export function NoticeTypeCheckboxes({ JsonNoticeTypeLinks.KM3NET = '/missions/km3net' } - const counterfunction = (childRef: HTMLInputElement) => { + const counterFunction = (childRef: HTMLInputElement) => { if (childRef.checked) { userSelected.add(childRef.name) } else { @@ -322,7 +322,7 @@ export function NoticeTypeCheckboxes({ : false, })), }))} - childoncheckhandler={counterfunction} + childOnCheckHandler={counterFunction} />
{humanizedCount(selectedCounter, 'notice type')} selected for{' '} diff --git a/app/components/ReCAPTCHA.tsx b/app/components/ReCAPTCHA.tsx index aacce5a3e..d4afb3686 100644 --- a/app/components/ReCAPTCHA.tsx +++ b/app/components/ReCAPTCHA.tsx @@ -14,7 +14,7 @@ import { useRecaptchaSiteKey } from '~/root' // Something really weird is going on with default imports here. // On the server side, BaseReCAPTCHA is the module itself. -// On the client side, BaseReCAPTCAH is the module's default import. +// On the client side, BaseReCAPTCHA is the module's default import. const BaseRECAPTCHAComponent = 'ReCAPTCHA' in BaseReCAPTCHA ? (BaseReCAPTCHA.ReCAPTCHA as typeof BaseReCAPTCHA) diff --git a/app/components/nested-checkboxes/NestedCheckboxes.tsx b/app/components/nested-checkboxes/NestedCheckboxes.tsx index 14cef7644..8f0b2f597 100644 --- a/app/components/nested-checkboxes/NestedCheckboxes.tsx +++ b/app/components/nested-checkboxes/NestedCheckboxes.tsx @@ -16,7 +16,7 @@ type CheckboxProps = CheckboxArgs[0] interface NestedCheckboxProps extends CheckboxProps { nodes: CheckboxProps[] link?: string - childoncheckhandler?: (arg: HTMLInputElement) => void + childOnCheckHandler?: (arg: HTMLInputElement) => void } function allTrue(values: boolean[]) { @@ -34,7 +34,7 @@ function isExternalLink(link: string): boolean { function NestedCheckboxNode({ nodes, link, - childoncheckhandler = () => null, + childOnCheckHandler = () => null, ...topLevelNodeProps }: NestedCheckboxProps) { const [expanded, setExpanded] = useState(false) @@ -61,7 +61,7 @@ function NestedCheckboxNode({ for (const ref in childRefs.current) { const childRef = childRefs.current[ref] if (childRef != null) { - childoncheckhandler(childRef) + childOnCheckHandler(childRef) } } }) @@ -133,12 +133,12 @@ function NestedCheckboxNode({ interface NestedCheckboxesProps { nodes: NestedCheckboxProps[] - childoncheckhandler?: (arg: HTMLInputElement) => void + childOnCheckHandler?: (arg: HTMLInputElement) => void } export function NestedCheckboxes({ nodes, - childoncheckhandler, + childOnCheckHandler, }: NestedCheckboxesProps) { return (
    @@ -146,7 +146,7 @@ export function NestedCheckboxes({ ))}
diff --git a/app/lib/pagination.ts b/app/lib/pagination.ts index 9986d6787..aee3d24b3 100644 --- a/app/lib/pagination.ts +++ b/app/lib/pagination.ts @@ -6,9 +6,9 @@ type Page = | { type: 'number'; number: number; isCurrent: boolean } /** - * Implement the pagination algorithm desscribed at + * Implement the pagination algorithm described at * https://designsystem.digital.gov/components/pagination/. - * Impmenetation is adapted from https://github.com/trussworks/react-uswds/blob/main/src/components/Pagination/Pagination.tsx */ + * Implementation is adapted from https://github.com/trussworks/react-uswds/blob/main/src/components/Pagination/Pagination.tsx */ export function usePagination({ totalPages, currentPage, diff --git a/app/root.tsx b/app/root.tsx index 41aa0b855..ca31d8db8 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -132,7 +132,7 @@ export async function loader({ request }: LoaderFunctionArgs) { } } -/** Don't reevaluate this route's loader due to client-side navigations. */ +/** Don't reevaluate this route's loader due to client-side navigation. */ export function shouldRevalidate() { return false } diff --git a/app/routes/api.tooltip.arxiv.$.ts b/app/routes/api.tooltip.arxiv.$.ts index 6c0aa8f1b..51c594673 100644 --- a/app/routes/api.tooltip.arxiv.$.ts +++ b/app/routes/api.tooltip.arxiv.$.ts @@ -26,7 +26,7 @@ export async function loader({ params: { '*': value } }: LoaderFunctionArgs) { .parseFromString(text, 'text/xml') .getElementsByTagName('entry')[0] - // If arXiv does not find the article, then it still returns an entyr, + // If arXiv does not find the article, then it still returns an entry, // although the entry does not contain much. If the id field is missing, then // we report that it was not found. if (!entry.getElementsByTagName('id').length) { diff --git a/app/routes/circulars._archive.tsx b/app/routes/circulars._archive.tsx index ebf8a1e34..bfddc7451 100644 --- a/app/routes/circulars._archive.tsx +++ b/app/routes/circulars._archive.tsx @@ -71,7 +71,7 @@ function DownloadLink({ ) } -/** Don't reevaluate this route's loader due to client-side navigations. */ +/** Don't reevaluate this route's loader due to client-side navigation. */ export function shouldRevalidate() { return false } diff --git a/app/routes/docs.circulars.corrections/route.mdx b/app/routes/docs.circulars.corrections/route.mdx index 7c1c329e3..fe087defe 100644 --- a/app/routes/docs.circulars.corrections/route.mdx +++ b/app/routes/docs.circulars.corrections/route.mdx @@ -3,8 +3,8 @@ handle: breadcrumb: Corrections --- -import requestbuttonscreenshot from './request_correction_button.png' -import versionbuttonscreenshot from './version_button.png' +import requestButtonScreenshot from './request_correction_button.png' +import versionButtonScreenshot from './version_button.png' # Corrections @@ -17,11 +17,11 @@ Anyone with a [peer endorsement](/docs/circulars/submitting#to-request-a-peer-en ## How to request corrections? 1. [Sign in to your GCN account](/login). -2. Go to the [GCN Circulars archive](/circulars) and navigate to the circular that you wish to corret. +2. Go to the [GCN Circulars archive](/circulars) and navigate to the circular that you wish to correct. 3. Select "Request Correction". Screen shot of Circulars archive menu showing how to request corrections. - **Contact Information:** You can list "contact" information (e.g. phone number(s) & e-mail address(s), especially if different than the address that appears in the by-line) to allow the reader to contact you for further communications. However, ensure email signatures are not sent in the email content for your circular. -- **Total Length:** Circular submissions should be brief, generally less than 60 lines, as they must be easily digestable by observers for prompt follow-up. The text must contain the salient information for follow-up. +- **Total Length:** Circular submissions should be brief, generally less than 60 lines, as they must be easily digestible by observers for prompt follow-up. The text must contain the salient information for follow-up. - **Line Wrapping:** When using the legacy GCN Classic system, it was common practice for Circulars submitters to add line breaks to manually wrap long paragraphs. This practice is no longer recommended. -- **URLs & Tables:** It is acceptable to provide a URL in cases where content does not fit within the Style Guide. The URL must be active at the time of Circular submission. Examples include reports of many observations, images or spectra, or detailed descriptions of model assumptions for predictive circulars. However, see "Dont's" below. +- **URLs & Tables:** It is acceptable to provide a URL in cases where content does not fit within the Style Guide. The URL must be active at the time of Circular submission. Examples include reports of many observations, images or spectra, or detailed descriptions of model assumptions for predictive circulars. However, see [Dont's](#donts) below. - **Tabs and Special Characters:** The use of tabs in producing tables is cautioned, because the recipient may have a different tab-stop setting than the one you used (tabstops of 4 and 8 spaces are common). For things like exponentiation, please use techniques like: 1.2x10^-11 erg/cm2-s or 1.2x10E-11 erg/cm^2-s, etc. - **Mail Formatting** Plain text is extracted from emails and attachments are removed. diff --git a/app/routes/docs.client.samples.md b/app/routes/docs.client.samples.md index 0d543dcdf..be1d71739 100644 --- a/app/routes/docs.client.samples.md +++ b/app/routes/docs.client.samples.md @@ -229,7 +229,7 @@ prob_density = skymap[match_index]['PROBDENSITY'].to_value(u.deg**-2) The estimation of a 90% probability region involves sorting the pixels, calculating the area of each pixel, and then summing the probability of each pixel until 90% is reached. ```python -#Sort the pixels by decending probability density +#Sort the pixels by descending probability density skymap.sort('PROBDENSITY', reverse=True) #Area of each pixel @@ -239,10 +239,10 @@ pixel_area = ah.nside_to_pixel_area(ah.level_to_nside(level)) #Pixel area times the probability prob = pixel_area * skymap['PROBDENSITY'] -#Cummulative sum of probability +#Cumulative sum of probability cumprob = np.cumsum(prob) -#Pixels for which cummulative is 0.9 +#Pixels for which cumulative is 0.9 i = cumprob.searchsorted(0.9) #Sum of the areas of the pixels up to that one @@ -339,4 +339,4 @@ For more information and resources on the analysis of pixelated data on a sphere - [MOCpy](https://cds-astro.github.io/mocpy/): Python library allowing easy creation, parsing and manipulation of Multi-Order Coverage maps. -## Bibilography +## Bibliography diff --git a/app/routes/docs.code-of-conduct.md b/app/routes/docs.code-of-conduct.md index f04a6af88..dc86cc8ae 100644 --- a/app/routes/docs.code-of-conduct.md +++ b/app/routes/docs.code-of-conduct.md @@ -19,7 +19,7 @@ Circulars authors can request edits to their own archived Circulars to correct i ## Reproducing GCN Notices or Circulars in External Archives -The GCN team welcomes cross-compatibility between community astronomical resources. GCN Circulars are scholarly publications and that and the expectations of scientific conduct for citing and reproducing them apply. If GCN Notices, Circulars, or their data are used in other systems, please link back to the original source materal at https://gcn.nasa.gov or https://gcn.gsfc.nasa.gov. +The GCN team welcomes cross-compatibility between community astronomical resources. GCN Circulars are scholarly publications and that and the expectations of scientific conduct for citing and reproducing them apply. If GCN Notices, Circulars, or their data are used in other systems, please link back to the original source material at https://gcn.nasa.gov or https://gcn.gsfc.nasa.gov. ## Enforcement diff --git a/app/routes/docs.contributing.configuration/route.mdx b/app/routes/docs.contributing.configuration/route.mdx index c8a7b071e..0e4de83db 100644 --- a/app/routes/docs.contributing.configuration/route.mdx +++ b/app/routes/docs.contributing.configuration/route.mdx @@ -49,7 +49,7 @@ _All_ environment variables are _optional in local development_. _All_ environme heading="Important note about distinct API keys" headingLevel="h4" > - Every API token documented below should have a distinct value for each [deployment stage](deployment#stages), beacuse: + Every API token documented below should have a distinct value for each [deployment stage](deployment#stages), because: - it minimizes the security impact of a compromise of the token in one stage, and - it prevents rate limiting in one deployment stage from impacting other deployment stages. diff --git a/app/routes/docs.contributing.deployment/route.mdx b/app/routes/docs.contributing.deployment/route.mdx index 7937f6575..34eb64eb6 100644 --- a/app/routes/docs.contributing.deployment/route.mdx +++ b/app/routes/docs.contributing.deployment/route.mdx @@ -11,7 +11,7 @@ import websiteArchitectureImg from './website.svg' # Deployment -This web site is deployed **in the cloud** on [Amazon Web Services (AWS)](https://aws.amazon.com) in order resist outages due to local network conditions or distasters. +This web site is deployed **in the cloud** on [Amazon Web Services (AWS)](https://aws.amazon.com) in order resist outages due to local network conditions or disasters. Site assets are replicated and cached through a global **[content delivery network](https://en.wikipedia.org/wiki/Content_delivery_network)** ([AWS CloudFront](https://aws.amazon.com/cloudfront/)) to provide the fastest experience possible to scientists everywhere regardless of their country and location. @@ -107,7 +107,7 @@ changes to [environment variables](/docs/contributiong/configuration). On rare occasions that code changes require the creating or modifying AWS resources other than code, static assets, and environment variables, it may be necessary to manually deploy the web site from your development computer, -beacuse of the limited permissions associated with the AWS IAM role used by the +because of the limited permissions associated with the AWS IAM role used by the continuous deployment pipeline. To manually deploy the web site from your own computer, first [configure the AWS credentials file on your computer](https://docs.aws.amazon.com/cli/v1/userguide/cli-configure-files.html). Then, run the following commands: diff --git a/app/routes/docs.contributing.npr7150.md b/app/routes/docs.contributing.npr7150.md index deaef6d1f..8ae1a8b9f 100644 --- a/app/routes/docs.contributing.npr7150.md +++ b/app/routes/docs.contributing.npr7150.md @@ -7,9 +7,9 @@ import { Table } from '@trussworks/react-uswds' # NPR 7150 -NASA-funded sofware projects must comply with software engineering requirements specified by the [NASA Procedural Requirements (NPR) 7150.2D](https://nodis3.gsfc.nasa.gov/displayDir.cfm?t=NPR&c=7150&s=2D) document. +NASA-funded software projects must comply with software engineering requirements specified by the [NASA Procedural Requirements (NPR) 7150.2D](https://nodis3.gsfc.nasa.gov/displayDir.cfm?t=NPR&c=7150&s=2D) document. -The software classification determines which of NPR 7150.2D's requirements are in force. GCN is classified as [Class D software for non-safety-criticial applications](https://nodis3.gsfc.nasa.gov/displayDir.cfm?Internal_ID=N_PR_7150_002D_&page_name=AppendixD). GCN is fully compliant with the requirements for that classifiation. One of the requirements is that there must be a [requirements matrix](https://nodis3.gsfc.nasa.gov/displayDir.cfm?Internal_ID=N_PR_7150_002D_&page_name=AppendixC), which is satisfied by the table below. +The software classification determines which of NPR 7150.2D's requirements are in force. GCN is classified as [Class D software for non-safety-critical applications](https://nodis3.gsfc.nasa.gov/displayDir.cfm?Internal_ID=N_PR_7150_002D_&page_name=AppendixD). GCN is fully compliant with the requirements for that classification. One of the requirements is that there must be a [requirements matrix](https://nodis3.gsfc.nasa.gov/displayDir.cfm?Internal_ID=N_PR_7150_002D_&page_name=AppendixC), which is satisfied by the table below. @@ -334,7 +334,7 @@ The software classification determines which of NPR 7150.2D's requirements are i - + diff --git a/app/routes/docs.contributing.project/route.mdx b/app/routes/docs.contributing.project/route.mdx index ca6d62a5f..c0ac42905 100644 --- a/app/routes/docs.contributing.project/route.mdx +++ b/app/routes/docs.contributing.project/route.mdx @@ -174,7 +174,7 @@ If there is a difference of more than a couple of points, we discuss why we vote diff --git a/app/routes/docs.contributing.testing.md b/app/routes/docs.contributing.testing.md index cb3320c98..737ae2ec8 100644 --- a/app/routes/docs.contributing.testing.md +++ b/app/routes/docs.contributing.testing.md @@ -33,7 +33,7 @@ To start the recording browser, run the following command: npx playwright codegen localhost:3333 ``` -See the [Playwright codegen intro](https://playwright.dev/docs/codegen-intro) for more infomation on codegen. +See the [Playwright codegen intro](https://playwright.dev/docs/codegen-intro) for more information on codegen. ## Guidelines diff --git a/app/routes/docs.faq/route.mdx b/app/routes/docs.faq/route.mdx index 8dfb054a0..aa25ac987 100644 --- a/app/routes/docs.faq/route.mdx +++ b/app/routes/docs.faq/route.mdx @@ -113,7 +113,7 @@ Note that it used to be common practice for Circulars submitters to add line bre We publish a record to the `gcn.circulars` topic whenever a Circular is created _or modified_. A Circular can be modified in one of two situations: - when a [correction](/docs/circulars/corrections) is made to an existing Circular, resulting a new version of it, or -- when bibilographic data is added to a Circular from the [SAO/NASA Astrophysics Data System (ADS)](https://ui.adsabs.harvard.edu/). GCN [syncronizes with ADS every Monday at 08:00 UTC](/docs/circulars/archive#citing-gcn-circulars), resulting in a bulk update of many of the GCN Circulars from the preceding one-week period. +- when bibliographic data is added to a Circular from the [SAO/NASA Astrophysics Data System (ADS)](https://ui.adsabs.harvard.edu/). GCN [synchronizes with ADS every Monday at 08:00 UTC](/docs/circulars/archive#citing-gcn-circulars), resulting in a bulk update of many of the GCN Circulars from the preceding one-week period. ## Accounts diff --git a/app/routes/docs.history/route.mdx b/app/routes/docs.history/route.mdx index 1f6d33e43..d1d44a35a 100644 --- a/app/routes/docs.history/route.mdx +++ b/app/routes/docs.history/route.mdx @@ -52,4 +52,4 @@ In the tradition of renaming the GCN, but maintaining the acronym, the General C Over the next few years, GCN Classic services will be fully migrated to the new GCN. New Notice types will only be available via the new GCN, and we look forward to many [new capabilities](/docs/roadmap) and the growth of our GCN community. -## Bibilography +## Bibliography diff --git a/app/routes/docs.notices.consuming.mdx b/app/routes/docs.notices.consuming.mdx index 6f7ba6e5d..f18277a2d 100644 --- a/app/routes/docs.notices.consuming.mdx +++ b/app/routes/docs.notices.consuming.mdx @@ -51,6 +51,6 @@ binary, VOEvent), and edit your settings at will. Self-Manage Your Subscription - Your list of Notice Subscriptions is visible in the [emails](/user/email) page. You can edit/delete your exisiting subscriptions at any time. The Test Message button will send a small email to the recipient address associated with the subscription so that you can verify delivery of future notices. + Your list of Notice Subscriptions is visible in the [emails](/user/email) page. You can edit/delete your existing subscriptions at any time. The Test Message button will send a small email to the recipient address associated with the subscription so that you can verify delivery of future notices. diff --git a/app/routes/docs.vtp.mdx b/app/routes/docs.vtp.mdx index 1b5e24dfd..0ea90ca0b 100644 --- a/app/routes/docs.vtp.mdx +++ b/app/routes/docs.vtp.mdx @@ -27,7 +27,7 @@ This migration plan addresses only the transport protocol, not the XML data seri Organizations including the new GCN, Rubin, SCiMMA, have moved away from VTP in favor of more modern, general-purpose data distribution protocols like [Kafka](client). Kafka is widely used throughout industry, is well supported, and is growing in its use in astronomy. As GCN services move from GCN Classic to the new GCN, we are planning to retire the existing GCN Classic VOEvent system as it is currently implemented in several cloud-based servers that do not meet NASA standards. The GCN team is gradually migrating to or replacing GCN Classic services in the new GCN, and is not planning any new development in GCN Classic. -We intend for this transition to be planned, announced, and implemented with ample warning for the user community. We propose 3 alternatives for how to complete this transition, and are soliciting [user feedback](vtp#feedback-survey). We know that many pipelines, robotic telescopes, and users depend on this service and we aim to be minimally distriptive to their operations. +We intend for this transition to be planned, announced, and implemented with ample warning for the user community. We propose 3 alternatives for how to complete this transition, and are soliciting [user feedback](vtp#feedback-survey). We know that many pipelines, robotic telescopes, and users depend on this service and we aim to be minimally disruptive to their operations. ## GCN VTP Migration Options diff --git a/app/routes/missions.calet/route.mdx b/app/routes/missions.calet/route.mdx index 1878eab6c..b26282a1e 100644 --- a/app/routes/missions.calet/route.mdx +++ b/app/routes/missions.calet/route.mdx @@ -38,9 +38,9 @@ The CALorimetric Electron Telescope ([CALET](http://www.yoshida-agu.net/research
-| Type | Contents | Latency | -| ------------------ | ------------------------------------ | ------- | -| `CALET_GBM_FLT_LC` | Signifcance and CALET-GBM Lightcurve | Minutes | +| Type | Contents | Latency | +| ------------------ | ------------------------------------- | ------- | +| `CALET_GBM_FLT_LC` | Significance and CALET-GBM Lightcurve | Minutes |
diff --git a/app/routes/missions.chime/route.mdx b/app/routes/missions.chime/route.mdx index c9f71870d..6ea6dc0a0 100644 --- a/app/routes/missions.chime/route.mdx +++ b/app/routes/missions.chime/route.mdx @@ -26,7 +26,7 @@ export async function loader() { **Launch Date:** September 7, 2017 The [Canadian Hydrogen Intensity Mapping Experiment (CHIME)](https://chime-experiment.ca/en) is a transit radio telescope -located in Penticton, BC, Canada. It consists of 4 semicylindrical reflectors, each with 2000 +located in Penticton, BC, Canada. It consists of 4 semi-cylindrical reflectors, each with 2000 square meters of collecting area and 256 dual-polarization antennas. The telescope observes between 400 MHz and 800 MHz and covers an instantaneous field of view of ~200 square degrees. CHIME houses several electronic backends, which are tailored for specific diff --git a/app/routes/missions.maxi/route.mdx b/app/routes/missions.maxi/route.mdx index 25653f251..785e2395f 100644 --- a/app/routes/missions.maxi/route.mdx +++ b/app/routes/missions.maxi/route.mdx @@ -57,7 +57,7 @@ import logo from './logo.png' | --------------------------- | ------- | ---------------------------------------- | | Detection of a GRB | hours | [GRB 210320A](/circulars/29676) | | Observation of a GW trigger | hours | [LIGO/Virgo S191110af](/circulars/26223) | -| Obersation of a NuEM | days | [NuEm-210111A](/circulars/29298) | +| Observation of a NuEM | days | [NuEm-210111A](/circulars/29298) | diff --git a/app/routes/missions.snews/route.mdx b/app/routes/missions.snews/route.mdx index e68948d42..7a0d61cd5 100644 --- a/app/routes/missions.snews/route.mdx +++ b/app/routes/missions.snews/route.mdx @@ -23,18 +23,18 @@ import logo from './logo.jpg' [SNEWS](https://snews2.org/) is a consortium of MeV neutrino facilities which work together to distribute early warning alerts for core-collapse supernovae, reporting the neutrinos released during the collapse event before the first light of the supernova escapes. -| Facility | Type | -| -------------------------------------------------------------------- | ---------------------------------- | -| [Super-Kamikande](https://www-sk.icrr.u-tokyo.ac.jp/sk/index-e.html) | Water Cherenkov detectors | -| [IceCube](https://icecube.wisc.edu/) | Water Cherenkov detectors | -| [KM3Net](https://www.km3net.org/) | Water Cherenkov detectors | -| [KamLAND](http://kamland.stanford.edu/) | Pure liquid scintillators | -| [SNO+](https://snoplus.phy.queensu.ca/) | Pure liquid scintillators | -| [NOvA](https://novaexperiment.fnal.gov/) | Pure liquid scintillators | -| [HALO](https://www.snolab.ca/halo/detailedPhysics.html) | Lead-based detection | -| [XENONnt](https://science.purdue.edu/xenon1t/?tag=xenonnt) | Liquid noble dark matter detectors | -| [LZ](https://lz.lbl.gov/) | Liquid noble dark matter detectors | -| [PANDAX-4T](https://pandax.sjtu.edu.cn/) | Liquid noble dark matter detectors | +| Facility | Type | +| --------------------------------------------------------------------- | ---------------------------------- | +| [Super-Kamiokande](https://www-sk.icrr.u-tokyo.ac.jp/sk/index-e.html) | Water Cherenkov detectors | +| [IceCube](https://icecube.wisc.edu/) | Water Cherenkov detectors | +| [KM3Net](https://www.km3net.org/) | Water Cherenkov detectors | +| [KamLAND](http://kamland.stanford.edu/) | Pure liquid scintillators | +| [SNO+](https://snoplus.phy.queensu.ca/) | Pure liquid scintillators | +| [NOvA](https://novaexperiment.fnal.gov/) | Pure liquid scintillators | +| [HALO](https://www.snolab.ca/halo/detailedPhysics.html) | Lead-based detection | +| [XENONnt](https://science.purdue.edu/xenon1t/?tag=xenonnt) | Liquid noble dark matter detectors | +| [LZ](https://lz.lbl.gov/) | Liquid noble dark matter detectors | +| [PANDAX-4T](https://pandax.sjtu.edu.cn/) | Liquid noble dark matter detectors | **GCN Notice Types in GCN Classic and GCN Classic Over Kafka:** [Detailed Descriptions and Examples](https://gcn.gsfc.nasa.gov/snews.html) diff --git a/app/routes/news._index/route.mdx b/app/routes/news._index/route.mdx index a3567546f..c70182512 100644 --- a/app/routes/news._index/route.mdx +++ b/app/routes/news._index/route.mdx @@ -12,14 +12,14 @@ import { Grid, } from '@trussworks/react-uswds' -import { SendAnnouncmentButton } from '../news/components' -import gcnteam from './AAS243_booth.jpg' +import { SendAnnouncementButton } from '../news/components' +import teamPhoto from './AAS243_booth.jpg' import { Anchor } from '~/components/Anchor'

GCN News and Events

- +
@@ -48,7 +48,7 @@ import { Anchor } from '~/components/Anchor'
GCN Booth at AAS 243 diff --git a/app/routes/user.email._index/route.tsx b/app/routes/user.email._index/route.tsx index 7b738c529..06110394c 100644 --- a/app/routes/user.email._index/route.tsx +++ b/app/routes/user.email._index/route.tsx @@ -11,7 +11,7 @@ import { Link, useFetcher, useLoaderData } from '@remix-run/react' import { Button, ButtonGroup, Grid, Icon } from '@trussworks/react-uswds' import { - createAnnouncementSubsciption, + createAnnouncementSubscription, deleteAnnouncementSubscription, getAnnouncementSubscription, } from '../user.email/email_announcements.server' @@ -58,7 +58,7 @@ export async function action({ request }: ActionFunctionArgs) { } break case 'subscribe_announcements': - await createAnnouncementSubsciption(user.sub, user.email) + await createAnnouncementSubscription(user.sub, user.email) break case 'unsubscribe_announcements': await deleteAnnouncementSubscription(user.sub, user.email) @@ -213,7 +213,7 @@ export default function () { into your inbox.

- Note that your preferenes here do not affect prior subscriptions on the + Note that your preferences here do not affect prior subscriptions on the old web site,{' '} [] = [] - let requestorMessage = `You are receiving this email because the status of your peer endorsment requested from ${this.#currentUserEmail} has been updated to ${status}.` + let requestorMessage = `You are receiving this email because the status of your peer endorsement requested from ${this.#currentUserEmail} has been updated to ${status}.` if (status === 'approved') { promiseArray.push( From 8a6b55013983af4b36f662829cb003af60fe43f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 13:35:26 +0000 Subject: [PATCH 48/60] Bump @xmldom/xmldom from 0.9.6 to 0.9.7 Bumps [@xmldom/xmldom](https://github.com/xmldom/xmldom) from 0.9.6 to 0.9.7. - [Release notes](https://github.com/xmldom/xmldom/releases) - [Changelog](https://github.com/xmldom/xmldom/blob/master/CHANGELOG.md) - [Commits](https://github.com/xmldom/xmldom/compare/0.9.6...0.9.7) --- updated-dependencies: - dependency-name: "@xmldom/xmldom" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 9 +++++---- package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index d3fdd1e18..823a2c282 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "@remix-run/node": "~2.15.3", "@remix-run/react": "~2.15.3", "@trussworks/react-uswds": "github:lpsinger/react-uswds#gcn", - "@xmldom/xmldom": "^0.9.6", + "@xmldom/xmldom": "^0.9.7", "aws-lambda-ses-forwarder": "^6.0.0", "classnames": "^2.5.1", "color-convert": "^2.0.1", @@ -9907,9 +9907,10 @@ "integrity": "sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==" }, "node_modules/@xmldom/xmldom": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.6.tgz", - "integrity": "sha512-Su4xcxR0CPGwlDHNmVP09fqET9YxbyDXHaSob6JlBH7L6reTYaeim6zbk9o08UarO0L5GTRo3uzl0D+9lSxmvw==", + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.7.tgz", + "integrity": "sha512-syvR8iIJjpTZ/stv7l89UAViwGFh6lbheeOaqSxkYx9YNmIVvPTRH+CT/fpykFtUx5N+8eSMDRvggF9J8GEPzQ==", + "license": "MIT", "engines": { "node": ">=14.6" } diff --git a/package.json b/package.json index f6238e677..edad9cc2b 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "@remix-run/node": "~2.15.3", "@remix-run/react": "~2.15.3", "@trussworks/react-uswds": "github:lpsinger/react-uswds#gcn", - "@xmldom/xmldom": "^0.9.6", + "@xmldom/xmldom": "^0.9.7", "aws-lambda-ses-forwarder": "^6.0.0", "classnames": "^2.5.1", "color-convert": "^2.0.1", From eae948a18a33b7f58f6eef800753b35eec3833ad Mon Sep 17 00:00:00 2001 From: Timothe Roland Date: Fri, 7 Feb 2025 10:51:41 +0100 Subject: [PATCH 49/60] Add SVOM mission page Closes #2860: this is the same set of changes, but passed through `prettier`, squashed, and rebased. Co-authored-by: Vidushi Sharma Co-authored-by: Leo Singer --- app/routes/missions.svom/logo_svom_black.svg | 59 ++++ app/routes/missions.svom/route.mdx | 354 +++++++++++++++++++ app/routes/missions.tsx | 5 + 3 files changed, 418 insertions(+) create mode 100644 app/routes/missions.svom/logo_svom_black.svg create mode 100644 app/routes/missions.svom/route.mdx diff --git a/app/routes/missions.svom/logo_svom_black.svg b/app/routes/missions.svom/logo_svom_black.svg new file mode 100644 index 000000000..bb66416b2 --- /dev/null +++ b/app/routes/missions.svom/logo_svom_black.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + diff --git a/app/routes/missions.svom/route.mdx b/app/routes/missions.svom/route.mdx new file mode 100644 index 000000000..924ce1a82 --- /dev/null +++ b/app/routes/missions.svom/route.mdx @@ -0,0 +1,354 @@ +--- +handle: + breadcrumb: SVOM +--- + +import logo from './logo_svom_black.svg' + +# Space-based multi-band astronomical Variable Objects Monitor (SVOM) + +SVOM logo + +**Launch Date:** June 22, 2024 + +**Anticipated Start of Science Operations:** February 2025 + +**End of Operations:** Mission duration of 3 years + +**Notices Archive:** [SVOM French Science Center](https://fsc.svom.org/alerts) + +The [Space-based multi-band astronomical Variable Objects Monitor (SVOM)](https://www.svom.eu/en/the-svom-mission/) is a French-Chinese mission, result of a collaboration between the two national space agencies, [China National Space Administration (CNSA)](https://www.cnsa.gov.cn/english/index.html) and [Centre national d'études spatiales (CNES)](https://cnes.fr/en/projects/svom). SVOM is dedicated to the study of the most powerful transient phenomena, with a particular emphasis on gamma-ray bursts (GRBs). + +The SVOM spacecraft carries four multi-wavelength instruments: ECLAIRs, Gamma Ray burst Monitor (GRM), Microchannel X-ray Telescope (MXT) and Visual Telescope (VT). ECLAIRs and GRM can detect gamma-ray transient sources in real-time with localisation capabilities for ECLAIRs. SVOM can transfer the alerts in near real-time with a typical latency of less than 30s and perform autonomous slew to allow x-ray and optical follow-up of the source with the smaller field of view instruments: MXT and VT. + +

+ +#### GCN Kafka topics + +SVOM distributes alerts and localizations of gamma-ray burst and other transients. For now, these notices are published only in VOEvent format through the GCN Kafka topics prefixed `gcn.notices.svom.voevent`. + +Each of the four instruments has its own dedicated topic to stream notices with their related information. See table below: + +
+ +| Kafka topic | Notice types | +| ---------------------------------- | ----------------------------------------------------------------------- | +| `gcn.notices.svom.voevent.grm` | `grm-trigger` | +| `gcn.notices.svom.voevent.eclairs` | `eclairs-wakeup`
`eclairs-catalog`
`slewing` / `not-slewing` | +| `gcn.notices.svom.voevent.mxt` | `mxt-initial`
`mxt-update` | +| `gcn.notices.svom.voevent.vt` | Available soon | + +
+ +#### VOEvent XML-serialized GCN notice types + +
+ +| Notice Type | Content | Latency | +| ------------------------------------------ | -------------------------------------------------------------------- | ------------- | +| `grm-trigger` | GRM trigger notice with possible rough localization | ~15 sec | +| `eclairs-wakeup` | ECLAIRs localisation of a GRB candidate | ~15 sec | +| `eclairs-catalog` | ECLAIRs localisation of a flaring source from the on-board catalogue | ~15 sec | +| `slewing` /
`not-slewing` 1 | Platform slew status and target coordinates | ~1-8 min | +|
`mxt-initial_qf#`2
| MXT localisation of a found counterpart (only if platform slews) | ~3 min | +|
`mxt-update_qf#`2
| MXT updated localisation (qf > mxt-initial_qf) | ~3 min | + +
+ +1 `not-slewing`are published either if the detection did not reach +the slew threshold (in a maximum time window of 8 min) or if the slew was not +possible. The reason is specified in the notice parameters. + +2 the value of the quality factor `qf` indicates the accuracy +of the localisation: + - `qf1`→ 120'' < R90 < 300''
+ - `qf2`→ 60'' < R90 < 120''
+ - `qf3`→ 30'' < R90 < 60''
+ - `qf4`→ R90 < 30''
+ +#### VOEvent examples + +The complete list of published notices can be found [here](https://fsc.svom.org/alerts). Here are 3 different examples of SVOM VOEvent notices: + +
+ `eclairs-wakeup` + ```xml + + + + ivo://org.svom/FSC + + SVOM French Science Center + FSC + Timothe Roland + svom-contact@cea.fr + + 2022-04-04T11:54:42 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RA + Dec + + 50.4488 + 10.0041 + + 0.2 + + + + + + + + process.variation.burst;em.gamma + + + + N1e notice, data from ECLAIRs instrument + + + + ``` +
+
+ +
+ `grm-trigger` + ```xml + + + + ivo://org.svom/FSC + 2025-02-07T07:14:22 + + SVOM French Science Center + FSC + Timothe Roland + svom-contact@cea.fr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + process.variation.burst;em.gamma + + + + N1g notice, data from GRM + + + +``` + +
+
+ +
+ `mxt-initial_qf1` + ```xml + + + + ivo://org.svom/FSC + 2025-02-05T21:41:59 + + SVOM French Science Center + FSC + Timothe Roland + svom-contact@cea.fr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RA + Dec + + 113.4980 + 32.3892 + + 0.0356 + + + + + + + + process.variation.burst;em.gamma + + + + N2m notice, data from MXT + + + + ivo://org.svom/fsc#sb25020504_eclairs-refined + ivo://org.svom/fsc#sb25020504_slewing + + + ``` +
+ +#### Yearly Trigger Rates + +
+ +| Instrument | Type | Yearly Rates | +| ---------- | ---- | ------------ | +| ECLAIRs | GRBs | 60 GRBs/yr | +| GRM | GRBs | 130 GRBs/yr | + +
diff --git a/app/routes/missions.tsx b/app/routes/missions.tsx index c875dcc42..d54477c79 100644 --- a/app/routes/missions.tsx +++ b/app/routes/missions.tsx @@ -82,6 +82,11 @@ export default function () { Super-Kamiokande , + useFeature('SVOM') && ( + + SVOM + + ), ]} />
From 5ad40735f15568306961d52577a77dff799dc972 Mon Sep 17 00:00:00 2001 From: Leo Singer Date: Tue, 18 Feb 2025 17:07:59 -0500 Subject: [PATCH 50/60] Fix spelling (American English, not British English) --- app/routes/missions.svom/route.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/routes/missions.svom/route.mdx b/app/routes/missions.svom/route.mdx index 924ce1a82..ac8036558 100644 --- a/app/routes/missions.svom/route.mdx +++ b/app/routes/missions.svom/route.mdx @@ -26,7 +26,7 @@ import logo from './logo_svom_black.svg' The [Space-based multi-band astronomical Variable Objects Monitor (SVOM)](https://www.svom.eu/en/the-svom-mission/) is a French-Chinese mission, result of a collaboration between the two national space agencies, [China National Space Administration (CNSA)](https://www.cnsa.gov.cn/english/index.html) and [Centre national d'études spatiales (CNES)](https://cnes.fr/en/projects/svom). SVOM is dedicated to the study of the most powerful transient phenomena, with a particular emphasis on gamma-ray bursts (GRBs). -The SVOM spacecraft carries four multi-wavelength instruments: ECLAIRs, Gamma Ray burst Monitor (GRM), Microchannel X-ray Telescope (MXT) and Visual Telescope (VT). ECLAIRs and GRM can detect gamma-ray transient sources in real-time with localisation capabilities for ECLAIRs. SVOM can transfer the alerts in near real-time with a typical latency of less than 30s and perform autonomous slew to allow x-ray and optical follow-up of the source with the smaller field of view instruments: MXT and VT. +The SVOM spacecraft carries four multi-wavelength instruments: ECLAIRs, Gamma Ray burst Monitor (GRM), Microchannel X-ray Telescope (MXT) and Visual Telescope (VT). ECLAIRs and GRM can detect gamma-ray transient sources in real-time with localization capabilities for ECLAIRs. SVOM can transfer the alerts in near real-time with a typical latency of less than 30s and perform autonomous slew to allow x-ray and optical follow-up of the source with the smaller field of view instruments: MXT and VT.
@@ -63,11 +63,11 @@ Each of the four instruments has its own dedicated topic to stream notices with | Notice Type | Content | Latency | | ------------------------------------------ | -------------------------------------------------------------------- | ------------- | | `grm-trigger` | GRM trigger notice with possible rough localization | ~15 sec | -| `eclairs-wakeup` | ECLAIRs localisation of a GRB candidate | ~15 sec | -| `eclairs-catalog` | ECLAIRs localisation of a flaring source from the on-board catalogue | ~15 sec | +| `eclairs-wakeup` | ECLAIRs localization of a GRB candidate | ~15 sec | +| `eclairs-catalog` | ECLAIRs localization of a flaring source from the on-board catalogue | ~15 sec | | `slewing` /
`not-slewing` 1 | Platform slew status and target coordinates | ~1-8 min | -|
`mxt-initial_qf#`2
| MXT localisation of a found counterpart (only if platform slews) | ~3 min | -|
`mxt-update_qf#`2
| MXT updated localisation (qf > mxt-initial_qf) | ~3 min | +|
`mxt-initial_qf#`2
| MXT localization of a found counterpart (only if platform slews) | ~3 min | +|
`mxt-update_qf#`2
| MXT updated localization (qf > mxt-initial_qf) | ~3 min |
@@ -76,7 +76,7 @@ the slew threshold (in a maximum time window of 8 min) or if the slew was not possible. The reason is specified in the notice parameters. 2 the value of the quality factor `qf` indicates the accuracy -of the localisation: +of the localization: - `qf1`→ 120'' < R90 < 300''
- `qf2`→ 60'' < R90 < 120''
- `qf3`→ 30'' < R90 < 60''
From 306f780c2869dcb02fd84e3f4a716bd36676423b Mon Sep 17 00:00:00 2001 From: dakota002 Date: Wed, 19 Feb 2025 14:04:12 -0500 Subject: [PATCH 51/60] Adds svom voevent topics --- .../NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx | 10 +++++++++- app/lib/utils.ts | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx b/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx index 1c66fd2ea..ae7d8dc23 100644 --- a/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx +++ b/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx @@ -44,7 +44,7 @@ function humanizedRate(rate: number, singular: string, plural?: string) { return `${isUpperBound ? '< ' : ''}${humanizedCount(Math.round(rate), singular, plural)} per ${unit}` } -const NoticeTypes = { +const NoticeTypes: { [key: string]: string[] } = { AGILE: [ 'AGILE_GRB_GROUND', 'AGILE_GRB_POS_TEST', @@ -229,6 +229,14 @@ export function NoticeTypeCheckboxes({ if (useFeature('SVOM_QUICKSTART')) { JsonNoticeTypes.SVOM = ['gcn.notices.svom'] JsonNoticeTypeLinks.SVOM = '/missions/svom' + + if (selectedFormat == 'voevent') { + NoticeTypes['SVOM'] = [ + 'gcn.notices.svom.voevent.grm', + 'gcn.notices.svom.voevent.eclairs', + 'gcn.notices.svom.voevent.mxt', + ] + } } if (useFeature('FERMI_GBM_QUICKSTART')) { diff --git a/app/lib/utils.ts b/app/lib/utils.ts index 9f8d1a743..e265d7f43 100644 --- a/app/lib/utils.ts +++ b/app/lib/utils.ts @@ -11,7 +11,7 @@ export function formatAndNoticeTypeToTopic( noticeFormat: string, noticeType: string ) { - return noticeFormat == 'json' + return noticeFormat == 'json' || noticeType.startsWith('gcn.notices') ? noticeType : `gcn.classic.${noticeFormat}.${noticeType}` } From 2345feba7a347f5b18c646e7a6a48c96db08476c Mon Sep 17 00:00:00 2001 From: dakota002 Date: Wed, 19 Feb 2025 15:37:33 -0500 Subject: [PATCH 52/60] Different feature flag --- app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx b/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx index ae7d8dc23..0355280ee 100644 --- a/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx +++ b/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx @@ -229,7 +229,8 @@ export function NoticeTypeCheckboxes({ if (useFeature('SVOM_QUICKSTART')) { JsonNoticeTypes.SVOM = ['gcn.notices.svom'] JsonNoticeTypeLinks.SVOM = '/missions/svom' - + } + if (useFeature('SVOM')) { if (selectedFormat == 'voevent') { NoticeTypes['SVOM'] = [ 'gcn.notices.svom.voevent.grm', From 490046aadb8b39224a853b538aa31af2cd9f9185 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Thu, 20 Feb 2025 11:30:23 -0500 Subject: [PATCH 53/60] moved VTP retirement standalone --- app/root.tsx | 4 ++-- app/routes/news._index/route.mdx | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/root.tsx b/app/root.tsx index ca31d8db8..1c90ae225 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -247,10 +247,10 @@ export function Layout({ children }: { children?: ReactNode }) {
- GCN at AAS 245, Legacy Circulars Address Retirement. See{' '} + Planned Retirement of VOEvent Brokers. See{' '} news and announcements diff --git a/app/routes/news._index/route.mdx b/app/routes/news._index/route.mdx index c70182512..673877a9e 100644 --- a/app/routes/news._index/route.mdx +++ b/app/routes/news._index/route.mdx @@ -27,6 +27,23 @@ import { Anchor } from '~/components/Anchor' ## 2025 + + } + > + + Retirement of VOEvent Brokers + + + #### Planned Retirement of GCN Classic VOEvent Brokers + The result of the November 2024 user survey of those utilizing the GCN VOEvent Brokers to receive VOEvent-format Notices with the VOEvent Transport Protocol is overwhelmingly in favor of retiring the brokers and users migrating to receive VOEvent Notices over Kafka. This service is already available for all GCN Classic Notice types with self-subscription via the [Start Streaming Notices Guide](/quickstart). The [GCN Classic VOEvent brokers](https://gcn.gsfc.nasa.gov/voevent.html) will be retired shortly after the conclusion of the O4 gravitational wave network observing run, [currently scheduled for October 7, 2025](https://observing.docs.ligo.org/plan/). We recommend the following actions for users currently utilizing VOEvent via GCN Classic. + - Sign up to receive VOEvent format Notices via [Kafka or email](/docs/notices/consuming) + - [Let the GCN Team know](/contact) when you're ready to unsubscribe from receiving them via the GCN Classic brokers. All GCN Classic VOEvent subscribers will be unsubscribed after the end of O4 and the brokers will be taken offline. + + + Date: Thu, 20 Feb 2025 13:46:28 -0500 Subject: [PATCH 54/60] Parse JSON Section in Sample Code (#2873) Fixes #2149. --- app/routes/docs.client.samples.md | 114 +++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/app/routes/docs.client.samples.md b/app/routes/docs.client.samples.md index be1d71739..4fc5a5415 100644 --- a/app/routes/docs.client.samples.md +++ b/app/routes/docs.client.samples.md @@ -13,9 +13,10 @@ and some samples from the FAQs section of the [gcn-kafka-python](https://github. To contribute your own ideas, make a GitHub pull request to add it to [the Markdown source for this document](https://github.com/nasa-gcn/gcn.nasa.gov/blob/CodeSamples/app/routes/docs.client.samples.md), or [contact us](/contact). - [Working with Kafka messages](#parsing) + - [HEALPix Sky Maps](#healpix-sky-maps) -## Parsing +## Parsing XML Within your consumer loop, use the following functions to convert the content of `message.value()` into other data types. @@ -166,6 +167,117 @@ for message in consumer.consume(end[0].offset - start[0].offset, timeout=1): print(message.value()) ``` +## Parsing JSON + +GCN Notices are distributed through Kafka topics and, for new missions, are typically provided in JSON format. This guide explains how to programmatically read the JSON schema. + +Start by subscribing to a Kafka topic and parsing the JSON data. + +```python +from gcn_kafka import Consumer +import json + +# Kafka consumer configuration +consumer = Consumer( + client_id='fill me in', + client_secret='fill me in', + config={"message.max.bytes": 204194304}, +) + +# Subscribe to Kafka topic +consumer.subscribe(['igwn.gwalert']) + +# Continuously consume and parse JSON data +for message in consumer.consume(timeout=1): + if message.error(): + print(message.error()) + continue + + # Print the topic and message ID + print(f"topic={message.topic()}, offset={message.offset()}") + + # Decode message value + value = message.value() + value_str = value.decode("utf-8") + alert_json = json.loads(value_str) +``` + +## Decoding Embedded Data + +Some GCN notices include HEALPix sky maps encoded in [base64](https://datatracker.ietf.org/doc/html/rfc4648.html), a way of encoding binary data into text. +The following code demonstrates how to extract, decode, and save the HEALPix data as a `.fits` file from a received notice. Python's built-in [`base64`](https://docs.python.org/3/library/base64.html#base64.b64encode) module provides the `b64decode` method to simplify the decoding process. + +```python +import base64 +from astropy.io import fits + +# Extract the base64-encoded skymap +skymap_string = alert_json["event"]["skymap"] + +# Decode the Base64 string to bytes +decoded_bytes = base64.b64decode(skymap_string) + +# Write bytes to a FITS file +with open("skymap.fits", "wb") as fits_file: + fits_file.write(decoded_bytes) + +# Open and inspect the FITS file +with fits.open("skymap.fits") as hdul: + hdul.info() +``` + +## JSON Schema Example for Embedding a FITS File + +If you want to include a FITS file in a Notice, add a property to your schema definition in the following format: + +```json +"healpix_file": { + "type": "string", + "contentEncoding": "base64", + "contentMediaType": "image/fits", + "description": "Base 64 encoded content of a FITS file" +} +``` + +JSON Schema supports embedding non-Unicode media within strings using the `contentMediaType` and `contentEncoding`, which enable the distribution of diverse data types. For further details, refer to [non-JSON data](https://json-schema.org/understanding-json-schema/reference/non_json_data.html). + +## Encoding Embedded Data + +For producer data production pipelines, the following encoding steps convert an input file to a byte string. This guide demonstrates how to encode a file (e.g., skymap.fits) into a `base64` encoded string and submit it to the GCN Kafka broker. + +```python +from gcn_kafka import Producer +import base64 +import json + +# Kafka Producer Configuration +producer = Producer(client_id='fill me in', + client_secret='fill me in', + config={"message.max.bytes": 204194304}, + +# Set Kafka Topic and Producer Configuration +TOPIC = "igwn.gwalert" + +data = { + "event": {} +} + +# Read and encode the FITS file +with open("skymap.fits", "rb") as file: + data["event"]["skymap"] = base64.b64encode(file.read()) + +# Convert dictionary to JSON +json_data = json.dumps(data).encode("utf-8") + +# Publish the message +producer.produce( + TOPIC, + json_data, +) + +producer.flush() +``` + ## HEALPix Sky Maps [HEALPix](https://healpix.sourceforge.io) (Hierarchical, Equal Area, and iso-Latitude Pixelisation) is a scheme for indexing positions on the unit sphere. From 69f3661a1f74c693bb1a73622236665ee9af1444 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Thu, 20 Feb 2025 13:52:02 -0500 Subject: [PATCH 55/60] fix merge conflicts --- app/routes/news._index/route.mdx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/app/routes/news._index/route.mdx b/app/routes/news._index/route.mdx index 673877a9e..74eb280b8 100644 --- a/app/routes/news._index/route.mdx +++ b/app/routes/news._index/route.mdx @@ -34,10 +34,24 @@ import { Anchor } from '~/components/Anchor' } > - Retirement of VOEvent Brokers + New SVOM Notices, Retirement of VOEvent Brokers - #### Planned Retirement of GCN Classic VOEvent Brokers + + #### SVOM VOEvent Notices Available Over Kafka + The SVOM Team and the GCN team are pleased to announce the availability of SVOM notice types via the [new GCN](https://gcn.nasa.gov) in VOEvent format. These notices can be streamed via [Kafka](https://gcn.nasa.gov/quickstart). They are not available via GCN Classic. The SVOM Team plans to add JSON format notices at a later date. + + SVOM Mission Summary: The [Space-based multi-band astronomical Variable Objects Monitor (SVOM)](https://www.svom.eu/en/the-svom-mission/) is a French-Chinese mission, result of a collaboration between the two national space agencies, [China National Space Administration (CNSA)](https://www.cnsa.gov.cn/english/index.html) and [Centre national d'études spatiales (CNES)](https://cnes.fr/en/projects/svom). SVOM mission is dedicated to the study of the most powerful transient phenomena, with a particular emphasis on gamma-ray bursts (GRBs). The SVOM spacecraft carries four multi-wavelength instruments: ECLAIRs, Gamma Ray burst Monitor (GRM), Microchannel X-ray Telescope (MXT) and Visual Telescope (VT). + + Notice topics: new SVOM notices provide GRB detection and follow-up observation details. Each of the four instruments has its own dedicated topic to stream notices with their related information, see table below: + - `gcn.notices.svom.voevent.grm` + - `gcn.notices.svom.voevent.eclairs` + - `gcn.notices.svom.voevent.mxt` + - `gcn.notices.svom.voevent.vt` + + A more extensive description of the information provided in these new notices is available at https://gcn.nasa.gov/missions/svom. + + #### Planned Retirement of GCN Classic VOEvent Brokers The result of the November 2024 user survey of those utilizing the GCN VOEvent Brokers to receive VOEvent-format Notices with the VOEvent Transport Protocol is overwhelmingly in favor of retiring the brokers and users migrating to receive VOEvent Notices over Kafka. This service is already available for all GCN Classic Notice types with self-subscription via the [Start Streaming Notices Guide](/quickstart). The [GCN Classic VOEvent brokers](https://gcn.gsfc.nasa.gov/voevent.html) will be retired shortly after the conclusion of the O4 gravitational wave network observing run, [currently scheduled for October 7, 2025](https://observing.docs.ligo.org/plan/). We recommend the following actions for users currently utilizing VOEvent via GCN Classic. - Sign up to receive VOEvent format Notices via [Kafka or email](/docs/notices/consuming) - [Let the GCN Team know](/contact) when you're ready to unsubscribe from receiving them via the GCN Classic brokers. All GCN Classic VOEvent subscribers will be unsubscribed after the end of O4 and the brokers will be taken offline. From d7160ea87f68ec0ae8505056afe26206f58442ba Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Thu, 20 Feb 2025 15:04:53 -0500 Subject: [PATCH 56/60] fixed new banner --- app/root.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/root.tsx b/app/root.tsx index 1c90ae225..72c0dc95a 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -247,10 +247,10 @@ export function Layout({ children }: { children?: ReactNode }) {
- Planned Retirement of VOEvent Brokers. See{' '} + New SVOM Notices, Planned Retirement of VOEvent Brokers. See{' '} news and announcements From fdcee595cdf64d00d77755d80be35f4cefa3a6f8 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Thu, 20 Feb 2025 13:25:02 -0500 Subject: [PATCH 57/60] add SVOM source name subject matcher --- __tests__/circulars.ts | 51 +++++++++++++++++++++++++++ app/routes/circulars/circulars.lib.ts | 1 + 2 files changed, 52 insertions(+) diff --git a/__tests__/circulars.ts b/__tests__/circulars.ts index 85a5e6726..818dac0d4 100644 --- a/__tests__/circulars.ts +++ b/__tests__/circulars.ts @@ -73,6 +73,7 @@ describe('parseEventFromSubject', () => { const ztfEvent = 'ZTF23aabmzlp' const epEvent = 'EP241119a' const frbEvent = 'FRB 20250206A' + const svomEvent = 'sb25021804' test('handles nonsense subject cases', () => { expect(parseEventFromSubject('zawxdrcftvgbhnjm')).toBe(undefined) @@ -623,6 +624,56 @@ describe('parseEventFromSubject', () => { expect(parseEventFromSubject(frbSubjectWithHyphen)).toBe(frbEvent) }) }) + + describe('SVOM', () => { + test('handles SVOM event names', () => { + const svomSubject = + 'SVOM/sb25021804: SVOM detection of a long X-ray transient' + expect(parseEventFromSubject(svomSubject)).toBe(svomEvent) + }) + + test('handles SVOM event names in misc positions', () => { + const svomSubjectWithNoSpace = + 'SVOM detection: SVOM/sb25021804 a long X-ray transient' + expect(parseEventFromSubject(svomSubjectWithNoSpace)).toBe(svomEvent) + }) + + test('handles SVOM event names with space', () => { + const svomSubjectWithSpace = + 'SVOM/sb 25021804: SVOM detection of a long X-ray transient' + expect(parseEventFromSubject(svomSubjectWithSpace)).toBe(svomEvent) + }) + + test('handles SVOM event names with spaces in misc positions', () => { + const svomSubjectWithSpace = + 'SVOM detection: SVOM/sb25021804 a long X-ray transient' + expect(parseEventFromSubject(svomSubjectWithSpace)).toBe(svomEvent) + }) + + test('handles SVOM event name with an underscore', () => { + const svomSubjectWithUnderscore = + 'SVOM/sb_25021804: SVOM detection of a long X-ray transient' + expect(parseEventFromSubject(svomSubjectWithUnderscore)).toBe(svomEvent) + }) + + test('handles SVOM event names with an underscore in misc positions', () => { + const svomSubjectWithUnderscore = + 'SVOM detection: SVOM/sb25021804 a long X-ray transient' + expect(parseEventFromSubject(svomSubjectWithUnderscore)).toBe(svomEvent) + }) + + test('handles SVOM event name with a hyphen', () => { + const svomSubjectWithHyphen = + 'SVOM/sb-25021804: SVOM detection of a long X-ray transient' + expect(parseEventFromSubject(svomSubjectWithHyphen)).toBe(svomEvent) + }) + + test('handles SVOM event name with a hyphen in misc positions', () => { + const svomSubjectWithHyphen = + 'SVOM detection: SVOM/sb-25021804 a long X-ray transient' + expect(parseEventFromSubject(svomSubjectWithHyphen)).toBe(svomEvent) + }) + }) }) describe('emailIsAutoReply', () => { diff --git a/app/routes/circulars/circulars.lib.ts b/app/routes/circulars/circulars.lib.ts index e435e8f59..9071a796d 100644 --- a/app/routes/circulars/circulars.lib.ts +++ b/app/routes/circulars/circulars.lib.ts @@ -72,6 +72,7 @@ const subjectMatchers: SubjectMatcher[] = [ ], [/EP[.\s_-]*(\d{6}[a-z])/i, ([, id]) => `EP${id}`], [/FRB[.\s_-]*(\d{8}[a-z])/i, ([, id]) => `FRB ${id}`.toUpperCase()], + [/sb[.\s_-]*(\d{8})/i, ([, id]) => `sb${id}`], ] /** Format a Circular as plain text. */ From d555fcd8fa3fe5001dc9c2e0aff4d949308d6a12 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Thu, 20 Feb 2025 17:19:17 -0500 Subject: [PATCH 58/60] remove SVOM feature flag (#2907) Resolves #2616. Co-authored-by: dakota002 --- .../NoticeTypeCheckboxes.tsx | 21 +++++++++++-------- app/routes/missions.tsx | 8 +++---- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx b/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx index 0355280ee..9e74c9ce1 100644 --- a/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx +++ b/app/components/NoticeTypeCheckboxes/NoticeTypeCheckboxes.tsx @@ -230,14 +230,17 @@ export function NoticeTypeCheckboxes({ JsonNoticeTypes.SVOM = ['gcn.notices.svom'] JsonNoticeTypeLinks.SVOM = '/missions/svom' } - if (useFeature('SVOM')) { - if (selectedFormat == 'voevent') { - NoticeTypes['SVOM'] = [ - 'gcn.notices.svom.voevent.grm', - 'gcn.notices.svom.voevent.eclairs', - 'gcn.notices.svom.voevent.mxt', - ] - } + + const displayNoticeTypes: { [key: string]: string[] } = { + ...NoticeTypes, + } + + if (selectedFormat == 'voevent') { + displayNoticeTypes['SVOM'] = [ + 'gcn.notices.svom.voevent.grm', + 'gcn.notices.svom.voevent.eclairs', + 'gcn.notices.svom.voevent.mxt', + ] } if (useFeature('FERMI_GBM_QUICKSTART')) { @@ -294,7 +297,7 @@ export function NoticeTypeCheckboxes({ ({ id: mission, label: mission, diff --git a/app/routes/missions.tsx b/app/routes/missions.tsx index d54477c79..b85dcb5b1 100644 --- a/app/routes/missions.tsx +++ b/app/routes/missions.tsx @@ -82,11 +82,9 @@ export default function () { Super-Kamiokande , - useFeature('SVOM') && ( - - SVOM - - ), + + SVOM + , ]} /> From 11fe67718f7e631584297b15d3ab669c94cbab88 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Fri, 21 Feb 2025 11:52:43 -0500 Subject: [PATCH 59/60] fix SVOM VT name typo --- app/routes/missions.svom/route.mdx | 2 +- app/routes/news._index/route.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/routes/missions.svom/route.mdx b/app/routes/missions.svom/route.mdx index ac8036558..fc62ba8ab 100644 --- a/app/routes/missions.svom/route.mdx +++ b/app/routes/missions.svom/route.mdx @@ -26,7 +26,7 @@ import logo from './logo_svom_black.svg' The [Space-based multi-band astronomical Variable Objects Monitor (SVOM)](https://www.svom.eu/en/the-svom-mission/) is a French-Chinese mission, result of a collaboration between the two national space agencies, [China National Space Administration (CNSA)](https://www.cnsa.gov.cn/english/index.html) and [Centre national d'études spatiales (CNES)](https://cnes.fr/en/projects/svom). SVOM is dedicated to the study of the most powerful transient phenomena, with a particular emphasis on gamma-ray bursts (GRBs). -The SVOM spacecraft carries four multi-wavelength instruments: ECLAIRs, Gamma Ray burst Monitor (GRM), Microchannel X-ray Telescope (MXT) and Visual Telescope (VT). ECLAIRs and GRM can detect gamma-ray transient sources in real-time with localization capabilities for ECLAIRs. SVOM can transfer the alerts in near real-time with a typical latency of less than 30s and perform autonomous slew to allow x-ray and optical follow-up of the source with the smaller field of view instruments: MXT and VT. +The SVOM spacecraft carries four multi-wavelength instruments: ECLAIRs, Gamma Ray burst Monitor (GRM), Microchannel X-ray Telescope (MXT) and Visible Telescope (VT). ECLAIRs and GRM can detect gamma-ray transient sources in real-time with localization capabilities for ECLAIRs. SVOM can transfer the alerts in near real-time with a typical latency of less than 30s and perform autonomous slew to allow x-ray and optical follow-up of the source with the smaller field of view instruments: MXT and VT.
diff --git a/app/routes/news._index/route.mdx b/app/routes/news._index/route.mdx index 74eb280b8..baea77a26 100644 --- a/app/routes/news._index/route.mdx +++ b/app/routes/news._index/route.mdx @@ -41,7 +41,7 @@ import { Anchor } from '~/components/Anchor' #### SVOM VOEvent Notices Available Over Kafka The SVOM Team and the GCN team are pleased to announce the availability of SVOM notice types via the [new GCN](https://gcn.nasa.gov) in VOEvent format. These notices can be streamed via [Kafka](https://gcn.nasa.gov/quickstart). They are not available via GCN Classic. The SVOM Team plans to add JSON format notices at a later date. - SVOM Mission Summary: The [Space-based multi-band astronomical Variable Objects Monitor (SVOM)](https://www.svom.eu/en/the-svom-mission/) is a French-Chinese mission, result of a collaboration between the two national space agencies, [China National Space Administration (CNSA)](https://www.cnsa.gov.cn/english/index.html) and [Centre national d'études spatiales (CNES)](https://cnes.fr/en/projects/svom). SVOM mission is dedicated to the study of the most powerful transient phenomena, with a particular emphasis on gamma-ray bursts (GRBs). The SVOM spacecraft carries four multi-wavelength instruments: ECLAIRs, Gamma Ray burst Monitor (GRM), Microchannel X-ray Telescope (MXT) and Visual Telescope (VT). + SVOM Mission Summary: The [Space-based multi-band astronomical Variable Objects Monitor (SVOM)](https://www.svom.eu/en/the-svom-mission/) is a French-Chinese mission, result of a collaboration between the two national space agencies, [China National Space Administration (CNSA)](https://www.cnsa.gov.cn/english/index.html) and [Centre national d'études spatiales (CNES)](https://cnes.fr/en/projects/svom). SVOM mission is dedicated to the study of the most powerful transient phenomena, with a particular emphasis on gamma-ray bursts (GRBs). The SVOM spacecraft carries four multi-wavelength instruments: ECLAIRs, Gamma Ray burst Monitor (GRM), Microchannel X-ray Telescope (MXT) and Visible Telescope (VT). Notice topics: new SVOM notices provide GRB detection and follow-up observation details. Each of the four instruments has its own dedicated topic to stream notices with their related information, see table below: - `gcn.notices.svom.voevent.grm` From b783622ee613a14f4147efe78f89e3966362eb54 Mon Sep 17 00:00:00 2001 From: Judy Racusin Date: Fri, 10 Jan 2025 16:40:44 -0500 Subject: [PATCH 60/60] draft announcement for eventID backfill --- app/routes/news._index/route.mdx | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/app/routes/news._index/route.mdx b/app/routes/news._index/route.mdx index baea77a26..98ebfc300 100644 --- a/app/routes/news._index/route.mdx +++ b/app/routes/news._index/route.mdx @@ -27,6 +27,31 @@ import { Anchor } from '~/components/Anchor' ## 2025 + + } + > + + Circulars over Kafka EventID Backfill, New Code Samples + + + + #### Circulars over Kafka EventID Backfill + In preparation for new search and sort features in the GCN Circulars archive, we will be backfilling the automatically assigned eventID (e.g. GRB YYMMDDA) derived from each GCN Circular subject. EventIDs have been included in all JSON versions of Circulars starting with GCN Circ 37912. The backfill of all prior Circulars will result in the following behavior that may impact some users: + - a revision of each Circular will lead to a new version in the archive, with the only change as adding the JSON eventID + - ~38k Circular revision will be distributed over Kafka + - revised Circulars will not be redistributed over email + The eventID backfill will be done in batches beginning on DATE. + + #### New Parsing and HEALPix Code Samples + The GCN team has created new [Python code samples](/docs/samples) to aid users in setting up their scripts to consume GCN Notices (both GCN Classic legacy formats and new JSON format), and utilize HEALPix localization probability maps. We welcome [contributions](/docs/contributing) of additional code samples that would be useful for other GCN users. + + + +
4.5.12 The project manager shall verify through test the software requirements that trace to a hazardous event, cause, or mitigation technique.As a criterion in reivew of pull requestsAs a criterion in review of pull requests
Software Operations, Maintenance, and Retirement
This is where we start deeply questioning the scope of the ticket. If a ticket is 13 points, it is possible that it is not broken down into - small enough steps and would benefit from further refiment. + small enough steps and would benefit from further refinement.