Releases: lsst-sqre/squareone
squareone@0.31.0
Minor Changes
-
#354
2d91039Thanks @jonathansick! - Migrated four pages from Pages Router to App Router:- Home page (
/) - Docs page (
/docs) - Support page (
/support) - API Aspect page (
/api-aspect)
Created the App Router foundation:
- Root layout (
src/app/layout.tsx) with PageShell integration - Providers wrapper (
src/app/providers.tsx) for theme and config contexts - Force dynamic rendering to support runtime configuration loading
- Home page (
-
#383
0d1bfc3Thanks @jonathansick! - Integrate BroadcastBannerStack with Semaphore API via semaphore-clientThe BroadcastBannerStack component now fetches broadcast messages from the Semaphore API using the new
@lsst-sqre/semaphore-clientpackage. Key changes:- Prefetch broadcasts in the root layout using service discovery for the Semaphore API URL
- Consolidate BroadcastBannerStack as a client component with React Query hydration
- Remove the legacy maintenance category from BroadcastBanner
- Add a mock Semaphore API endpoint (
/api/dev/semaphore/v1/broadcasts) for local development
-
#385
a713c75Thanks @jonathansick! - Complete Pages Router removalMigrated the remaining Pages Router pages to App Router and deleted the entire
src/pages/directory:- terms page: Migrated to
src/app/terms/page.tsxas a server component - enrollment pages: Migrated 4 enrollment status pages (
pending-approval,pending-confirmation,thanks-for-signing-up,thanks-for-verifying) tosrc/app/enrollment/using RSC MDX compilation viacompileMdxForRsc() - Deleted framework files:
_app.tsx,_document.tsx,_error.tsx(App Router useslayout.tsx,error.tsx) - Deleted dev-only pages:
login.tsx,logout.tsx,sentry-example-page.tsx,api/sentry-example-api.ts - Deleted legacy modules:
AppConfigContext.tsx(replaced by RSCConfigProvider),footerLoader.ts(Pages Router MDX serialization),loadConfigAndMdx()helper
Simplified
useStaticConfigto only support the App RouterConfigProviderpath, removing theAppConfigContextfallback branch. TheAppConfigContextValuetype is now re-exported fromuseStaticConfigfor backward compatibility.squareone is now fully App Router — no Pages Router code remains.
- terms page: Migrated to
-
#385
a03bd17Thanks @jonathansick! - Add pino structured logging for server-side code- Replaced
console.*calls in server-side code with pino structured JSON logging - Production outputs GKE-compatible JSON to stdout; development uses pino-pretty for readable output
- Log level configurable via
LOG_LEVELenvironment variable (defaults toinfoin production,debugin development) - Config loading and MDX loading messages moved to
debuglevel to reduce production noise - API route handlers use child loggers with route context for easier tracing
- Client-side components remain unchanged (Sentry handles client error reporting)
- Replaced
-
#354
2d91039Thanks @jonathansick! - New React Server Components-compatible utilities for loading server-side configuration and MDX content- Config loading (
src/lib/config/rsc/loader.ts): Server-side configuration loading using React'scache()for request deduplication - MDX compilation (
src/lib/mdx/rsc/compiler.ts): RSC-compatible MDX content compilation for server components - ConfigProvider (
src/contexts/rsc/ConfigProvider.tsx): Context provider using React 19'suse()hook to bridge server-loaded config to client components - useStaticConfig hook (
src/hooks/useStaticConfig.ts) provides seamless configuration access across both router patterns
These utilities enable the same configuration and content patterns used in Pages Router while leveraging RSC benefits like reduced client bundle size.
- Config loading (
-
#357
8d837f6Thanks @jonathansick! - New@lsst-sqre/repertoire-clientpackage for Rubin Science Platform service discoveryThis package provides a reusable client for the Repertoire API, enabling dynamic service discovery across monorepo apps:
- Zod schemas for runtime validation of API responses
- ServiceDiscoveryQuery class with convenience methods for querying applications, services, and datasets
- TanStack Query integration with
discoveryQueryOptions()for server prefetching and client-side caching - useServiceDiscovery hook for client components with automatic hydration support
- Mock data for development and testing
Integrated into squareone:
- Added TanStack Query providers with server-side prefetching in root layout
- Components can now use
useServiceDiscovery()to check service availability - Service URLs dynamically discovered instead of hard-coded in configuration
-
#368
0b3f783Thanks @jonathansick! - Migrate Settings UI pages to App Router with TanStack QueryMigrated pages:
/settings- Account overview with MDX content/settings/tokens- Access token list with create button/settings/tokens/new- Create new access token form/settings/tokens/[id]- Token detail view/settings/tokens/history- Token change history with pagination/settings/sessions- Active sessions list/settings/sessions/[id]- Session detail view/settings/sessions/history- Session history with pagination/settings/quotas- Resource quotas display
New components:
AuthRequired- Reusable client component for auth-protected pages with login redirectSettingsLayoutClient- App Router settings layout with sidebar navigation
-
#373
454db1bThanks @jonathansick! - Migrate Times Square pages to App RouterAll Times Square pages now use Next.js App Router instead of Pages Router:
/times-square- Home page with GitHub repository listing/times-square/github/[...tsSlug]- GitHub notebook viewer/times-square/github-pr/[owner]/[repo]/[commit]- PR preview landing page/times-square/github-pr/[owner]/[repo]/[commit]/[...tsSlug]- PR notebook viewer
Key implementation details:
- TimesSquareUrlParametersProvider - Consolidated provider using App Router navigation APIs (
useParams,usePathname,useSearchParams); removed separate Pages Router variant - Shared layout -
layout.tsxhandles service availability checks (404 if Times Square not configured) and wraps all pages withWideContentLayout - Client components - SSE updates handled via
TimesSquareHtmlEventsProviderin client component wrappers - Config access - Migrated from
useAppConfigtouseStaticConfigwhich works with both routers - TimesSquareParametersClient - Updated to use
next/navigationhooks instead ofnext/router
This completes the Times Square App Router migration as part of the broader squareone modernization effort.
-
#373
771eb09Thanks @jonathansick! - Migrate Times Square hooks from SWR to TanStack QueryAll Times Square components now use hooks from
@lsst-sqre/times-square-clientinstead of local SWR-based implementations:TimesSquareParametersClient- usesuseTimesSquarePagefor parameter metadataTimesSquareGitHubPagePanelClient- usesuseTimesSquarePagefor page infoTimesSquareHtmlEventsProviderClient- usesuseTimesSquarePagefor events URLTimesSquareNotebookViewerClient- usesuseTimesSquarePageanduseHtmlStatusfor notebook displayTimesSquareMainGitHubNavClient- usesuseGitHubContentsfor navigation treeTimesSquarePrGitHubNavClient- usesuseGitHubPrContentsfor PR preview navigation- PR Preview Page - uses
useGitHubPrContentsfor check status and PR details
Deleted legacy SWR hooks:
apps/squareone/src/hooks/useTimesSquarePage.tsapps/squareone/src/components/TimesSquareNotebookViewer/useHtmlStatus.tsapps/squareone/src/components/TimesSquareMainGitHubNav/useGitHubContentsListing.tsapps/squareone/src/components/TimesSquarePrGitHubNav/useGitHubPrContentsListing.ts
Patch Changes
- #361 [
3914272](https://...
@lsst-sqre/times-square-client@1.0.0
Minor Changes
-
#385
b2ab600Thanks @jonathansick! - Add optional structured logger injection to client packages- Added a
Loggertype to each client package (repertoire-client,semaphore-client,gafaelfawr-client,times-square-client) matching pino's(obj, msg)calling convention - All
console.log,console.error, andconsole.warncalls replaced with structured logger calls usingdebug,error, andwarnlevels - Logger is accepted as an optional parameter; when omitted, a console-based default preserves existing behavior for client-side and test usage
- squareone's server-side layout now passes its pino logger to
discoveryQueryOptions,fetchServiceDiscovery, andbroadcastsQueryOptionsfor structured JSON output on GKE
- Added a
-
#373
49e148fThanks @jonathansick! - Add direct URL support to useHtmlStatus hookThe
useHtmlStatushook now accepts ahtmlStatusUrloption that allows using a pre-fetched URL directly, rather than building the URL from a page name:const { htmlStatusUrl } = useTimesSquarePage(githubSlug, { repertoireUrl }); const { htmlAvailable, htmlUrl } = useHtmlStatus("", params, { htmlStatusUrl, });
This enables efficient usage patterns where page metadata is already fetched and the HTML status URL can be passed directly. Also adds
fetchHtmlStatusByUrlandhtmlStatusUrlQueryOptionsfor direct URL-based queries. -
#373
5d29200Thanks @jonathansick! - New@lsst-sqre/times-square-clientpackage for Times Square API integrationThis package provides a type-safe client for the Times Square notebook execution API with TanStack Query integration:
- Zod schemas for all Times Square API responses (pages, HTML status, GitHub contents, PR previews)
- Client functions with runtime validation (
fetchPage,fetchHtmlStatus,fetchGitHubContents, etc.) - TanStack Query integration with query key factories and query options for caching and prefetching
- SSE handler for real-time notebook execution status via Server-Sent Events
- React hooks for client components (
useTimesSquarePage,useHtmlStatus,useGitHubContents,useGitHubPrContents) - Mock data and test utilities for development and testing
This package is part of the App Router migration, replacing the existing SWR-based hooks with TanStack Query patterns.
Patch Changes
@lsst-sqre/squared@0.13.0
Minor Changes
-
#391
643b9cbThanks @jonathansick! - Migrate icons from FontAwesome and react-feather to lucide-reactsquared package:
- Replaced
@fortawesome/fontawesome-svg-core,@fortawesome/free-solid-svg-icons,@fortawesome/react-fontawesome, andreact-featherwithlucide-reactas the unified icon library - Updated all components (IconPill, Button, ClipboardButton, DateTimePicker, Modal, Select) to use Lucide icon components
- Fixed IconPill icon vertical alignment by replacing
font-size: 0.9emwithvertical-align: text-bottomfor proper SVG baseline alignment - Updated component prop types from FontAwesome
[IconPrefix, IconName]tuples toLucideIconcomponent references - Updated Storybook stories and tests to use Lucide icons
squareone app:
- Migrated all components from FontAwesome and react-feather imports to lucide-react
- Removed FontAwesome library initialization (
styles/icons.ts) and CSS import from root layout - Removed
react-feathertype declarations - Added a custom
GitHubIconSVG component for the GitHub logo (not available in lucide-react) - Updated icon CSS from
font-size/margin-rightpatterns towidth/height/flexbox for proper SVG alignment - Removed FontAwesome mock from test setup
- Replaced
Patch Changes
-
#386
dd3a96bThanks @dependabot! - Migrate ESLint configuration to v9 flat config format- Replace legacy
.eslintrc.jsfiles witheslint.config.mjsacross all packages and apps - Convert shared
@lsst-sqre/eslint-configto export a flat config array usingeslint-config-turbo/flatandFlatCompatforeslint-config-next - Add
@eslint/eslintrcdependency for FlatCompat bridging where native flat config is not yet available - Remove inline
eslintConfigfrom squareone'spackage.jsonin favor of a standaloneeslint.config.mjs - Add explicit
lintscript to squareone
- Replace legacy
@lsst-sqre/semaphore-client@0.2.0
Minor Changes
-
#383
0a774e8Thanks @jonathansick! - Add @lsst-sqre/semaphore-client packageNew package providing a typed client for the Semaphore broadcast API:
- Zod schemas for broadcast message validation
SemaphoreClientclass for fetching broadcastsuseBroadcastsReact Query hook with prefetch support via query option factories- Mock broadcast data for testing and development
- ESLint configuration and vitest test suite
-
#385
b2ab600Thanks @jonathansick! - Add optional structured logger injection to client packages- Added a
Loggertype to each client package (repertoire-client,semaphore-client,gafaelfawr-client,times-square-client) matching pino's(obj, msg)calling convention - All
console.log,console.error, andconsole.warncalls replaced with structured logger calls usingdebug,error, andwarnlevels - Logger is accepted as an optional parameter; when omitted, a console-based default preserves existing behavior for client-side and test usage
- squareone's server-side layout now passes its pino logger to
discoveryQueryOptions,fetchServiceDiscovery, andbroadcastsQueryOptionsfor structured JSON output on GKE
- Added a
@lsst-sqre/repertoire-client@0.2.0
Minor Changes
-
#385
b2ab600Thanks @jonathansick! - Add optional structured logger injection to client packages- Added a
Loggertype to each client package (repertoire-client,semaphore-client,gafaelfawr-client,times-square-client) matching pino's(obj, msg)calling convention - All
console.log,console.error, andconsole.warncalls replaced with structured logger calls usingdebug,error, andwarnlevels - Logger is accepted as an optional parameter; when omitted, a console-based default preserves existing behavior for client-side and test usage
- squareone's server-side layout now passes its pino logger to
discoveryQueryOptions,fetchServiceDiscovery, andbroadcastsQueryOptionsfor structured JSON output on GKE
- Added a
-
#357
8d837f6Thanks @jonathansick! - New@lsst-sqre/repertoire-clientpackage for Rubin Science Platform service discoveryThis package provides a reusable client for the Repertoire API, enabling dynamic service discovery across monorepo apps:
- Zod schemas for runtime validation of API responses
- ServiceDiscoveryQuery class with convenience methods for querying applications, services, and datasets
- TanStack Query integration with
discoveryQueryOptions()for server prefetching and client-side caching - useServiceDiscovery hook for client components with automatic hydration support
- Mock data for development and testing
Integrated into squareone:
- Added TanStack Query providers with server-side prefetching in root layout
- Components can now use
useServiceDiscovery()to check service availability - Service URLs dynamically discovered instead of hard-coded in configuration
Patch Changes
-
#373
5dba6a8Thanks @jonathansick! - FixgetTimesSquareUrl()to return versioned v1 API URLTimes Square is an internal service with a versioned API, not a UI service. The
getTimesSquareUrl()method now correctly returns the v1 version URL from internal services (e.g.,https://data.lsst.cloud/times-square/api/v1), matching the pattern used bygetGafaelfawrUrl().This aligns with the actual Repertoire service discovery data where times-square is listed under
services.internalwithversions.v1.url.
@lsst-sqre/gafaelfawr-client@1.0.0
Minor Changes
-
#385
b2ab600Thanks @jonathansick! - Add optional structured logger injection to client packages- Added a
Loggertype to each client package (repertoire-client,semaphore-client,gafaelfawr-client,times-square-client) matching pino's(obj, msg)calling convention - All
console.log,console.error, andconsole.warncalls replaced with structured logger calls usingdebug,error, andwarnlevels - Logger is accepted as an optional parameter; when omitted, a console-based default preserves existing behavior for client-side and test usage
- squareone's server-side layout now passes its pino logger to
discoveryQueryOptions,fetchServiceDiscovery, andbroadcastsQueryOptionsfor structured JSON output on GKE
- Added a
-
#368
65ba6a5Thanks @jonathansick! - New@lsst-sqre/gafaelfawr-clientpackage for Gafaelfawr authentication APIThis package provides a reusable client for the Gafaelfawr authentication API with TanStack Query integration:
- Zod schemas for runtime validation of user info, tokens, and login responses
- React hooks for common operations:
useUserInfo- Fetch authenticated user informationuseLoginInfo- Get CSRF token and available scopesuseUserTokens- List user's access tokensuseTokenDetails- Get details of a specific tokenuseCreateToken- Create new user tokensuseDeleteToken- Revoke user tokensuseTokenChangeHistory- Paginated token change history with infinite scrolluseGafaelfawrUrl- Resolve Gafaelfawr URL from repertoire service discovery
- Query helpers (
UserInfoQuery,LoginInfoQuery,TokenListQuery) for convenient data access - Mock data and test utilities for development and testing
The package integrates with
@lsst-sqre/repertoire-clientfor dynamic URL resolution based on service discovery.
Patch Changes
@lsst-sqre/eslint-config@0.3.0
Minor Changes
-
#386
dd3a96bThanks @dependabot! - Migrate ESLint configuration to v9 flat config format- Replace legacy
.eslintrc.jsfiles witheslint.config.mjsacross all packages and apps - Convert shared
@lsst-sqre/eslint-configto export a flat config array usingeslint-config-turbo/flatandFlatCompatforeslint-config-next - Add
@eslint/eslintrcdependency for FlatCompat bridging where native flat config is not yet available - Remove inline
eslintConfigfrom squareone'spackage.jsonin favor of a standaloneeslint.config.mjs - Add explicit
lintscript to squareone
- Replace legacy
squareone@0.30.0
Minor Changes
-
#323
e033943Thanks @jonathansick! - Migrate BroadcastBanner button to squared Button component -
#325
7109e44Thanks @jonathansick! - Add Card, CardGroup, and Note components to squared packageNew components for documentation and content display:
- Card: A content card with shadow and hover border when wrapped in links. Uses CSS Modules with design tokens.
- CardGroup: A responsive CSS Grid container for Card components with configurable
minCardWidthandgapprops. - Note: A callout/note container with floating badge. Supports four types with distinct colors:
note(red),warning(orange),tip(green), andinfo(blue).
The squareone docs page now imports these components from squared instead of using local styled-components implementations. This is part of the ongoing styled-components to CSS Modules migration.
-
#331
b71c274Thanks @jonathansick! - Migrate static page components from styled-components to CSS ModulesThis change converts the following component groups to CSS Modules styling:
Layout Core Components
Page- Main page wrapper componentMainContent- Content area wrapperWideContentLayout- Full-width content layout
Header Components
Header- Main site headerHeaderNav- Navigation links in headerPreHeader- Above-header sectionLogin- User login/logout controls
Footer Components
Footer- Main site footerFooterComponents- Footer sub-components (social links, copyright)
Sidebar Components
Sidebar- Sidebar containerSidebarLayout- Layout with sidebarSidebarNavItem- Individual navigation itemsSidebarNavSection- Navigation section groupingsMobileMenuToggle- Mobile menu hamburger button
Homepage Components
HomepageHero- Landing page hero sectionFullBleedBackgroundImageSection- Full-width background image sections
Typography Components
Typography- Text styling components
Static Page Components
Section- Content section component used in docs and support pages
This migration moves the squareone app closer to eliminating styled-components in favor of CSS Modules with design tokens, improving consistency with the squared component library architecture.
-
#332
d61c458Thanks @jonathansick! - Migrate Times Square components from styled-components to CSS ModulesThis change completes the CSS Modules migration for all Times Square notebook execution components, replacing styled-components with CSS Modules and design tokens.
Times Square App Layout
TimesSquareApp- Main app layout wrapperSidebar- Times Square sidebar with navigation
GitHub Navigation Components
TimesSquareGitHubNav- File tree navigationDirectory- Directory entries with expandable foldersPage- Notebook page entries with current state highlightingTimesSquareMainGitHubNavClient- Main branch navigation containerTimesSquarePrGitHubNavClient- PR preview navigation container
GitHub PR Badge Components
GitHubPrBadge- PR state badges with dynamic colorsGitHubPrTitle- PR header with title and subtitleGitHubCheckBadge- CI check status badges
Notebook Viewer Components
TimesSquareNotebookViewerClient- Notebook iframe viewerParameterInput- Form input wrapper with labelsStringInput- Text input with error state stylingTimesSquareParametersClient- Parameter form container
Page Panel Components
TimesSquareGitHubPagePanel- Page info containerTimesSquareGitHubPagePanelClient- Client-side page panelExecStats- Execution statistics and recompute buttonGitHubEditLink- Link to edit notebook on GitHubIpynbDownloadLink- Notebook download link
Page Files
- GitHub PR landing page (
[commit].tsx)
Button Migration
Replaced the custom
Buttoncomponent with@lsst-sqre/squaredButton component, using appropriate variants (appearance="outline",tone="danger",size="sm"). The oldButton/component directory has been deleted.Dynamic Styling Patterns
- Uses
clsxfor conditional classes (current page highlighting, error states) - Uses CSS custom properties for dynamic colors (PR state colors)
- Uses inline styles for computed color values (check badge colors)
Patch Changes
-
#329
8f01ffcThanks @dependabot! - Bump @storybook/addon-a11y from 10.0.8 to 10.1.3 -
#329
8f01ffcThanks @dependabot! - Bump @storybook/addon-docs from 10.0.8 to 10.1.3 -
#329
8f01ffcThanks @dependabot! - Bump @storybook/addon-links from 10.0.8 to 10.1.3 -
#329
8f01ffcThanks @dependabot! - Bump @storybook/addon-onboarding from 10.0.8 to 10.1.3 -
#329
8f01ffcThanks @dependabot! - Bump @storybook/addon-themes from 10.0.8 to 10.1.3 -
#329
8f01ffcThanks @dependabot! - Bump @storybook/addon-vitest from 10.0.8 to 10.1.3 -
#330
2a03f41Thanks @dependabot! - Bump @turbo/gen from 2.6.1 to 2.6.3 -
#339
827d024Thanks @jonathansick! - Fix API rate limit time window descriptionUpdated the rate limit description in QuotasView to correctly state that API rate limits are measured over a 60 second window (reset every minute) instead of the previous incorrect 15 minute window description.
-
#323
f767cf1Thanks @jonathansick! - Fix BroadcastBanner button baseline alignment -
#328
8001bacThanks @dependabot! - Bump eslint-config-next from 15.5.6 to 15.5.7 in the nextjs group -
#330
2a03f41Thanks @dependabot! - Bump eslint-config-turbo from 2.6.1 to 2.6.3 -
#334
3fc5955Thanks @jonathansick! - Migrate from next/legacy/image to next/imageUpgraded the remaining Image components from the legacy
next/legacy/imageimport to the modernnext/imagecomponent. This is part of the Next.js 15 upgrade to remove deprecated APIs.Components updated:
PreHeader- Header logo imageFooter- Agency partner logosFooterComponents- PartnerLogos MDX component
Changes:
- Replaced
import Image from 'next/legacy/image'withimport Image from 'next/image' - Added responsive styling with
style={{ maxWidth: '100%', width: 'auto', height: 'auto' }}to maintain aspect ratios - Both
widthandheightset to'auto'to satisfy Next.js 13+ Image component requirements
The SidebarLayout component had minor whitespace cleanup.
-
#334
611bf95Thanks @jonathansick! - Migrate to modern next/Link behaviorRemoved the
legacyBehaviorprop from Next.js Link components across the application. This is part of the Next.js 15...
@lsst-sqre/squared@0.12.0
Minor Changes
-
#325
7109e44Thanks @jonathansick! - Add Card, CardGroup, and Note components to squared packageNew components for documentation and content display:
- Card: A content card with shadow and hover border when wrapped in links. Uses CSS Modules with design tokens.
- CardGroup: A responsive CSS Grid container for Card components with configurable
minCardWidthandgapprops. - Note: A callout/note container with floating badge. Supports four types with distinct colors:
note(red),warning(orange),tip(green), andinfo(blue).
The squareone docs page now imports these components from squared instead of using local styled-components implementations. This is part of the ongoing styled-components to CSS Modules migration.
Patch Changes
-
#323
2bb920eThanks @jonathansick! - Fix outline+tertiary Button hover state readabilityThe
appearance="outline" tone="tertiary"Button hover state now uses a subtle 10% opacity background instead of a solid background that made the label illegible on hover. This hover style works dynamically across any context (white text on blue, red, orange backgrounds). -
#334
611bf95Thanks @jonathansick! - Add active state styling to PrimaryNavigation.TriggerLinkAdded CSS styles for the
[data-active]attribute onTriggerLinkcomponents. When a navigation link is marked as active, it now displays with:- Highlighted text color matching the hover state
- Underline decoration for visual distinction
This enables applications to visually indicate the current page in the primary navigation by passing
active={true}toTriggerLink.
@lsst-sqre/file-factory@0.2.0
Minor Changes
-
#324
eee05eaThanks @jonathansick! - Add file-factory CLI tool for scaffolding React components, hooks, contexts, and pagesThis new package provides:
file-factory component- Create React components with optional CSS Modules, tests, and Storybook storiesfile-factory hook- Create React hooks with optional directory structurefile-factory context- Create global React context providersfile-factory page- Create Next.js pages (both Pages Router and App Router)
Features:
- Directory-as-template pattern (like cookiecutter)
- Component-scoped contexts with
--with-contextflag - Automatic barrel file updates
- Package-specific configuration via
.file-factory/config.ts - Custom template overrides
- TypeScript throughout with Zod validation
- Interactive mode when no arguments provided