From d2eaf610e1549814019556b16cc4dfff43c9deb3 Mon Sep 17 00:00:00 2001 From: Billy Daly Date: Fri, 5 Sep 2025 15:38:18 -0400 Subject: [PATCH 01/22] [Issue #317] Support fetching apps in core library (#326) * feat(core): Adds 0.3.0 to the Versions enum * refactor(core): Renamed Form --> FormBase * feat(core): Adds missing fields to Form model * feat(core): Adds new fields and models for application * feat(core): Adds examples to application filters * feat(core): Adds app search endpoint and review tag * docs(core): Improve examples for application --- lib/core/lib/api.tsp | 18 ++++- lib/core/lib/core/fields/file.tsp | 20 +++++ lib/core/lib/core/models/application.tsp | 99 +++++++++++++++++++++++ lib/core/lib/core/models/competition.tsp | 2 +- lib/core/lib/core/models/form.tsp | 11 ++- lib/core/lib/core/routes/applications.tsp | 16 ++++ lib/core/lib/core/routes/forms.tsp | 6 +- lib/core/lib/main.tsp | 1 + 8 files changed, 168 insertions(+), 5 deletions(-) diff --git a/lib/core/lib/api.tsp b/lib/core/lib/api.tsp index 9d3a306ae..b7ce2f462 100644 --- a/lib/core/lib/api.tsp +++ b/lib/core/lib/api.tsp @@ -31,9 +31,17 @@ using Versioning; } ) @tagMetadata("Forms", #{ description: "Endpoints related to forms" }) +@tagMetadata( + "Application Reviews", + #{ + description: "Endpoints related to reviewing applications for a given competition", + } +) @tagMetadata( "Applications", - #{ description: "Endpoints related to applications for a given competition" } + #{ + description: "Endpoints related to submitting applications for a given competition", + } ) @tagMetadata( "Competitions", @@ -122,6 +130,14 @@ namespace Applications { @added(Versions.v0_2) op submitApplication is ApplicationRouter.submitApplication; + + // ################################ + // Search applications + // ################################ + + @added(Versions.v0_3) + @tag("Application Reviews") + op searchApplications is ApplicationRouter.searchApplications; } // ######################################################### diff --git a/lib/core/lib/core/fields/file.tsp b/lib/core/lib/core/fields/file.tsp index 82124b705..c77e7ef86 100644 --- a/lib/core/lib/core/fields/file.tsp +++ b/lib/core/lib/core/fields/file.tsp @@ -47,4 +47,24 @@ namespace Examples.File { createdAt: utcDateTime.fromISO("2025-01-01T17:01:01"), lastModifiedAt: utcDateTime.fromISO("2025-01-02T17:30:00"), }; + + const excelFile = #{ + downloadUrl: "https://example.com/excel.xlsx", + name: "excel.xlsx", + description: "The excel file for the application", + sizeInBytes: 1000, + mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + createdAt: utcDateTime.fromISO("2025-01-01T17:01:01"), + lastModifiedAt: utcDateTime.fromISO("2025-01-02T17:30:00"), + }; + + const zipFile = #{ + downloadUrl: "https://example.com/application.zip", + name: "application.zip", + description: "The zip file for the application", + sizeInBytes: 50000, + mimeType: "application/zip", + createdAt: utcDateTime.fromISO("2025-01-01T17:01:01"), + lastModifiedAt: utcDateTime.fromISO("2025-01-02T17:30:00"), + }; } diff --git a/lib/core/lib/core/models/application.tsp b/lib/core/lib/core/models/application.tsp index 315083149..795f43860 100644 --- a/lib/core/lib/core/models/application.tsp +++ b/lib/core/lib/core/models/application.tsp @@ -13,6 +13,10 @@ model ApplicationBase { /** The unique identifier for the competition */ competitionId: Types.uuid; + /** The unique identifier for the opportunity being applied to */ + @Versioning.added(CommonGrants.Versions.v0_3) + opportunityId: Types.uuid; + /** The form responses for the application */ formResponses: Record; @@ -84,6 +88,79 @@ model AppFormResponse { ...FormResponseBase; } +// ######################################################### +// AppFilters +// ######################################################### + +/** Filters to apply when searching for applications */ +@Versioning.added(CommonGrants.Versions.v0_3) +model AppFilters { + /** The default filters to apply to the search */ + ...AppDefaultFilters; + + /** Additional implementation-defined filters to apply to the search */ + customFilters?: Record; +} + +/** The standard set of filters supported for application searches */ +@Versioning.added(CommonGrants.Versions.v0_3) +model AppDefaultFilters extends Record { + /** `opportunityId` matches one of the following values */ + @example(#{ + operator: Filters.ArrayOperators.in, + value: #["ad3b469a-d89a-42d3-c439-6c1234567890"], + }) + opportunityId?: Filters.StringArrayFilter; + + /** `competitionId` matches one of the following values */ + @example(#{ + operator: Filters.ArrayOperators.in, + value: #["123e4567-e89b-12d3-a456-426614174000"], + }) + competitionId?: Filters.StringArrayFilter; + + /** `submittedAt` is between the given range */ + @example(#{ + operator: Filters.RangeOperators.between, + value: #{ + min: Types.isoDate.fromISO("2025-01-01"), + max: Types.isoDate.fromISO("2025-01-30"), + }, + }) + submittedAtRange?: Filters.DateRangeFilter; + + /** `status.value` matches one of the following values */ + @example(#{ + operator: Filters.ArrayOperators.in, + value: #["submitted", "accepted"], + }) + status?: Filters.StringArrayFilter; +} + +// ######################################################### +// AppSorting +// ######################################################### + +/** The fields that can be used to sort applications */ +@Versioning.added(CommonGrants.Versions.v0_3) +enum AppSortBy { + lastModifiedAt, + createdAt, + submittedAt, + status: "status.value", + opportunityId, + competitionId, + custom, +} + +/** Sorting parameters for applications */ +@Versioning.added(CommonGrants.Versions.v0_3) +model AppSorting extends Sorting.SortBodyParams { + /** The field to sort by */ + @example(AppSortBy.opportunityId) + sortBy: AppSortBy; +} + // ######################################################### // Examples // ######################################################### @@ -110,14 +187,36 @@ namespace Examples.Application { ...Examples.FormResponse.formResponse, }; + const attachmentsCustomField = #{ + name: "attachments", + fieldType: Fields.CustomFieldType.object, + value: #{ + contacts: Fields.Examples.File.pdfFile, + budget: Fields.Examples.File.excelFile, + }, + description: "The attachments for the application", + }; + + const applicationZipFileCustomField = #{ + name: "applicationZipFile", + fieldType: Fields.CustomFieldType.object, + value: Fields.Examples.File.zipFile, + description: "The zip file for the application", + }; + const applicationBase = #{ id: "123e4567-e89b-12d3-a456-426614174000", name: "My Application", competitionId: "123e4567-e89b-12d3-a456-426614174000", + opportunityId: "ad3b469a-d89a-42d3-c439-6c1234567890", formResponses: #{ formA: formResponse }, status: inProgressStatus, submittedAt: null, createdAt: utcDateTime.fromISO("2021-01-01T00:00:00Z"), lastModifiedAt: utcDateTime.fromISO("2021-01-01T00:00:00Z"), + customFields: #{ + attachments: attachmentsCustomField, + applicationZipFile: applicationZipFileCustomField, + }, }; } diff --git a/lib/core/lib/core/models/competition.tsp b/lib/core/lib/core/models/competition.tsp index 236f4dfba..d16fb8790 100644 --- a/lib/core/lib/core/models/competition.tsp +++ b/lib/core/lib/core/models/competition.tsp @@ -83,7 +83,7 @@ enum CompetitionStatusOptions { @example(Examples.Competition.forms) model CompetitionForms { /** The forms for the competition */ - forms: Record; + forms: Record; /** The validation rules for the competition forms */ validation?: Record; diff --git a/lib/core/lib/core/models/form.tsp b/lib/core/lib/core/models/form.tsp index 7fcdd00d0..f1fcedc82 100644 --- a/lib/core/lib/core/models/form.tsp +++ b/lib/core/lib/core/models/form.tsp @@ -9,7 +9,8 @@ namespace CommonGrants.Models; /** A form for collecting data from a user. */ @example(Examples.Form.form) @Versioning.added(CommonGrants.Versions.v0_2) -model Form { +@Versioning.renamedFrom(CommonGrants.Versions.v0_3, "Form") +model FormBase { /** The form's unique identifier. */ id: Types.uuid; @@ -19,6 +20,9 @@ model Form { /** The form's description. */ description?: string; + @Versioning.added(CommonGrants.Versions.v0_3) + version?: string; + /** The form's instructions. */ instructions?: string | Fields.File[]; @@ -36,6 +40,9 @@ model Form { /** Custom attributes about the form itself, not custom fields within the form. */ customFields?: Record; + + /** The system metadata for the form. */ + ...Fields.SystemMetadata; } // ######################################################### @@ -74,6 +81,8 @@ namespace Examples.Form { uiSchema: uiSchema, mappingToCommonGrants: mappingToCommonGrants, mappingFromCommonGrants: mappingFromCommonGrants, + createdAt: utcDateTime.fromISO("2025-01-01T17:01:01"), + lastModifiedAt: utcDateTime.fromISO("2025-01-02T17:30:00"), }; const formSchema = #{ diff --git a/lib/core/lib/core/routes/applications.tsp b/lib/core/lib/core/routes/applications.tsp index faaa0a0e5..a85f5a181 100644 --- a/lib/core/lib/core/routes/applications.tsp +++ b/lib/core/lib/core/routes/applications.tsp @@ -63,4 +63,20 @@ interface Applications { | Responses.ApplicationSubmissionError | Responses.NotFound | Responses.Unauthorized; + + // ############################### + // Search applications + // ############################### + + @summary("Search applications") + @doc("Search for applications. Note: The search results for a given query will depend on the scopes attached to the API token used to make the request.") + @get + @route("/search") + searchApplications( + /** The filters to apply to the search */ + @query filters: Models.AppFilters, + + /** The sorting to apply to the search */ + @query sorting: Models.AppSorting, + ): Responses.Filtered; } diff --git a/lib/core/lib/core/routes/forms.tsp b/lib/core/lib/core/routes/forms.tsp index c01d60177..f6545a50b 100644 --- a/lib/core/lib/core/routes/forms.tsp +++ b/lib/core/lib/core/routes/forms.tsp @@ -22,7 +22,9 @@ interface Forms { @summary("List forms") @doc("Get a paginated list of forms, sorted by `lastModifiedAt` with most recent first.") @get - list(...Pagination.PaginatedQueryParams): Responses.Paginated; + list( + ...Pagination.PaginatedQueryParams, + ): Responses.Paginated; // ############################### // View form details @@ -34,5 +36,5 @@ interface Forms { read( /** The ID of the form to view */ @path formId: Types.uuid, - ): Responses.Ok; + ): Responses.Ok; } diff --git a/lib/core/lib/main.tsp b/lib/core/lib/main.tsp index cb54731c3..8d270ac86 100644 --- a/lib/core/lib/main.tsp +++ b/lib/core/lib/main.tsp @@ -18,4 +18,5 @@ namespace CommonGrants; enum Versions { v0_1: "0.1.0", v0_2: "0.2.0", + v0_3: "0.3.0", } From 2f06fb84b9939feaa13ea8cd89bc88daf25434d8 Mon Sep 17 00:00:00 2001 From: jcrichlake Date: Mon, 2 Feb 2026 16:31:52 -0500 Subject: [PATCH 02/22] Changed applications route verb --- lib/core/lib/core/routes/applications.tsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/core/lib/core/routes/applications.tsp b/lib/core/lib/core/routes/applications.tsp index a85f5a181..3dcd2fd3c 100644 --- a/lib/core/lib/core/routes/applications.tsp +++ b/lib/core/lib/core/routes/applications.tsp @@ -70,7 +70,7 @@ interface Applications { @summary("Search applications") @doc("Search for applications. Note: The search results for a given query will depend on the scopes attached to the API token used to make the request.") - @get + @post @route("/search") searchApplications( /** The filters to apply to the search */ From 24e64ea6b26268cce13bc2c3264bbe3d6f4863dc Mon Sep 17 00:00:00 2001 From: widal001 Date: Wed, 11 Feb 2026 20:24:45 -0500 Subject: [PATCH 03/22] feat(core): Adds explicit @Versioning.added() Previously we omitted @Versioning.added() decorator for schemas added in v0.1.0 but that caused some v0.2.0 models to get inferred as v0.1.0. This makes all versioning explicit. --- lib/core/lib/core/fields/custom-field.tsp | 2 ++ lib/core/lib/core/fields/event.tsp | 6 ++++++ lib/core/lib/core/fields/metadata.tsp | 1 + lib/core/lib/core/fields/money.tsp | 1 + lib/core/lib/core/fields/phone.tsp | 2 ++ lib/core/lib/core/filters/base.tsp | 7 +++++++ lib/core/lib/core/filters/date.tsp | 2 ++ lib/core/lib/core/filters/money.tsp | 2 ++ lib/core/lib/core/filters/numeric.tsp | 3 +++ lib/core/lib/core/filters/string.tsp | 2 ++ lib/core/lib/core/models/application.tsp | 1 + lib/core/lib/core/models/competition.tsp | 4 ++++ lib/core/lib/core/models/opportunity/base.tsp | 1 + lib/core/lib/core/models/opportunity/funding.tsp | 1 + lib/core/lib/core/models/opportunity/search.tsp | 4 ++++ lib/core/lib/core/models/opportunity/status.tsp | 2 ++ lib/core/lib/core/models/opportunity/timeline.tsp | 1 + lib/core/lib/core/pagination.tsp | 3 +++ lib/core/lib/core/responses/error.tsp | 1 + lib/core/lib/core/responses/success.tsp | 6 ++++++ lib/core/lib/core/sorting.tsp | 4 ++++ lib/core/lib/core/types.tsp | 4 ++++ 22 files changed, 60 insertions(+) diff --git a/lib/core/lib/core/fields/custom-field.tsp b/lib/core/lib/core/fields/custom-field.tsp index f9d764ecb..a92c8abb2 100644 --- a/lib/core/lib/core/fields/custom-field.tsp +++ b/lib/core/lib/core/fields/custom-field.tsp @@ -5,6 +5,7 @@ namespace CommonGrants.Fields; // ######################################## /** The set of JSON schema types supported by a custom field */ +@Versioning.added(CommonGrants.Versions.v0_1) enum CustomFieldType { string, number, @@ -44,6 +45,7 @@ enum CustomFieldType { #{ title: "Array field for eligibility types" } ) @doc("A custom field on a model") +@Versioning.added(CommonGrants.Versions.v0_1) model CustomField { /** Name of the custom field */ name: string; diff --git a/lib/core/lib/core/fields/event.tsp b/lib/core/lib/core/fields/event.tsp index 1a2709e90..fbd961dd1 100644 --- a/lib/core/lib/core/fields/event.tsp +++ b/lib/core/lib/core/fields/event.tsp @@ -14,6 +14,7 @@ using Types; * - dateRange: A period of time with a start and end date * - other: Other event type (e.g., a recurring event) */ +@Versioning.added(CommonGrants.Versions.v0_1) enum EventType { /** A single date with no time */ singleDate, @@ -30,6 +31,7 @@ enum EventType { // ######################################## /** Union of all event types */ +@Versioning.added(CommonGrants.Versions.v0_1) union Event { /** A single date event */ singleDate: SingleDateEvent, @@ -47,6 +49,7 @@ union Event { /** Base model for all events */ @discriminator("eventType") +@Versioning.added(CommonGrants.Versions.v0_1) model EventBase { /** Human-readable name of the event (e.g., 'Application posted', 'Question deadline') */ name: string; @@ -65,6 +68,7 @@ model EventBase { /** Description of an event that has a date (and possible time) associated with it */ @example(Examples.Event.postedDate, #{ title: "Opportunity posted date" }) @example(Examples.Event.closeDate, #{ title: "Opportunity close date" }) +@Versioning.added(CommonGrants.Versions.v0_1) model SingleDateEvent extends EventBase { /** Type of event */ eventType: EventType.singleDate; @@ -83,6 +87,7 @@ model SingleDateEvent extends EventBase { /** Description of an event that has a start and end date (and possible time) associated with it */ @example(Examples.Event.performancePeriod, #{ title: "Period of performance" }) @example(Examples.Event.applicationPeriod, #{ title: "Application period" }) +@Versioning.added(CommonGrants.Versions.v0_1) model DateRangeEvent extends EventBase { /** Type of event */ eventType: EventType.dateRange; @@ -106,6 +111,7 @@ model DateRangeEvent extends EventBase { /** Description of an event that is not a single date or date range */ @example(Examples.Event.infoSessions, #{ title: "Info sessions" }) +@Versioning.added(CommonGrants.Versions.v0_1) model OtherEvent extends EventBase { /** Type of event */ eventType: EventType.other; diff --git a/lib/core/lib/core/fields/metadata.tsp b/lib/core/lib/core/fields/metadata.tsp index 516dd96d7..1cbe0c8b0 100644 --- a/lib/core/lib/core/fields/metadata.tsp +++ b/lib/core/lib/core/fields/metadata.tsp @@ -19,6 +19,7 @@ namespace CommonGrants.Fields; * ``` * */ @example(Examples.Metadata.system) +@Versioning.added(CommonGrants.Versions.v0_1) model SystemMetadata { /** The timestamp (in UTC) at which the record was created. */ @visibility(Lifecycle.Read) diff --git a/lib/core/lib/core/fields/money.tsp b/lib/core/lib/core/fields/money.tsp index 79f2bbefb..3654d09a9 100644 --- a/lib/core/lib/core/fields/money.tsp +++ b/lib/core/lib/core/fields/money.tsp @@ -18,6 +18,7 @@ using Types; Examples.Money.usdNegative, #{ title: "A negative amount of US dollars and cents" } ) +@Versioning.added(CommonGrants.Versions.v0_1) model Money { /** The amount of money */ amount: decimalString; diff --git a/lib/core/lib/core/fields/phone.tsp b/lib/core/lib/core/fields/phone.tsp index dacccdc04..991351d0c 100644 --- a/lib/core/lib/core/fields/phone.tsp +++ b/lib/core/lib/core/fields/phone.tsp @@ -3,6 +3,7 @@ namespace CommonGrants.Fields; /** A phone number. */ @example(Examples.Phone.mobile) @example(Examples.Phone.withExtension) +@Versioning.added(CommonGrants.Versions.v0_2) model Phone { /** The international country code (e.g., "+1" for US/Canada). */ @pattern("^\\+[1-9][0-9]{0,3}$") @@ -25,6 +26,7 @@ model Phone { /** A collection of phone numbers for a person. */ @example(Examples.Phone.personalCollection) @example(Examples.Phone.orgCollection) +@Versioning.added(CommonGrants.Versions.v0_2) model PhoneCollection { /** The person's primary phone number. */ primary: Fields.Phone; diff --git a/lib/core/lib/core/filters/base.tsp b/lib/core/lib/core/filters/base.tsp index 497e0c597..3beca0a78 100644 --- a/lib/core/lib/core/filters/base.tsp +++ b/lib/core/lib/core/filters/base.tsp @@ -5,6 +5,7 @@ namespace CommonGrants.Filters; // ############################################################################ /** Operators that filter a field based on an exact match to a value */ +@Versioning.added(CommonGrants.Versions.v0_1) enum EquivalenceOperators { /** Equal to a value */ eq, @@ -14,6 +15,7 @@ enum EquivalenceOperators { } /** Operators that filter a field based on a comparison to a value */ +@Versioning.added(CommonGrants.Versions.v0_1) enum ComparisonOperators { /** Greater than a value */ gt, @@ -29,6 +31,7 @@ enum ComparisonOperators { } /** Operators that filter a field based on an array of values */ +@Versioning.added(CommonGrants.Versions.v0_1) enum ArrayOperators { /** In an array of values */ in, @@ -38,6 +41,7 @@ enum ArrayOperators { } /** Operators that filter a field based on a string value */ +@Versioning.added(CommonGrants.Versions.v0_1) enum StringOperators { /** Like */ like, @@ -47,6 +51,7 @@ enum StringOperators { } /** Operators that filter a field based on a range of values */ +@Versioning.added(CommonGrants.Versions.v0_1) enum RangeOperators { /** Between a range of values */ between, @@ -55,6 +60,7 @@ enum RangeOperators { outside, } +@Versioning.added(CommonGrants.Versions.v0_1) enum AllOperators { ...EquivalenceOperators, ...ComparisonOperators, @@ -68,6 +74,7 @@ enum AllOperators { // ############################################################################ /** A base filter model that can be used to create more specific filter models */ +@Versioning.added(CommonGrants.Versions.v0_1) model DefaultFilter { /** The operator to apply to the filter value */ operator: diff --git a/lib/core/lib/core/filters/date.tsp b/lib/core/lib/core/filters/date.tsp index a6cf6d441..2f0fbc473 100644 --- a/lib/core/lib/core/filters/date.tsp +++ b/lib/core/lib/core/filters/date.tsp @@ -8,6 +8,7 @@ namespace CommonGrants.Filters; // ############################################################################ /** Filters by comparing a field to a date value */ +@Versioning.added(CommonGrants.Versions.v0_1) model DateComparisonFilter { /** The operator to apply to the filter value */ operator: ComparisonOperators; @@ -22,6 +23,7 @@ model DateComparisonFilter { // ############################################################################ /** Filters by comparing a field to a range of date values */ +@Versioning.added(CommonGrants.Versions.v0_1) model DateRangeFilter { /** The operator to apply to the filter value */ operator: RangeOperators; diff --git a/lib/core/lib/core/filters/money.tsp b/lib/core/lib/core/filters/money.tsp index 7f4357c10..da59b9e75 100644 --- a/lib/core/lib/core/filters/money.tsp +++ b/lib/core/lib/core/filters/money.tsp @@ -8,6 +8,7 @@ namespace CommonGrants.Filters; // ############################################################################ /** Filters by comparing a field to a monetary value */ +@Versioning.added(CommonGrants.Versions.v0_1) model MoneyComparisonFilter { /** The operator to apply to the filter value */ operator: ComparisonOperators; @@ -22,6 +23,7 @@ model MoneyComparisonFilter { // ############################################################################ /** Filters by comparing a field to a range of monetary values */ +@Versioning.added(CommonGrants.Versions.v0_1) model MoneyRangeFilter { /** The operator to apply to the filter value */ operator: RangeOperators; diff --git a/lib/core/lib/core/filters/numeric.tsp b/lib/core/lib/core/filters/numeric.tsp index 85bc53d91..ac456915f 100644 --- a/lib/core/lib/core/filters/numeric.tsp +++ b/lib/core/lib/core/filters/numeric.tsp @@ -9,6 +9,7 @@ namespace CommonGrants.Filters; // ############################################################################ /** Filters by comparing a field to a numeric value */ +@Versioning.added(CommonGrants.Versions.v0_1) model NumberComparisonFilter { /** The comparison operator to apply to the filter value */ operator: ComparisonOperators; @@ -23,6 +24,7 @@ model NumberComparisonFilter { // ############################################################################ /** Filters by comparing a field to a numeric range */ +@Versioning.added(CommonGrants.Versions.v0_1) model NumberRangeFilter { /** The operator to apply to the filter value */ operator: RangeOperators; @@ -40,6 +42,7 @@ model NumberRangeFilter { // ############################################################################ /** Filters by comparing a field to an array of numeric values */ +@Versioning.added(CommonGrants.Versions.v0_1) model NumberArrayFilter { /** The operator to apply to the filter value */ operator: ArrayOperators; diff --git a/lib/core/lib/core/filters/string.tsp b/lib/core/lib/core/filters/string.tsp index 95ae13002..971617812 100644 --- a/lib/core/lib/core/filters/string.tsp +++ b/lib/core/lib/core/filters/string.tsp @@ -7,6 +7,7 @@ namespace CommonGrants.Filters; // ############################################################################ /** A filter that applies a comparison to a string value */ +@Versioning.added(CommonGrants.Versions.v0_1) model StringComparisonFilter { /** The operator to apply to the filter value */ operator: EquivalenceOperators | StringOperators; @@ -21,6 +22,7 @@ model StringComparisonFilter { // ############################################################################ /** Filters by comparing a field to an array of string values */ +@Versioning.added(CommonGrants.Versions.v0_1) model StringArrayFilter { /** The operator to apply to the filter value */ operator: ArrayOperators; diff --git a/lib/core/lib/core/models/application.tsp b/lib/core/lib/core/models/application.tsp index 795f43860..0873d3457 100644 --- a/lib/core/lib/core/models/application.tsp +++ b/lib/core/lib/core/models/application.tsp @@ -65,6 +65,7 @@ model AppStatus { * - `rejected`: The application has been rejected * - `custom`: A custom status */ +@Versioning.added(CommonGrants.Versions.v0_1) enum AppStatusOptions { inProgress, submitted, diff --git a/lib/core/lib/core/models/competition.tsp b/lib/core/lib/core/models/competition.tsp index d16fb8790..a88754b0e 100644 --- a/lib/core/lib/core/models/competition.tsp +++ b/lib/core/lib/core/models/competition.tsp @@ -49,6 +49,7 @@ model CompetitionBase { /** The status of the competition */ @example(Examples.Competition.status) +@Versioning.added(CommonGrants.Versions.v0_1) model CompetitionStatus { /** The status of the competition, from a predefined set of options */ value: CompetitionStatusOptions; @@ -69,6 +70,7 @@ model CompetitionStatus { * - `closed`: The competition is no longer accepting applications * - `custom`: A custom status */ +@Versioning.added(CommonGrants.Versions.v0_1) enum CompetitionStatusOptions { open, closed, @@ -81,6 +83,7 @@ enum CompetitionStatusOptions { /** Set of forms that need to be completed to apply to the competition. */ @example(Examples.Competition.forms) +@Versioning.added(CommonGrants.Versions.v0_1) model CompetitionForms { /** The forms for the competition */ forms: Record; @@ -94,6 +97,7 @@ model CompetitionForms { // ######################################################### @example(Examples.Competition.keyDates) +@Versioning.added(CommonGrants.Versions.v0_1) model CompetitionTimeline { /** The start date of the competition */ openDate?: Fields.Event; diff --git a/lib/core/lib/core/models/opportunity/base.tsp b/lib/core/lib/core/models/opportunity/base.tsp index 8d93dcbb5..783091255 100644 --- a/lib/core/lib/core/models/opportunity/base.tsp +++ b/lib/core/lib/core/models/opportunity/base.tsp @@ -40,6 +40,7 @@ using Types; * ``` */ @doc("A funding opportunity") +@Versioning.added(CommonGrants.Versions.v0_1) model OpportunityBase { /** Globally unique id for the opportunity */ @visibility(Lifecycle.Read) diff --git a/lib/core/lib/core/models/opportunity/funding.tsp b/lib/core/lib/core/models/opportunity/funding.tsp index 997fb6748..cb9d197cc 100644 --- a/lib/core/lib/core/models/opportunity/funding.tsp +++ b/lib/core/lib/core/models/opportunity/funding.tsp @@ -19,6 +19,7 @@ using Fields; #{ title: "Total funding limit but no award range" } ) @example(Examples.Funding.allFields, #{ title: "All fields defined" }) +@Versioning.added(CommonGrants.Versions.v0_1) model OppFunding { /** Details about the funding available for this opportunity that don't fit other fields */ details?: string; diff --git a/lib/core/lib/core/models/opportunity/search.tsp b/lib/core/lib/core/models/opportunity/search.tsp index d9708a964..0161d6fa2 100644 --- a/lib/core/lib/core/models/opportunity/search.tsp +++ b/lib/core/lib/core/models/opportunity/search.tsp @@ -8,6 +8,7 @@ namespace CommonGrants.Models; // ############################################################################ /** Filters to apply when searching for opportunities */ +@Versioning.added(CommonGrants.Versions.v0_1) model OppFilters { /** The default filters to apply to the search */ ...OppDefaultFilters; @@ -17,6 +18,7 @@ model OppFilters { } /** The standard set of filters supported for opportunity searches */ +@Versioning.added(CommonGrants.Versions.v0_1) model OppDefaultFilters extends Record { /** `status.value` matches one of the following values */ @example(#{ @@ -82,6 +84,7 @@ model OppDefaultFilters extends Record { // Sorting models // ############################################################################ +@Versioning.added(CommonGrants.Versions.v0_1) enum OppSortBy { lastModifiedAt, createdAt, @@ -95,6 +98,7 @@ enum OppSortBy { custom, } +@Versioning.added(CommonGrants.Versions.v0_1) model OppSorting extends Sorting.SortBodyParams { /** The field to sort by */ @example(OppSortBy.lastModifiedAt) diff --git a/lib/core/lib/core/models/opportunity/status.tsp b/lib/core/lib/core/models/opportunity/status.tsp index d0b2ef21e..b7685a60d 100644 --- a/lib/core/lib/core/models/opportunity/status.tsp +++ b/lib/core/lib/core/models/opportunity/status.tsp @@ -10,6 +10,7 @@ namespace CommonGrants.Models; * - `closed`: The opportunity is no longer accepting applications * - `custom`: A custom status */ +@Versioning.added(CommonGrants.Versions.v0_1) enum OppStatusOptions { forecasted, open, @@ -24,6 +25,7 @@ enum OppStatusOptions { /** The status of the opportunity */ @example(Examples.OppStatus.custom) @example(Examples.OppStatus.default) +@Versioning.added(CommonGrants.Versions.v0_1) model OppStatus { /** The status of the opportunity, from a predefined set of options */ value: OppStatusOptions; diff --git a/lib/core/lib/core/models/opportunity/timeline.tsp b/lib/core/lib/core/models/opportunity/timeline.tsp index 716a8f2ae..8ad3ff6c4 100644 --- a/lib/core/lib/core/models/opportunity/timeline.tsp +++ b/lib/core/lib/core/models/opportunity/timeline.tsp @@ -12,6 +12,7 @@ using Types; /** Key dates and events in the opportunity's timeline, such as when the opportunity is posted and closes */ @example(Examples.Timeline.opportunity) +@Versioning.added(CommonGrants.Versions.v0_1) model OppTimeline { /** The date (and time) at which the opportunity is posted */ postDate?: Event; diff --git a/lib/core/lib/core/pagination.tsp b/lib/core/lib/core/pagination.tsp index 96cd4da34..84b7a5766 100644 --- a/lib/core/lib/core/pagination.tsp +++ b/lib/core/lib/core/pagination.tsp @@ -8,6 +8,7 @@ using TypeSpec.JsonSchema; namespace CommonGrants.Pagination; /** Query parameters for paginated routes */ +@Versioning.added(CommonGrants.Versions.v0_1) model PaginatedQueryParams { /** The page to return */ @query @@ -23,6 +24,7 @@ model PaginatedQueryParams { } /** Body parameters for paginated routes */ +@Versioning.added(CommonGrants.Versions.v0_1) model PaginatedBodyParams { /** The page to return */ @pageIndex @@ -36,6 +38,7 @@ model PaginatedBodyParams { } /** Details about the paginated results */ +@Versioning.added(CommonGrants.Versions.v0_1) model PaginatedResultsInfo { /** Current page number (indexing starts at 1) */ @example(1) diff --git a/lib/core/lib/core/responses/error.tsp b/lib/core/lib/core/responses/error.tsp index 195c3c0f6..11c3d20ab 100644 --- a/lib/core/lib/core/responses/error.tsp +++ b/lib/core/lib/core/responses/error.tsp @@ -14,6 +14,7 @@ namespace CommonGrants.Responses; */ @error @doc("A non-2xx response schema") +@Versioning.added(CommonGrants.Versions.v0_1) model Error { @example(400) status: int32; diff --git a/lib/core/lib/core/responses/success.tsp b/lib/core/lib/core/responses/success.tsp index 818b0180d..ea19ab847 100644 --- a/lib/core/lib/core/responses/success.tsp +++ b/lib/core/lib/core/responses/success.tsp @@ -8,6 +8,7 @@ namespace CommonGrants.Responses; // Default success response // ############################################################################ +@Versioning.added(CommonGrants.Versions.v0_1) model Success { @example(200) status: int32; @@ -37,6 +38,7 @@ model Success { * ``` */ @doc("A 200 response with data") +@Versioning.added(CommonGrants.Versions.v0_1) model Ok extends Success { // Inherit the 200 status code ...Http.OkResponse; @@ -66,6 +68,7 @@ model Ok extends Success { * ``` */ @doc("A 200 response with a paginated list of items") +@Versioning.added(CommonGrants.Versions.v0_1) model Paginated extends Success { // Inherit the 200 status code ...Http.OkResponse; @@ -98,6 +101,7 @@ model Paginated extends Success { * alias CustomModelSortedResponse = Responses.Sorted; * ``` */ +@Versioning.added(CommonGrants.Versions.v0_1) model Sorted { // Inherit the properties of the Paginated response ...Paginated; @@ -132,6 +136,7 @@ model Sorted { * alias CustomModelFilteredResponse = Responses.Filtered; * ``` */ +@Versioning.added(CommonGrants.Versions.v0_1) model Filtered extends Success { // Inherit the properties of the Sorted response ...Sorted; @@ -153,6 +158,7 @@ model Filtered extends Success { * * @template T The schema for the value of the `"data"` property in this response */ +@Versioning.added(CommonGrants.Versions.v0_1) model Created extends Success { // Inherit the 201 status code ...Http.CreatedResponse; diff --git a/lib/core/lib/core/sorting.tsp b/lib/core/lib/core/sorting.tsp index 00ff8c10a..5b76d4bd3 100644 --- a/lib/core/lib/core/sorting.tsp +++ b/lib/core/lib/core/sorting.tsp @@ -18,12 +18,14 @@ using TypeSpec.JsonSchema; @jsonSchema namespace CommonGrants.Sorting; +@Versioning.added(CommonGrants.Versions.v0_1) enum SortOrder { asc, desc, } /** Query parameters for sorting */ +@Versioning.added(CommonGrants.Versions.v0_1) model SortQueryParams { /** The field to sort by */ @query @@ -42,6 +44,7 @@ model SortQueryParams { } /** Sorting parameters included in the request body */ +@Versioning.added(CommonGrants.Versions.v0_1) model SortBodyParams { /** The field to sort by */ @example("lastModifiedAt") @@ -57,6 +60,7 @@ model SortBodyParams { } /** Information about the sort order of the items returned */ +@Versioning.added(CommonGrants.Versions.v0_1) model SortedResultsInfo { /** The field results are sorted by, or "custom" if an implementation-defined sort key is used */ @example("lastModifiedAt") diff --git a/lib/core/lib/core/types.tsp b/lib/core/lib/core/types.tsp index 777dcd6de..9faf2a8f0 100644 --- a/lib/core/lib/core/types.tsp +++ b/lib/core/lib/core/types.tsp @@ -28,6 +28,7 @@ namespace CommonGrants.Types; /** A universally unique identifier */ @example("30a12e5e-5940-4c08-921c-17a8960fcf4b") @format("uuid") +@Versioning.added(CommonGrants.Versions.v0_1) scalar uuid extends string; /** An email address */ @@ -67,6 +68,7 @@ scalar duns extends string; @example("100", #{ title: "Scale 0" }) @example("100.5", #{ title: "Scale 1" }) @example("-100.5", #{ title: "Negative, scale 2" }) +@Versioning.added(CommonGrants.Versions.v0_1) scalar decimalString extends string; // ######################################## @@ -75,10 +77,12 @@ scalar decimalString extends string; /** A time on a clock, without a timezone, in ISO 8601 format HH:mm:ss */ @example(isoTime.fromISO("17:00:00")) +@Versioning.added(CommonGrants.Versions.v0_1) scalar isoTime extends plainTime; /** A date on a calendar in ISO 8601 format YYYY-MM-DD */ @example(isoDate.fromISO("2025-01-01")) +@Versioning.added(CommonGrants.Versions.v0_1) scalar isoDate extends plainDate; /** A calendar year */ From 8e7ec54cbc0dfd7a2fd4850cbe6cc4a8c170eb49 Mon Sep 17 00:00:00 2001 From: widal001 Date: Wed, 11 Feb 2026 21:04:17 -0500 Subject: [PATCH 04/22] build: Aligns deps across pnpm workspace - Update all `@types/node` deps to use `"catalog:"` - Updates website to use "workspace:*" for `@common-grants/core` - Updates website to set all `@typespec/` deps to use `"catalog:"` --- lib/changelog-emitter/package.json | 7 +- lib/cli/package.json | 2 +- lib/core/package.json | 2 +- lib/ts-sdk/package.json | 16 +- pnpm-lock.yaml | 1296 ++++++---------------------- pnpm-workspace.yaml | 1 + templates/express-js/package.json | 2 +- website/package.json | 17 +- 8 files changed, 298 insertions(+), 1045 deletions(-) diff --git a/lib/changelog-emitter/package.json b/lib/changelog-emitter/package.json index 8b5a133b9..b7e5bdd61 100644 --- a/lib/changelog-emitter/package.json +++ b/lib/changelog-emitter/package.json @@ -14,12 +14,11 @@ } }, "peerDependencies": { - "@typespec/compiler": "^1.0.0", - "@typespec/versioning": ">=0.70.0" + "@typespec/compiler": "catalog:", + "@typespec/versioning": "catalog:" }, "devDependencies": { - "@types/node": "latest", - "@typespec/compiler": "^1.5.0", + "@types/node": "catalog:", "@typespec/prettier-plugin-typespec": "^1.5.0", "eslint": "^9.15.0", "@eslint/js": "^9.15.0", diff --git a/lib/cli/package.json b/lib/cli/package.json index 4c0684dac..b3665928d 100644 --- a/lib/cli/package.json +++ b/lib/cli/package.json @@ -75,7 +75,7 @@ "@types/jest": "^29.5.14", "@types/js-yaml": "^4.0.9", "@types/json-schema-merge-allof": "^0.6.5", - "@types/node": "^20.19.23", + "@types/node": "catalog:", "@types/supertest": "^6.0.3", "@types/swagger-ui-express": "^4.1.8", "@typescript-eslint/eslint-plugin": "^8.46.2", diff --git a/lib/core/package.json b/lib/core/package.json index 6f97bb3e2..7fe462e98 100644 --- a/lib/core/package.json +++ b/lib/core/package.json @@ -61,7 +61,7 @@ }, "devDependencies": { "@eslint/js": "^9.18.0", - "@types/node": "^20.10.6", + "@types/node": "catalog:", "eslint": "^9.18.0", "globals": "^15.14.0", "prettier": "^3.4.2", diff --git a/lib/ts-sdk/package.json b/lib/ts-sdk/package.json index b6178021e..232272de7 100644 --- a/lib/ts-sdk/package.json +++ b/lib/ts-sdk/package.json @@ -81,16 +81,16 @@ "@common-grants/core": "workspace:*", "@eslint/js": "^9.38.0", "@types/js-yaml": "^4.0.9", - "@types/node": "^20.19.23", + "@types/node": "catalog:", "@typescript-eslint/eslint-plugin": "^8.46.2", "@typescript-eslint/parser": "^8.46.2", - "@typespec/compiler": "^1.5.0", - "@typespec/http": "^1.5.0", - "@typespec/json-schema": "^1.5.0", - "@typespec/openapi": "^1.5.0", - "@typespec/openapi3": "^1.5.0", - "@typespec/rest": "^0.75.0", - "@typespec/versioning": "^0.75.0", + "@typespec/compiler": "catalog:", + "@typespec/http": "catalog:", + "@typespec/json-schema": "catalog:", + "@typespec/openapi": "catalog:", + "@typespec/openapi3": "catalog:", + "@typespec/rest": "catalog:", + "@typespec/versioning": "catalog:", "@vitest/coverage-v8": "^3.2.4", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 717d8032e..d22a17d23 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,9 @@ settings: catalogs: default: + '@types/node': + specifier: ^20.19.23 + version: 20.19.31 '@typespec/compiler': specifier: ^1.9.0 version: 1.9.0 @@ -53,19 +56,19 @@ importers: lib/changelog-emitter: dependencies: + '@typespec/compiler': + specifier: 'catalog:' + version: 1.9.0(@types/node@20.19.31) '@typespec/versioning': - specifier: '>=0.70.0' - version: 0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) + specifier: 'catalog:' + version: 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) devDependencies: '@eslint/js': specifier: ^9.15.0 version: 9.38.0 '@types/node': - specifier: latest - version: 25.2.3 - '@typespec/compiler': - specifier: ^1.5.0 - version: 1.5.0(@types/node@25.2.3) + specifier: 'catalog:' + version: 20.19.31 '@typespec/prettier-plugin-typespec': specifier: ^1.5.0 version: 1.5.0 @@ -83,7 +86,7 @@ importers: version: 8.46.2(eslint@9.38.0)(typescript@5.9.3) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) lib/cli: dependencies: @@ -92,7 +95,7 @@ importers: version: 10.1.1(openapi-types@12.1.3) '@typespec/compiler': specifier: 'catalog:' - version: 1.9.0(@types/node@20.19.23) + version: 1.9.0(@types/node@20.19.31) chalk: specifier: ^4.1.2 version: 4.1.2 @@ -104,7 +107,7 @@ importers: version: 4.21.2 inquirer: specifier: ^9.3.8 - version: 9.3.8(@types/node@20.19.23) + version: 9.3.8(@types/node@20.19.31) js-yaml: specifier: ^4.1.0 version: 4.1.1 @@ -146,8 +149,8 @@ importers: specifier: ^0.6.5 version: 0.6.5 '@types/node': - specifier: ^20.19.23 - version: 20.19.23 + specifier: 'catalog:' + version: 20.19.31 '@types/supertest': specifier: ^6.0.3 version: 6.0.3 @@ -162,13 +165,13 @@ importers: version: 8.46.2(eslint@9.38.0)(typescript@5.9.3) '@typespec/json-schema': specifier: 'catalog:' - version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) '@typespec/openapi3': specifier: 'catalog:' - version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)))(@typespec/json-schema@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)))(@typespec/openapi@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))))(@typespec/versioning@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23))) + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))(@typespec/json-schema@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))(@typespec/openapi@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))))(@typespec/versioning@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31))) '@typespec/versioning': specifier: 'catalog:' - version: 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) + version: 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) eslint: specifier: ^9.38.0 version: 9.38.0 @@ -177,13 +180,13 @@ importers: version: 9.1.2(eslint@9.38.0) eslint-plugin-jest: specifier: ^29.0.1 - version: 29.0.1(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.0.1(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(jest@29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)))(typescript@5.9.3) eslint-plugin-prettier: specifier: ^5.5.4 version: 5.5.4(eslint-config-prettier@9.1.2(eslint@9.38.0))(eslint@9.38.0)(prettier@3.6.2) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)) + version: 29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)) prettier: specifier: ^3.6.2 version: 3.6.2 @@ -192,10 +195,10 @@ importers: version: 7.1.4 ts-jest: specifier: ^29.4.5 - version: 29.4.5(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.6))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.5(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.6))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)))(typescript@5.9.3) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.23)(typescript@5.9.3) + version: 10.9.2(@types/node@20.19.31)(typescript@5.9.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -207,32 +210,32 @@ importers: dependencies: '@typespec/compiler': specifier: 'catalog:' - version: 1.9.0(@types/node@20.19.23) + version: 1.9.0(@types/node@20.19.31) '@typespec/http': specifier: 'catalog:' - version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) '@typespec/json-schema': specifier: 'catalog:' - version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) '@typespec/openapi': specifier: 'catalog:' - version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))) + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))) '@typespec/openapi3': specifier: 'catalog:' - version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)))(@typespec/json-schema@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)))(@typespec/openapi@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))))(@typespec/versioning@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23))) + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))(@typespec/json-schema@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))(@typespec/openapi@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))))(@typespec/versioning@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31))) '@typespec/rest': specifier: 'catalog:' - version: 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))) + version: 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))) '@typespec/versioning': specifier: 'catalog:' - version: 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) + version: 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) devDependencies: '@eslint/js': specifier: ^9.18.0 version: 9.38.0 '@types/node': - specifier: ^20.10.6 - version: 20.19.23 + specifier: 'catalog:' + version: 20.19.31 eslint: specifier: ^9.18.0 version: 9.38.0 @@ -273,8 +276,8 @@ importers: specifier: ^4.0.9 version: 4.0.9 '@types/node': - specifier: ^20.19.23 - version: 20.19.23 + specifier: 'catalog:' + version: 20.19.31 '@typescript-eslint/eslint-plugin': specifier: ^8.46.2 version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3) @@ -282,29 +285,29 @@ importers: specifier: ^8.46.2 version: 8.46.2(eslint@9.38.0)(typescript@5.9.3) '@typespec/compiler': - specifier: ^1.5.0 - version: 1.5.0(@types/node@20.19.23) + specifier: 'catalog:' + version: 1.9.0(@types/node@20.19.31) '@typespec/http': - specifier: ^1.5.0 - version: 1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)) + specifier: 'catalog:' + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) '@typespec/json-schema': - specifier: ^1.5.0 - version: 1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)) + specifier: 'catalog:' + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) '@typespec/openapi': - specifier: ^1.5.0 - version: 1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))) + specifier: 'catalog:' + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))) '@typespec/openapi3': - specifier: ^1.5.0 - version: 1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)))(@typespec/json-schema@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)))(@typespec/openapi@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))))(@typespec/versioning@0.75.0(@typespec/compiler@1.5.0(@types/node@20.19.23))) + specifier: 'catalog:' + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))(@typespec/json-schema@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))(@typespec/openapi@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))))(@typespec/versioning@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31))) '@typespec/rest': - specifier: ^0.75.0 - version: 0.75.0(@typespec/compiler@1.5.0(@types/node@20.19.23))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))) + specifier: 'catalog:' + version: 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))) '@typespec/versioning': - specifier: ^0.75.0 - version: 0.75.0(@typespec/compiler@1.5.0(@types/node@20.19.23)) + specifier: 'catalog:' + version: 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2)) ajv: specifier: ^8.17.1 version: 8.17.1 @@ -331,7 +334,7 @@ importers: version: 3.8.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.23)(typescript@5.9.3) + version: 10.9.2(@types/node@20.19.31)(typescript@5.9.3) tsx: specifier: ^4.21.0 version: 4.21.0 @@ -343,19 +346,16 @@ importers: version: 8.46.2(eslint@9.38.0)(typescript@5.9.3) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) website: dependencies: '@astrojs/react': specifier: ^4.4.2 - version: 4.4.2(@types/node@25.2.3)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.21.0)(yaml@2.8.2) + version: 4.4.2(@types/node@20.19.31)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.21.0)(yaml@2.8.2) '@astrojs/starlight': specifier: ^0.37.3 - version: 0.37.3(astro@5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) - '@common-grants/core': - specifier: 0.3.0-alpha.1 - version: 0.3.0-alpha.1(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/json-schema@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/openapi3@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/json-schema@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/openapi@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))))(@typespec/versioning@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))))(@typespec/rest@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))))(@typespec/versioning@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))) + version: 0.37.3(astro@5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) '@jsonforms/core': specifier: ^3.7.0 version: 3.7.0 @@ -376,7 +376,7 @@ importers: version: 8.17.1 astro: specifier: ^5.16.11 - version: 5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) js-yaml: specifier: ^4.1.1 version: 4.1.1 @@ -408,6 +408,9 @@ importers: '@astrojs/check': specifier: ^0.9.6 version: 0.9.6(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.9.3) + '@common-grants/core': + specifier: workspace:* + version: link:../lib/core '@eslint/js': specifier: ^9.39.2 version: 9.39.2 @@ -417,30 +420,33 @@ importers: '@types/js-yaml': specifier: ^4.0.9 version: 4.0.9 + '@types/node': + specifier: 'catalog:' + version: 20.19.31 '@types/swagger-ui-react': specifier: ^5.18.0 version: 5.18.0 '@typespec/compiler': - specifier: ~1.5.0 - version: 1.5.0(@types/node@25.2.3) + specifier: 'catalog:' + version: 1.9.0(@types/node@20.19.31) '@typespec/http': - specifier: ~1.5.0 - version: 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) + specifier: 'catalog:' + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) '@typespec/json-schema': - specifier: ~1.5.0 - version: 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) + specifier: 'catalog:' + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) '@typespec/openapi': - specifier: ~1.5.0 - version: 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))) + specifier: 'catalog:' + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))) '@typespec/openapi3': - specifier: ~1.5.0 - version: 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/json-schema@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/openapi@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))))(@typespec/versioning@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))) + specifier: 'catalog:' + version: 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))(@typespec/json-schema@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))(@typespec/openapi@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))))(@typespec/versioning@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31))) '@typespec/rest': - specifier: ~0.75.0 - version: 0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))) + specifier: 'catalog:' + version: 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))) '@typespec/versioning': - specifier: ~0.75.0 - version: 0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) + specifier: 'catalog:' + version: 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) cspell: specifier: ^8.19.4 version: 8.19.4 @@ -461,13 +467,13 @@ importers: version: 0.14.1 starlight-links-validator: specifier: ^0.14.3 - version: 0.14.3(@astrojs/starlight@0.37.3(astro@5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))) + version: 0.14.3(@astrojs/starlight@0.37.3(astro@5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))) typescript-eslint: specifier: ^8.53.1 version: 8.53.1(eslint@9.39.2)(typescript@5.9.3) vitest: specifier: ^4.0.17 - version: 4.0.17(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.17(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) wrangler: specifier: ^4.59.2 version: 4.59.2 @@ -482,10 +488,6 @@ packages: resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==} engines: {node: '>= 16'} - '@apidevtools/json-schema-ref-parser@14.0.1': - resolution: {integrity: sha512-Oc96zvmxx1fqoSEdUmfmvvb59/KDOnUoJ7s2t7bISyAn0XEz57LCCw8k2Y4Pf3mwKaZLMciESALORLgfe2frCw==} - engines: {node: '>= 16'} - '@apidevtools/openapi-schemas@2.1.0': resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} engines: {node: '>=10'} @@ -498,11 +500,6 @@ packages: peerDependencies: openapi-types: '>=7' - '@apidevtools/swagger-parser@12.0.0': - resolution: {integrity: sha512-WLJIWcfOXrSKlZEM+yhA2Xzatgl488qr1FoOxixYmtWapBzwSC0gVGq4WObr4hHClMIiFFdOBdixNkvWqkWIWA==} - peerDependencies: - openapi-types: '>=7' - '@astrojs/check@0.9.6': resolution: {integrity: sha512-jlaEu5SxvSgmfGIFfNgcn5/f+29H61NJzEMfAZ82Xopr4XBchXB1GVlcJsE+elUlsYSbXlptZLX+JMG3b/wZEA==} hasBin: true @@ -564,10 +561,6 @@ packages: '@astrojs/yaml2ts@0.2.2': resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.28.6': resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} engines: {node: '>=6.9.0'} @@ -882,16 +875,6 @@ packages: cpu: [x64] os: [win32] - '@common-grants/core@0.3.0-alpha.1': - resolution: {integrity: sha512-mPmuRI0YuNMmJAIYs6e9jF42o8Ug56zx/fcL3dv1Pv/+0XTxs1cyzkwXwhYSct/4C9ndItzR95assWOXUsTWRQ==} - peerDependencies: - '@typespec/compiler': ^1.1.0 - '@typespec/http': ^1.1.0 - '@typespec/json-schema': 1.0.0 - '@typespec/openapi3': 1.0.0 - '@typespec/rest': 0.70.0 - '@typespec/versioning': ^0.70.0 - '@cspell/cspell-bundled-dicts@8.19.4': resolution: {integrity: sha512-2ZRcZP/ncJ5q953o8i+R0fb8+14PDt5UefUNMrFZZHvfTI0jukAASOQeLY+WT6ASZv6CgbPrApAdbppy9FaXYQ==} engines: {node: '>=18'} @@ -1945,23 +1928,10 @@ packages: cpu: [x64] os: [win32] - '@inquirer/ansi@1.0.2': - resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} - engines: {node: '>=18'} - '@inquirer/ansi@2.0.3': resolution: {integrity: sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/checkbox@4.3.2': - resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/checkbox@5.0.4': resolution: {integrity: sha512-DrAMU3YBGMUAp6ArwTIp/25CNDtDbxk7UjIrrtM25JVVrlVYlVzHh5HR1BDFu9JMyUoZ4ZanzeaHqNDttf3gVg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -1971,15 +1941,6 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.21': - resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/confirm@6.0.4': resolution: {integrity: sha512-WdaPe7foUnoGYvXzH4jp4wH/3l+dBhZ3uwhKjXjwdrq5tEIFaANxj6zrGHxLdsIA0yKM0kFPVcEalOZXBB5ISA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -1989,15 +1950,6 @@ packages: '@types/node': optional: true - '@inquirer/core@10.3.2': - resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/core@11.1.1': resolution: {integrity: sha512-hV9o15UxX46OyQAtaoMqAOxGR8RVl1aZtDx1jHbCtSJy1tBdTfKxLPKf7utsE4cRy4tcmCQ4+vdV+ca+oNxqNA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2007,15 +1959,6 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.23': - resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/editor@5.0.4': resolution: {integrity: sha512-QI3Jfqcv6UO2/VJaEFONH8Im1ll++Xn/AJTBn9Xf+qx2M+H8KZAdQ5sAe2vtYlo+mLW+d7JaMJB4qWtK4BG3pw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2025,15 +1968,6 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.23': - resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/expand@5.0.4': resolution: {integrity: sha512-0I/16YwPPP0Co7a5MsomlZLpch48NzYfToyqYAOWtBmaXSB80RiNQ1J+0xx2eG+Wfxt0nHtpEWSRr6CzNVnOGg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2052,15 +1986,6 @@ packages: '@types/node': optional: true - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/external-editor@2.0.3': resolution: {integrity: sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2074,23 +1999,10 @@ packages: resolution: {integrity: sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==} engines: {node: '>=18'} - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} - '@inquirer/figures@2.0.3': resolution: {integrity: sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/input@4.3.1': - resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/input@5.0.4': resolution: {integrity: sha512-4B3s3jvTREDFvXWit92Yc6jF1RJMDy2VpSqKtm4We2oVU65YOh2szY5/G14h4fHlyQdpUmazU5MPCFZPRJ0AOw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2100,15 +2012,6 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.23': - resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/number@4.0.4': resolution: {integrity: sha512-CmMp9LF5HwE+G/xWsC333TlCzYYbXMkcADkKzcawh49fg2a1ryLc7JL1NJYYt1lJ+8f4slikNjJM9TEL/AljYQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2118,15 +2021,6 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.23': - resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/password@5.0.4': resolution: {integrity: sha512-ZCEPyVYvHK4W4p2Gy6sTp9nqsdHQCfiPXIP9LbJVW4yCinnxL/dDDmPaEZVysGrj8vxVReRnpfS2fOeODe9zjg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2136,15 +2030,6 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.10.1': - resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/prompts@8.2.0': resolution: {integrity: sha512-rqTzOprAj55a27jctS3vhvDDJzYXsr33WXTjODgVOru21NvBo9yIgLIAf7SBdSV0WERVly3dR6TWyp7ZHkvKFA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2154,15 +2039,6 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.1.11': - resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/rawlist@5.2.0': resolution: {integrity: sha512-CciqGoOUMrFo6HxvOtU5uL8fkjCmzyeB6fG7O1vdVAZVSopUBYECOwevDBlqNLyyYmzpm2Gsn/7nLrpruy9RFg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2172,15 +2048,6 @@ packages: '@types/node': optional: true - '@inquirer/search@3.2.2': - resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/search@4.1.0': resolution: {integrity: sha512-EAzemfiP4IFvIuWnrHpgZs9lAhWDA0GM3l9F4t4mTQ22IFtzfrk8xbkMLcAN7gmVML9O/i+Hzu8yOUyAaL6BKA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2190,15 +2057,6 @@ packages: '@types/node': optional: true - '@inquirer/select@4.4.2': - resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/select@5.0.4': resolution: {integrity: sha512-s8KoGpPYMEQ6WXc0dT9blX2NtIulMdLOO3LA1UKOiv7KFWzlJ6eLkEYTDBIi+JkyKXyn8t/CD6TinxGjyLt57g==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2208,15 +2066,6 @@ packages: '@types/node': optional: true - '@inquirer/type@3.0.10': - resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/type@4.0.3': resolution: {integrity: sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -2866,10 +2715,6 @@ packages: resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -3115,9 +2960,6 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@20.19.23': - resolution: {integrity: sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==} - '@types/node@20.19.31': resolution: {integrity: sha512-5jsi0wpncvTD33Sh1UCgacK37FFwDn+EG7wCmEvs62fCvBL+n8/76cAYDok21NF6+jaVWIqKwCZyX7Vbu8eB3A==} @@ -3319,38 +3161,17 @@ packages: resolution: {integrity: sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typespec/asset-emitter@0.75.0': - resolution: {integrity: sha512-Kh5FmTPPU2Vc7nNI3iijsyfybhCZhOvkPpDuGYLYT4nxKXQeTY6h1RNZDR/y4DDRhT7oioEvlPaN2JR2C6HaYw==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@typespec/compiler': ^1.5.0 - '@typespec/asset-emitter@0.79.0': resolution: {integrity: sha512-pNMtfSSwgmTQ2ex6bd1l6BUW2RLjSFnWQO5C5bNSleV62YEH5jMLn3THWDU9oUB0JoiBjgomV8cPqNRTJ+iV9w==} engines: {node: '>=20.0.0'} peerDependencies: '@typespec/compiler': ^1.9.0 - '@typespec/compiler@1.5.0': - resolution: {integrity: sha512-REJgZOEZ9g9CC72GGT0+nLbjW+5WVlCfm1d6w18N5RsUo7vLXs8IPXwq7xZJzoqU99Q9B4keqzPuTU4OrDUTrA==} - engines: {node: '>=20.0.0'} - hasBin: true - '@typespec/compiler@1.9.0': resolution: {integrity: sha512-Rz9fFWQSTJSnhBfZvtA/bDIuO82fknYdtyMsL9lZNJE82rquC6JByHPFsnbGH1VXA0HhMj9L7Oqyp3f0m/BTOA==} engines: {node: '>=20.0.0'} hasBin: true - '@typespec/http@1.5.0': - resolution: {integrity: sha512-52XLXwqSY2SY6nSvfkiTsNiJzlMeIAZ6MFIVJ5YkoibA21TNAP4DtjTZgC2GieZLY2NNN/rqDCqBX+DyWqTrfQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@typespec/compiler': ^1.5.0 - '@typespec/streams': ^0.75.0 - peerDependenciesMeta: - '@typespec/streams': - optional: true - '@typespec/http@1.9.0': resolution: {integrity: sha512-JzlZZsgCo71f2KhWbf4BLOz5e+dVLj7gJJ4kvXvrmuG9QHoT41VaGPpCQamYgpZLMz2LQbsOtw34AmpovhuJSw==} engines: {node: '>=20.0.0'} @@ -3361,37 +3182,12 @@ packages: '@typespec/streams': optional: true - '@typespec/json-schema@1.5.0': - resolution: {integrity: sha512-3RQlMSZM0SqrjKafxpIXa0SxPucPGHTRkJTB4JcDJxaTvBGNYZF0JFDC5CxkkDW4RfjA1Jb10aanBqOIgKbE9A==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@typespec/compiler': ^1.5.0 - '@typespec/json-schema@1.9.0': resolution: {integrity: sha512-splP6YL1CWPtBDenOeaVEs058TBqSzMDZyX4h9A39Q5qwmhyQ00DPXdnmJWRP96IWVAlHnN806GJWc/yttzSVg==} engines: {node: '>=20.0.0'} peerDependencies: '@typespec/compiler': ^1.9.0 - '@typespec/openapi3@1.5.0': - resolution: {integrity: sha512-Fu4RBk19a+Nma7N0LzP8DjwRcTc3zWCl/ne3R6m6l5Pc6jVN7EXGQNz68f3AOorWCuE+BxONViTN6og/pukXNw==} - engines: {node: '>=20.0.0'} - hasBin: true - peerDependencies: - '@typespec/compiler': ^1.5.0 - '@typespec/http': ^1.5.0 - '@typespec/json-schema': ^1.5.0 - '@typespec/openapi': ^1.5.0 - '@typespec/versioning': ^0.75.0 - '@typespec/xml': '*' - peerDependenciesMeta: - '@typespec/json-schema': - optional: true - '@typespec/versioning': - optional: true - '@typespec/xml': - optional: true - '@typespec/openapi3@1.9.0': resolution: {integrity: sha512-htwhrGHQxuoNwAljeJE8CBt5yfKOv48T9Ugv91Y+4yNnlevJfDT29yrfD2mXYMujVOr3Kte1qilazClafkUIgg==} engines: {node: '>=20.0.0'} @@ -3420,13 +3216,6 @@ packages: '@typespec/xml': optional: true - '@typespec/openapi@1.5.0': - resolution: {integrity: sha512-27sXkSK2r1sAmVMLv+pwlN/Cm+yg9nEK8iuGyJRuEkBk7hcsJDbTnBlsEvlRTI8DqljtzA7YECDHBLK88zZHeg==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@typespec/compiler': ^1.5.0 - '@typespec/http': ^1.5.0 - '@typespec/openapi@1.9.0': resolution: {integrity: sha512-5ieXCWRLcyFLv3IFk26ena/RW/NxvT5KiHaoNVFRd79J0XZjFcE0Od6Lxxqj4dWmCo3C8oKtOwFoQuie18G3lQ==} engines: {node: '>=20.0.0'} @@ -3437,13 +3226,6 @@ packages: '@typespec/prettier-plugin-typespec@1.5.0': resolution: {integrity: sha512-6tVu8u331LvwE7wi5HjSJosI4j8mJ9EuAdTbBHJk8vPzMCcz08ZwYhenLZ/38X58E1q7iWe2JGujwgpUSzUNDw==} - '@typespec/rest@0.75.0': - resolution: {integrity: sha512-rQ+RP0kcrKWjbpCIkBd8hpxYSNc3CfQxl0MLP1+MYGRHlHL8ss4xbwdANIYZXZZ2i2Hqt19B7cEUGD4MLoCHvw==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@typespec/compiler': ^1.5.0 - '@typespec/http': ^1.5.0 - '@typespec/rest@0.79.0': resolution: {integrity: sha512-6QIX7oaUGy/z4rseUrC86LjHxZn8rAAY4fXvGnlPRce6GhEdTb9S9OQPmlPeWngXwCx/07P2+FCR915APqmZxg==} engines: {node: '>=20.0.0'} @@ -3451,12 +3233,6 @@ packages: '@typespec/compiler': ^1.9.0 '@typespec/http': ^1.9.0 - '@typespec/versioning@0.75.0': - resolution: {integrity: sha512-wdLcVx5UW4WRks/OXfqLiaDTtWfAWgv/nj69u99gRJU6iY9ExEvK5x9NQszZQKYnu6tM7nkoYMg4zu+7YBUBaw==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@typespec/compiler': ^1.5.0 - '@typespec/versioning@0.79.0': resolution: {integrity: sha512-mk65zpKNm+ARyHASnre/lp3o3FKzb0P8Nj96ji182JUy7ShrVCCF0u+bC+ZXQ8ZTRza1d0xBjRC/Xr4iM+Uwag==} engines: {node: '>=20.0.0'} @@ -4834,10 +4610,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} - globby@16.1.0: resolution: {integrity: sha512-+A4Hq7m7Ze592k9gZRy4gJ27DrXRNnC1vPjxTt1qQxEY8RxagBkBxivkCwg7FxSTG0iLLEMaUx13oOr0R2/qcQ==} engines: {node: '>=20'} @@ -5777,10 +5549,6 @@ packages: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} - mute-stream@3.0.0: resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} engines: {node: ^20.17.0 || >=22.9.0} @@ -6028,10 +5796,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -6997,10 +6761,6 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - unicorn-magic@0.4.0: resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} engines: {node: '>=20'} @@ -7677,11 +7437,6 @@ snapshots: '@types/json-schema': 7.0.15 js-yaml: 4.1.1 - '@apidevtools/json-schema-ref-parser@14.0.1': - dependencies: - '@types/json-schema': 7.0.15 - js-yaml: 4.1.1 - '@apidevtools/openapi-schemas@2.1.0': {} '@apidevtools/swagger-methods@3.0.2': {} @@ -7697,16 +7452,6 @@ snapshots: call-me-maybe: 1.0.2 openapi-types: 12.1.3 - '@apidevtools/swagger-parser@12.0.0(openapi-types@12.1.3)': - dependencies: - '@apidevtools/json-schema-ref-parser': 14.0.1 - '@apidevtools/openapi-schemas': 2.1.0 - '@apidevtools/swagger-methods': 3.0.2 - ajv: 8.17.1 - ajv-draft-04: 1.0.0(ajv@8.17.1) - call-me-maybe: 1.0.2 - openapi-types: 12.1.3 - '@astrojs/check@0.9.6(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.9.3)': dependencies: '@astrojs/language-server': 2.16.3(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.9.3) @@ -7774,12 +7519,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.13(astro@5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))': + '@astrojs/mdx@4.3.13(astro@5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))': dependencies: '@astrojs/markdown-remark': 6.3.10 '@mdx-js/mdx': 3.1.1 acorn: 8.15.0 - astro: 5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + astro: 5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -7797,15 +7542,15 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/react@4.4.2(@types/node@25.2.3)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.21.0)(yaml@2.8.2)': + '@astrojs/react@4.4.2(@types/node@20.19.31)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.21.0)(yaml@2.8.2)': dependencies: '@types/react': 18.3.27 '@types/react-dom': 18.3.7(@types/react@18.3.27) - '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2)) + '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ultrahtml: 1.6.0 - vite: 6.4.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -7826,17 +7571,17 @@ snapshots: stream-replace-string: 2.0.0 zod: 3.25.76 - '@astrojs/starlight@0.37.3(astro@5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))': + '@astrojs/starlight@0.37.3(astro@5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))': dependencies: '@astrojs/markdown-remark': 6.3.10 - '@astrojs/mdx': 4.3.13(astro@5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) + '@astrojs/mdx': 4.3.13(astro@5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) '@astrojs/sitemap': 3.7.0 '@pagefind/default-ui': 1.4.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) - astro-expressive-code: 0.41.6(astro@5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) + astro: 5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + astro-expressive-code: 0.41.6(astro@5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.4 @@ -7876,12 +7621,6 @@ snapshots: dependencies: yaml: 2.8.2 - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/code-frame@7.28.6': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -8294,15 +8033,6 @@ snapshots: '@cloudflare/workerd-windows-64@1.20260114.0': optional: true - '@common-grants/core@0.3.0-alpha.1(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/json-schema@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/openapi3@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/json-schema@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/openapi@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))))(@typespec/versioning@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))))(@typespec/rest@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))))(@typespec/versioning@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))': - dependencies: - '@typespec/compiler': 1.5.0(@types/node@25.2.3) - '@typespec/http': 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) - '@typespec/json-schema': 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) - '@typespec/openapi3': 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/json-schema@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/openapi@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))))(@typespec/versioning@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))) - '@typespec/rest': 0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))) - '@typespec/versioning': 0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) - '@cspell/cspell-bundled-dicts@8.19.4': dependencies: '@cspell/dict-ada': 4.1.1 @@ -9074,386 +8804,140 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/ansi@1.0.2': {} - '@inquirer/ansi@2.0.3': {} - '@inquirer/checkbox@4.3.2(@types/node@20.19.23)': + '@inquirer/checkbox@5.0.4(@types/node@20.19.31)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@20.19.23) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.23) - yoctocolors-cjs: 2.1.3 + '@inquirer/ansi': 2.0.3 + '@inquirer/core': 11.1.1(@types/node@20.19.31) + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@20.19.31) optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.31 - '@inquirer/checkbox@4.3.2(@types/node@25.2.3)': + '@inquirer/confirm@6.0.4(@types/node@20.19.31)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.2.3) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.2.3) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.1.1(@types/node@20.19.31) + '@inquirer/type': 4.0.3(@types/node@20.19.31) optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 20.19.31 - '@inquirer/checkbox@5.0.4(@types/node@20.19.23)': + '@inquirer/core@11.1.1(@types/node@20.19.31)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.1(@types/node@20.19.23) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@20.19.23) + '@inquirer/type': 4.0.3(@types/node@20.19.31) + cli-width: 4.1.0 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + wrap-ansi: 9.0.2 optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.31 - '@inquirer/confirm@5.1.21(@types/node@20.19.23)': + '@inquirer/editor@5.0.4(@types/node@20.19.31)': dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.23) - '@inquirer/type': 3.0.10(@types/node@20.19.23) + '@inquirer/core': 11.1.1(@types/node@20.19.31) + '@inquirer/external-editor': 2.0.3(@types/node@20.19.31) + '@inquirer/type': 4.0.3(@types/node@20.19.31) optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.31 - '@inquirer/confirm@5.1.21(@types/node@25.2.3)': + '@inquirer/expand@5.0.4(@types/node@20.19.31)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.2.3) - '@inquirer/type': 3.0.10(@types/node@25.2.3) + '@inquirer/core': 11.1.1(@types/node@20.19.31) + '@inquirer/type': 4.0.3(@types/node@20.19.31) optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 20.19.31 - '@inquirer/confirm@6.0.4(@types/node@20.19.23)': + '@inquirer/external-editor@1.0.2(@types/node@20.19.31)': dependencies: - '@inquirer/core': 11.1.1(@types/node@20.19.23) - '@inquirer/type': 4.0.3(@types/node@20.19.23) + chardet: 2.1.0 + iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.31 - '@inquirer/core@10.3.2(@types/node@20.19.23)': + '@inquirer/external-editor@1.0.2(@types/node@25.2.3)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.23) - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 + chardet: 2.1.0 + iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 25.2.3 - '@inquirer/core@10.3.2(@types/node@25.2.3)': + '@inquirer/external-editor@2.0.3(@types/node@20.19.31)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.2.3) - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 + chardet: 2.1.1 + iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 20.19.31 + + '@inquirer/figures@1.0.14': {} + + '@inquirer/figures@2.0.3': {} - '@inquirer/core@11.1.1(@types/node@20.19.23)': + '@inquirer/input@5.0.4(@types/node@20.19.31)': dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@20.19.23) - cli-width: 4.1.0 - mute-stream: 3.0.0 - signal-exit: 4.1.0 - wrap-ansi: 9.0.2 + '@inquirer/core': 11.1.1(@types/node@20.19.31) + '@inquirer/type': 4.0.3(@types/node@20.19.31) optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.31 - '@inquirer/editor@4.2.23(@types/node@20.19.23)': + '@inquirer/number@4.0.4(@types/node@20.19.31)': dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.23) - '@inquirer/external-editor': 1.0.3(@types/node@20.19.23) - '@inquirer/type': 3.0.10(@types/node@20.19.23) + '@inquirer/core': 11.1.1(@types/node@20.19.31) + '@inquirer/type': 4.0.3(@types/node@20.19.31) optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.31 - '@inquirer/editor@4.2.23(@types/node@25.2.3)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@25.2.3) - '@inquirer/external-editor': 1.0.3(@types/node@25.2.3) - '@inquirer/type': 3.0.10(@types/node@25.2.3) - optionalDependencies: - '@types/node': 25.2.3 - - '@inquirer/editor@5.0.4(@types/node@20.19.23)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@20.19.23) - '@inquirer/external-editor': 2.0.3(@types/node@20.19.23) - '@inquirer/type': 4.0.3(@types/node@20.19.23) - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/expand@4.0.23(@types/node@20.19.23)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.23) - '@inquirer/type': 3.0.10(@types/node@20.19.23) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/expand@4.0.23(@types/node@25.2.3)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@25.2.3) - '@inquirer/type': 3.0.10(@types/node@25.2.3) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 25.2.3 - - '@inquirer/expand@5.0.4(@types/node@20.19.23)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@20.19.23) - '@inquirer/type': 4.0.3(@types/node@20.19.23) - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/external-editor@1.0.2(@types/node@20.19.23)': - dependencies: - chardet: 2.1.0 - iconv-lite: 0.7.0 - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/external-editor@1.0.2(@types/node@25.2.3)': - dependencies: - chardet: 2.1.0 - iconv-lite: 0.7.0 - optionalDependencies: - '@types/node': 25.2.3 - - '@inquirer/external-editor@1.0.3(@types/node@20.19.23)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/external-editor@1.0.3(@types/node@25.2.3)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 - optionalDependencies: - '@types/node': 25.2.3 - - '@inquirer/external-editor@2.0.3(@types/node@20.19.23)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/figures@1.0.14': {} - - '@inquirer/figures@1.0.15': {} - - '@inquirer/figures@2.0.3': {} - - '@inquirer/input@4.3.1(@types/node@20.19.23)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.23) - '@inquirer/type': 3.0.10(@types/node@20.19.23) - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/input@4.3.1(@types/node@25.2.3)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@25.2.3) - '@inquirer/type': 3.0.10(@types/node@25.2.3) - optionalDependencies: - '@types/node': 25.2.3 - - '@inquirer/input@5.0.4(@types/node@20.19.23)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@20.19.23) - '@inquirer/type': 4.0.3(@types/node@20.19.23) - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/number@3.0.23(@types/node@20.19.23)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.23) - '@inquirer/type': 3.0.10(@types/node@20.19.23) - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/number@3.0.23(@types/node@25.2.3)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@25.2.3) - '@inquirer/type': 3.0.10(@types/node@25.2.3) - optionalDependencies: - '@types/node': 25.2.3 - - '@inquirer/number@4.0.4(@types/node@20.19.23)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@20.19.23) - '@inquirer/type': 4.0.3(@types/node@20.19.23) - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/password@4.0.23(@types/node@20.19.23)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@20.19.23) - '@inquirer/type': 3.0.10(@types/node@20.19.23) - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/password@4.0.23(@types/node@25.2.3)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.2.3) - '@inquirer/type': 3.0.10(@types/node@25.2.3) - optionalDependencies: - '@types/node': 25.2.3 - - '@inquirer/password@5.0.4(@types/node@20.19.23)': + '@inquirer/password@5.0.4(@types/node@20.19.31)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.1(@types/node@20.19.23) - '@inquirer/type': 4.0.3(@types/node@20.19.23) - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/prompts@7.10.1(@types/node@20.19.23)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@20.19.23) - '@inquirer/confirm': 5.1.21(@types/node@20.19.23) - '@inquirer/editor': 4.2.23(@types/node@20.19.23) - '@inquirer/expand': 4.0.23(@types/node@20.19.23) - '@inquirer/input': 4.3.1(@types/node@20.19.23) - '@inquirer/number': 3.0.23(@types/node@20.19.23) - '@inquirer/password': 4.0.23(@types/node@20.19.23) - '@inquirer/rawlist': 4.1.11(@types/node@20.19.23) - '@inquirer/search': 3.2.2(@types/node@20.19.23) - '@inquirer/select': 4.4.2(@types/node@20.19.23) - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/prompts@7.10.1(@types/node@25.2.3)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@25.2.3) - '@inquirer/confirm': 5.1.21(@types/node@25.2.3) - '@inquirer/editor': 4.2.23(@types/node@25.2.3) - '@inquirer/expand': 4.0.23(@types/node@25.2.3) - '@inquirer/input': 4.3.1(@types/node@25.2.3) - '@inquirer/number': 3.0.23(@types/node@25.2.3) - '@inquirer/password': 4.0.23(@types/node@25.2.3) - '@inquirer/rawlist': 4.1.11(@types/node@25.2.3) - '@inquirer/search': 3.2.2(@types/node@25.2.3) - '@inquirer/select': 4.4.2(@types/node@25.2.3) - optionalDependencies: - '@types/node': 25.2.3 - - '@inquirer/prompts@8.2.0(@types/node@20.19.23)': - dependencies: - '@inquirer/checkbox': 5.0.4(@types/node@20.19.23) - '@inquirer/confirm': 6.0.4(@types/node@20.19.23) - '@inquirer/editor': 5.0.4(@types/node@20.19.23) - '@inquirer/expand': 5.0.4(@types/node@20.19.23) - '@inquirer/input': 5.0.4(@types/node@20.19.23) - '@inquirer/number': 4.0.4(@types/node@20.19.23) - '@inquirer/password': 5.0.4(@types/node@20.19.23) - '@inquirer/rawlist': 5.2.0(@types/node@20.19.23) - '@inquirer/search': 4.1.0(@types/node@20.19.23) - '@inquirer/select': 5.0.4(@types/node@20.19.23) - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/rawlist@4.1.11(@types/node@20.19.23)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.23) - '@inquirer/type': 3.0.10(@types/node@20.19.23) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/rawlist@4.1.11(@types/node@25.2.3)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@25.2.3) - '@inquirer/type': 3.0.10(@types/node@25.2.3) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.1.1(@types/node@20.19.31) + '@inquirer/type': 4.0.3(@types/node@20.19.31) optionalDependencies: - '@types/node': 25.2.3 - - '@inquirer/rawlist@5.2.0(@types/node@20.19.23)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@20.19.23) - '@inquirer/type': 4.0.3(@types/node@20.19.23) - optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.31 - '@inquirer/search@3.2.2(@types/node@20.19.23)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.23) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.23) - yoctocolors-cjs: 2.1.3 + '@inquirer/prompts@8.2.0(@types/node@20.19.31)': + dependencies: + '@inquirer/checkbox': 5.0.4(@types/node@20.19.31) + '@inquirer/confirm': 6.0.4(@types/node@20.19.31) + '@inquirer/editor': 5.0.4(@types/node@20.19.31) + '@inquirer/expand': 5.0.4(@types/node@20.19.31) + '@inquirer/input': 5.0.4(@types/node@20.19.31) + '@inquirer/number': 4.0.4(@types/node@20.19.31) + '@inquirer/password': 5.0.4(@types/node@20.19.31) + '@inquirer/rawlist': 5.2.0(@types/node@20.19.31) + '@inquirer/search': 4.1.0(@types/node@20.19.31) + '@inquirer/select': 5.0.4(@types/node@20.19.31) optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.31 - '@inquirer/search@3.2.2(@types/node@25.2.3)': + '@inquirer/rawlist@5.2.0(@types/node@20.19.31)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.2.3) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.2.3) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.1.1(@types/node@20.19.31) + '@inquirer/type': 4.0.3(@types/node@20.19.31) optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 20.19.31 - '@inquirer/search@4.1.0(@types/node@20.19.23)': + '@inquirer/search@4.1.0(@types/node@20.19.31)': dependencies: - '@inquirer/core': 11.1.1(@types/node@20.19.23) + '@inquirer/core': 11.1.1(@types/node@20.19.31) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@20.19.23) + '@inquirer/type': 4.0.3(@types/node@20.19.31) optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/select@4.4.2(@types/node@20.19.23)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@20.19.23) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.23) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/select@4.4.2(@types/node@25.2.3)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.2.3) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.2.3) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 20.19.31 - '@inquirer/select@5.0.4(@types/node@20.19.23)': + '@inquirer/select@5.0.4(@types/node@20.19.31)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.1(@types/node@20.19.23) + '@inquirer/core': 11.1.1(@types/node@20.19.31) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@20.19.23) + '@inquirer/type': 4.0.3(@types/node@20.19.31) optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/type@3.0.10(@types/node@20.19.23)': - optionalDependencies: - '@types/node': 20.19.23 - - '@inquirer/type@3.0.10(@types/node@25.2.3)': - optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 20.19.31 - '@inquirer/type@4.0.3(@types/node@20.19.23)': + '@inquirer/type@4.0.3(@types/node@20.19.31)': optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.31 '@isaacs/balanced-match@4.0.1': {} @@ -9478,27 +8962,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.31 + '@types/node': 25.2.3 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.31 + '@types/node': 25.2.3 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)) + jest-config: 29.7.0(@types/node@25.2.3)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -9523,7 +9007,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.31 + '@types/node': 25.2.3 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -9541,7 +9025,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.19.31 + '@types/node': 25.2.3 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -9563,7 +9047,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 20.19.31 + '@types/node': 25.2.3 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit: 0.1.2 @@ -9633,7 +9117,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.19.31 + '@types/node': 25.2.3 '@types/yargs': 17.0.34 chalk: 4.1.2 @@ -10089,8 +9573,6 @@ snapshots: '@sindresorhus/is@7.2.0': {} - '@sindresorhus/merge-streams@2.3.0': {} - '@sindresorhus/merge-streams@4.0.0': {} '@sinonjs/commons@3.0.1': @@ -10541,7 +10023,7 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.19.31 + '@types/node': 25.2.3 '@types/chai@5.2.3': dependencies: @@ -10550,7 +10032,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 20.19.31 + '@types/node': 25.2.3 '@types/cookiejar@2.1.5': {} @@ -10568,7 +10050,7 @@ snapshots: '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 20.19.31 + '@types/node': 25.2.3 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -10582,7 +10064,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.19.31 + '@types/node': 25.2.3 '@types/hast@3.0.4': dependencies: @@ -10638,10 +10120,6 @@ snapshots: '@types/node@17.0.45': {} - '@types/node@20.19.23': - dependencies: - undici-types: 6.21.0 - '@types/node@20.19.31': dependencies: undici-types: 6.21.0 @@ -10675,27 +10153,27 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 20.19.31 + '@types/node': 25.2.3 '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.19.31 + '@types/node': 25.2.3 '@types/send@1.2.1': dependencies: - '@types/node': 20.19.31 + '@types/node': 25.2.3 '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 20.19.31 + '@types/node': 25.2.3 '@types/send': 0.17.6 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 20.19.31 + '@types/node': 25.2.3 '@types/stack-utils@2.0.3': {} @@ -10703,7 +10181,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 20.19.31 + '@types/node': 25.2.3 form-data: 4.0.5 '@types/supertest@6.0.3': @@ -10722,7 +10200,7 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 20.19.31 + '@types/node': 25.2.3 '@types/trusted-types@2.0.7': optional: true @@ -10923,66 +10401,14 @@ snapshots: '@typescript-eslint/types': 8.53.1 eslint-visitor-keys: 4.2.1 - '@typespec/asset-emitter@0.75.0(@typespec/compiler@1.5.0(@types/node@20.19.23))': - dependencies: - '@typespec/compiler': 1.5.0(@types/node@20.19.23) - - '@typespec/asset-emitter@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))': - dependencies: - '@typespec/compiler': 1.5.0(@types/node@25.2.3) - - '@typespec/asset-emitter@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23))': - dependencies: - '@typespec/compiler': 1.9.0(@types/node@20.19.23) - - '@typespec/compiler@1.5.0(@types/node@20.19.23)': - dependencies: - '@babel/code-frame': 7.27.1 - '@inquirer/prompts': 7.10.1(@types/node@20.19.23) - ajv: 8.17.1 - change-case: 5.4.4 - env-paths: 3.0.0 - globby: 14.1.0 - is-unicode-supported: 2.1.0 - mustache: 4.2.0 - picocolors: 1.1.1 - prettier: 3.6.2 - semver: 7.7.3 - tar: 7.5.7 - temporal-polyfill: 0.3.0 - vscode-languageserver: 9.0.1 - vscode-languageserver-textdocument: 1.0.12 - yaml: 2.8.2 - yargs: 18.0.0 - transitivePeerDependencies: - - '@types/node' - - '@typespec/compiler@1.5.0(@types/node@25.2.3)': + '@typespec/asset-emitter@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31))': dependencies: - '@babel/code-frame': 7.27.1 - '@inquirer/prompts': 7.10.1(@types/node@25.2.3) - ajv: 8.17.1 - change-case: 5.4.4 - env-paths: 3.0.0 - globby: 14.1.0 - is-unicode-supported: 2.1.0 - mustache: 4.2.0 - picocolors: 1.1.1 - prettier: 3.6.2 - semver: 7.7.3 - tar: 7.5.7 - temporal-polyfill: 0.3.0 - vscode-languageserver: 9.0.1 - vscode-languageserver-textdocument: 1.0.12 - yaml: 2.8.2 - yargs: 18.0.0 - transitivePeerDependencies: - - '@types/node' + '@typespec/compiler': 1.9.0(@types/node@20.19.31) - '@typespec/compiler@1.9.0(@types/node@20.19.23)': + '@typespec/compiler@1.9.0(@types/node@20.19.31)': dependencies: '@babel/code-frame': 7.28.6 - '@inquirer/prompts': 8.2.0(@types/node@20.19.23) + '@inquirer/prompts': 8.2.0(@types/node@20.19.31) ajv: 8.17.1 change-case: 5.4.4 env-paths: 3.0.0 @@ -11001,125 +10427,51 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))': - dependencies: - '@typespec/compiler': 1.5.0(@types/node@20.19.23) - - '@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))': + '@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))': dependencies: - '@typespec/compiler': 1.5.0(@types/node@25.2.3) - - '@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))': - dependencies: - '@typespec/compiler': 1.9.0(@types/node@20.19.23) - - '@typespec/json-schema@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))': - dependencies: - '@typespec/asset-emitter': 0.75.0(@typespec/compiler@1.5.0(@types/node@20.19.23)) - '@typespec/compiler': 1.5.0(@types/node@20.19.23) - yaml: 2.8.2 - - '@typespec/json-schema@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))': - dependencies: - '@typespec/asset-emitter': 0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) - '@typespec/compiler': 1.5.0(@types/node@25.2.3) - yaml: 2.8.2 - - '@typespec/json-schema@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))': - dependencies: - '@typespec/asset-emitter': 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) - '@typespec/compiler': 1.9.0(@types/node@20.19.23) - yaml: 2.8.2 - - '@typespec/openapi3@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)))(@typespec/json-schema@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)))(@typespec/openapi@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))))(@typespec/versioning@0.75.0(@typespec/compiler@1.5.0(@types/node@20.19.23)))': - dependencies: - '@apidevtools/swagger-parser': 12.0.0(openapi-types@12.1.3) - '@typespec/asset-emitter': 0.75.0(@typespec/compiler@1.5.0(@types/node@20.19.23)) - '@typespec/compiler': 1.5.0(@types/node@20.19.23) - '@typespec/http': 1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)) - '@typespec/openapi': 1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))) - openapi-types: 12.1.3 - yaml: 2.8.2 - optionalDependencies: - '@typespec/json-schema': 1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)) - '@typespec/versioning': 0.75.0(@typespec/compiler@1.5.0(@types/node@20.19.23)) + '@typespec/compiler': 1.9.0(@types/node@20.19.31) - '@typespec/openapi3@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/json-schema@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))(@typespec/openapi@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))))(@typespec/versioning@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))': + '@typespec/json-schema@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))': dependencies: - '@apidevtools/swagger-parser': 12.0.0(openapi-types@12.1.3) - '@typespec/asset-emitter': 0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) - '@typespec/compiler': 1.5.0(@types/node@25.2.3) - '@typespec/http': 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) - '@typespec/openapi': 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))) - openapi-types: 12.1.3 + '@typespec/asset-emitter': 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) + '@typespec/compiler': 1.9.0(@types/node@20.19.31) yaml: 2.8.2 - optionalDependencies: - '@typespec/json-schema': 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) - '@typespec/versioning': 0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) - '@typespec/openapi3@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)))(@typespec/json-schema@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)))(@typespec/openapi@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))))(@typespec/versioning@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23)))': + '@typespec/openapi3@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))(@typespec/json-schema@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))(@typespec/openapi@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))))(@typespec/versioning@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))': dependencies: '@scalar/json-magic': 0.9.6 '@scalar/openapi-parser': 0.24.9 '@scalar/openapi-types': 0.5.3 - '@typespec/asset-emitter': 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) - '@typespec/compiler': 1.9.0(@types/node@20.19.23) - '@typespec/http': 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) - '@typespec/openapi': 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))) + '@typespec/asset-emitter': 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) + '@typespec/compiler': 1.9.0(@types/node@20.19.31) + '@typespec/http': 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) + '@typespec/openapi': 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))) yaml: 2.8.2 optionalDependencies: - '@typespec/json-schema': 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) - '@typespec/versioning': 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) + '@typespec/json-schema': 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) + '@typespec/versioning': 0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) - '@typespec/openapi@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)))': + '@typespec/openapi@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))': dependencies: - '@typespec/compiler': 1.5.0(@types/node@20.19.23) - '@typespec/http': 1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)) - - '@typespec/openapi@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))': - dependencies: - '@typespec/compiler': 1.5.0(@types/node@25.2.3) - '@typespec/http': 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) - - '@typespec/openapi@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)))': - dependencies: - '@typespec/compiler': 1.9.0(@types/node@20.19.23) - '@typespec/http': 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) + '@typespec/compiler': 1.9.0(@types/node@20.19.31) + '@typespec/http': 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) '@typespec/prettier-plugin-typespec@1.5.0': dependencies: prettier: 3.6.2 - '@typespec/rest@0.75.0(@typespec/compiler@1.5.0(@types/node@20.19.23))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)))': - dependencies: - '@typespec/compiler': 1.5.0(@types/node@20.19.23) - '@typespec/http': 1.5.0(@typespec/compiler@1.5.0(@types/node@20.19.23)) - - '@typespec/rest@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))(@typespec/http@1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)))': - dependencies: - '@typespec/compiler': 1.5.0(@types/node@25.2.3) - '@typespec/http': 1.5.0(@typespec/compiler@1.5.0(@types/node@25.2.3)) - - '@typespec/rest@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)))': + '@typespec/rest@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31))(@typespec/http@1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)))': dependencies: - '@typespec/compiler': 1.9.0(@types/node@20.19.23) - '@typespec/http': 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.23)) + '@typespec/compiler': 1.9.0(@types/node@20.19.31) + '@typespec/http': 1.9.0(@typespec/compiler@1.9.0(@types/node@20.19.31)) - '@typespec/versioning@0.75.0(@typespec/compiler@1.5.0(@types/node@20.19.23))': + '@typespec/versioning@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.31))': dependencies: - '@typespec/compiler': 1.5.0(@types/node@20.19.23) - - '@typespec/versioning@0.75.0(@typespec/compiler@1.5.0(@types/node@25.2.3))': - dependencies: - '@typespec/compiler': 1.5.0(@types/node@25.2.3) - - '@typespec/versioning@0.79.0(@typespec/compiler@1.9.0(@types/node@20.19.23))': - dependencies: - '@typespec/compiler': 1.9.0(@types/node@20.19.23) + '@typespec/compiler': 1.9.0(@types/node@20.19.31) '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.6 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) @@ -11127,11 +10479,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -11146,7 +10498,7 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -11167,29 +10519,21 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.12(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.1.12(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.1.12(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) - - '@vitest/mocker@4.0.17(vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.17(vite@7.3.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.17 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -11408,12 +10752,12 @@ snapshots: transitivePeerDependencies: - supports-color - astro-expressive-code@0.41.6(astro@5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)): + astro-expressive-code@0.41.6(astro@5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)): dependencies: - astro: 5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + astro: 5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) rehype-expressive-code: 0.41.6 - astro@5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): + astro@5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -11470,8 +10814,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.17.4 vfile: 6.0.3 - vite: 6.4.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2)) + vite: 6.4.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -11904,13 +11248,13 @@ snapshots: core-util-is@1.0.3: {} - create-jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)): + create-jest@29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)) + jest-config: 29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -12350,13 +11694,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jest@29.0.1(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)))(typescript@5.9.3): + eslint-plugin-jest@29.0.1(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(jest@29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) eslint: 9.38.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3) - jest: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)) + jest: 29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)) transitivePeerDependencies: - supports-color - typescript @@ -12837,15 +12181,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globby@14.1.0: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.3 - ignore: 7.0.5 - path-type: 6.0.0 - slash: 5.1.0 - unicorn-magic: 0.3.0 - globby@16.1.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 @@ -13162,9 +12497,9 @@ snapshots: inline-style-parser@0.2.7: {} - inquirer@9.3.8(@types/node@20.19.23): + inquirer@9.3.8(@types/node@20.19.31): dependencies: - '@inquirer/external-editor': 1.0.2(@types/node@20.19.23) + '@inquirer/external-editor': 1.0.2(@types/node@20.19.31) '@inquirer/figures': 1.0.14 ansi-escapes: 4.3.2 cli-width: 4.1.0 @@ -13319,7 +12654,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.31 + '@types/node': 25.2.3 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.0 @@ -13339,16 +12674,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)): + jest-cli@29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)) + create-jest: 29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)) + jest-config: 29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -13358,7 +12693,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)): + jest-config@29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.6 '@jest/test-sequencer': 29.7.0 @@ -13383,13 +12718,13 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.19.23 - ts-node: 10.9.2(@types/node@20.19.23)(typescript@5.9.3) + '@types/node': 20.19.31 + ts-node: 10.9.2(@types/node@20.19.31)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)): + jest-config@29.7.0(@types/node@25.2.3)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.6 '@jest/test-sequencer': 29.7.0 @@ -13414,8 +12749,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.19.31 - ts-node: 10.9.2(@types/node@20.19.23)(typescript@5.9.3) + '@types/node': 25.2.3 + ts-node: 10.9.2(@types/node@20.19.31)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -13444,7 +12779,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.31 + '@types/node': 25.2.3 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -13454,7 +12789,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.19.31 + '@types/node': 25.2.3 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -13493,7 +12828,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.31 + '@types/node': 25.2.3 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -13528,7 +12863,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.31 + '@types/node': 25.2.3 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -13556,7 +12891,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.31 + '@types/node': 25.2.3 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.3 @@ -13602,7 +12937,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.31 + '@types/node': 25.2.3 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -13621,7 +12956,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.31 + '@types/node': 25.2.3 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -13630,17 +12965,17 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.19.31 + '@types/node': 25.2.3 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)): + jest@29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)) + jest-cli: 29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -14363,8 +13698,6 @@ snapshots: mute-stream@1.0.0: {} - mute-stream@2.0.0: {} - mute-stream@3.0.0: {} nanoid@3.3.11: {} @@ -14606,8 +13939,6 @@ snapshots: path-type@4.0.0: {} - path-type@6.0.0: {} - pathe@2.0.3: {} pathval@2.0.1: {} @@ -15375,9 +14706,9 @@ snapshots: stackback@0.0.2: {} - starlight-links-validator@0.14.3(@astrojs/starlight@0.37.3(astro@5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))): + starlight-links-validator@0.14.3(@astrojs/starlight@0.37.3(astro@5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))): dependencies: - '@astrojs/starlight': 0.37.3(astro@5.16.11(@types/node@25.2.3)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) + '@astrojs/starlight': 0.37.3(astro@5.16.11(@types/node@20.19.31)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) '@types/picomatch': 3.0.2 github-slugger: 2.0.0 hast-util-from-html: 2.0.3 @@ -15675,12 +15006,12 @@ snapshots: dependencies: typescript: 5.9.3 - ts-jest@29.4.5(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.6))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.5(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.6))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3)) + jest: 29.7.0(@types/node@20.19.31)(ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -15697,14 +15028,14 @@ snapshots: ts-mixer@6.0.4: {} - ts-node@10.9.2(@types/node@20.19.23)(typescript@5.9.3): + ts-node@10.9.2(@types/node@20.19.31)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.23 + '@types/node': 20.19.31 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -15806,8 +15137,6 @@ snapshots: dependencies: pathe: 2.0.3 - unicorn-magic@0.3.0: {} - unicorn-magic@0.4.0: {} unified@11.0.5: @@ -15952,13 +15281,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2): + vite-node@3.2.4(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.12(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.1.12(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -15973,28 +15302,7 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.1.12(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite@6.4.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -16003,26 +15311,12 @@ snapshots: rollup: 4.55.2 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.2.3 - fsevents: 2.3.3 - tsx: 4.21.0 - yaml: 2.8.2 - - vite@7.1.12(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.52.5 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.31 fsevents: 2.3.3 tsx: 4.21.0 yaml: 2.8.2 - vite@7.1.12(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2): + vite@7.1.12(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -16031,12 +15325,12 @@ snapshots: rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 20.19.31 fsevents: 2.3.3 tsx: 4.21.0 yaml: 2.8.2 - vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -16045,20 +15339,20 @@ snapshots: rollup: 4.55.2 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 20.19.31 fsevents: 2.3.3 tsx: 4.21.0 yaml: 2.8.2 - vitefu@1.1.1(vite@6.4.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2)): + vitefu@1.1.1(vite@6.4.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2)): optionalDependencies: - vite: 6.4.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -16076,54 +15370,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.12(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@20.19.23)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.1.12(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 20.19.23 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3 - expect-type: 1.2.2 - magic-string: 0.30.19 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.1.12(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 25.2.3 + '@types/node': 20.19.31 transitivePeerDependencies: - jiti - less @@ -16138,10 +15390,10 @@ snapshots: - tsx - yaml - vitest@4.0.17(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.17(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.17 - '@vitest/mocker': 4.0.17(vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.17(vite@7.3.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.17 '@vitest/runner': 4.0.17 '@vitest/snapshot': 4.0.17 @@ -16158,10 +15410,10 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@20.19.31)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 20.19.31 transitivePeerDependencies: - jiti - less diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index aa6cdea7e..50e71256f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -19,6 +19,7 @@ overrides: undici@>=7.0.0 <7.18.2: ">=7.18.2" catalog: + "@types/node": ^20.19.23 "@typespec/compiler": ^1.9.0 "@typespec/http": ^1.9.0 "@typespec/json-schema": ^1.9.0 diff --git a/templates/express-js/package.json b/templates/express-js/package.json index f555a9717..774c01245 100644 --- a/templates/express-js/package.json +++ b/templates/express-js/package.json @@ -40,7 +40,7 @@ "@types/cors": "^2.8.19", "@types/express": "^4.17.25", "@types/js-yaml": "^4.0.9", - "@types/node": "^20.19.30", + "@types/node": "catalog:", "@types/supertest": "^6.0.3", "@types/swagger-ui-express": "^4.1.8", "@types/uuid": "^10.0.0", diff --git a/website/package.json b/website/package.json index 07bd6d062..6b7cc6aa7 100644 --- a/website/package.json +++ b/website/package.json @@ -34,7 +34,6 @@ "dependencies": { "@astrojs/react": "^4.4.2", "@astrojs/starlight": "^0.37.3", - "@common-grants/core": "0.3.0-alpha.1", "@jsonforms/core": "^3.7.0", "@jsonforms/react": "^3.7.0", "@jsonforms/vanilla-renderers": "^3.7.0", @@ -54,17 +53,19 @@ }, "devDependencies": { "@astrojs/check": "^0.9.6", + "@common-grants/core": "workspace:*", "@eslint/js": "^9.39.2", "@types/ajv": "^0.0.5", + "@types/node": "catalog:", "@types/js-yaml": "^4.0.9", "@types/swagger-ui-react": "^5.18.0", - "@typespec/compiler": "~1.5.0", - "@typespec/http": "~1.5.0", - "@typespec/json-schema": "~1.5.0", - "@typespec/openapi": "~1.5.0", - "@typespec/openapi3": "~1.5.0", - "@typespec/rest": "~0.75.0", - "@typespec/versioning": "~0.75.0", + "@typespec/compiler": "catalog:", + "@typespec/http": "catalog:", + "@typespec/json-schema": "catalog:", + "@typespec/openapi": "catalog:", + "@typespec/openapi3": "catalog:", + "@typespec/rest": "catalog:", + "@typespec/versioning": "catalog:", "cspell": "^8.19.4", "eslint": "^9.39.2", "eslint-plugin-astro": "^1.5.0", From a84d8b44127a603b0ceb407d556a02a8e14e159c Mon Sep 17 00:00:00 2001 From: widal001 Date: Wed, 11 Feb 2026 21:19:44 -0500 Subject: [PATCH 05/22] refactor(website): Updates auto-generated docs The switch to the latest @typespec/compiler version improved how the example values were generated --- website/public/openapi/openapi.0.1.0.yaml | 40 +++- website/public/openapi/openapi.0.2.0.yaml | 206 ++++++++++++----- website/public/openapi/openapi.0.3.0.yaml | 208 +++++++++++++----- .../public/schemas/yaml/CompetitionBase.yaml | 48 ++-- .../public/schemas/yaml/CompetitionForms.yaml | 48 ++-- website/public/schemas/yaml/FormBase.yaml | 24 +- .../public/schemas/yaml/MappingSchema.yaml | 54 +++-- 7 files changed, 458 insertions(+), 170 deletions(-) diff --git a/website/public/openapi/openapi.0.1.0.yaml b/website/public/openapi/openapi.0.1.0.yaml index 6599210b0..1ad9dc535 100644 --- a/website/public/openapi/openapi.0.1.0.yaml +++ b/website/public/openapi/openapi.0.1.0.yaml @@ -820,13 +820,41 @@ components: Examples might include a deadline for questions, anticipated award date, etc. description: Key dates and events in the opportunity's timeline, such as when the opportunity is posted and closes example: - postDate: {} - closeDate: {} + postDate: + name: Application posted date + eventType: singleDate + date: '2024-01-15' + description: Opportunity is posted publicly + closeDate: + name: Opportunity close date + eventType: singleDate + date: '2024-12-31' + time: '17:00:00' + description: Opportunity closes for all applications otherDates: - anticipatedAward: {} - applicationPeriod: {} - performancePeriod: {} - infoSessions: {} + anticipatedAward: + name: Anticipated award date + eventType: singleDate + date: '2025-03-15' + description: When we expect to announce awards for this opportunity. + applicationPeriod: + name: Application period + eventType: dateRange + startDate: '2024-01-01' + endDate: '2024-01-31' + endTime: '17:00:00' + description: Primary application period for the grant opportunity + performancePeriod: + name: Period of Performance + eventType: dateRange + startDate: '2024-01-01' + endDate: '2024-12-31' + description: Period of performance for the grant + infoSessions: + name: Info sessions + eventType: other + details: Every other Tuesday + description: Info sessions for the opportunity CommonGrants.Models.OpportunityBase: type: object required: diff --git a/website/public/openapi/openapi.0.2.0.yaml b/website/public/openapi/openapi.0.2.0.yaml index 1cac7e3b6..0bce880d5 100644 --- a/website/public/openapi/openapi.0.2.0.yaml +++ b/website/public/openapi/openapi.0.2.0.yaml @@ -1277,10 +1277,20 @@ components: customValue: custom description: Competition is open for applications keyDates: - openDate: {} - closeDate: {} + openDate: + name: Open Date + eventType: singleDate + date: '2025-01-01' + closeDate: + name: Close Date + eventType: singleDate + date: '2025-01-30' otherDates: - reviewPeriod: {} + reviewPeriod: + name: Application Review Period + eventType: dateRange + startDate: '2025-02-01' + endDate: '2025-02-28' forms: forms: formA: @@ -1317,18 +1327,26 @@ components: scope: '#/properties/phone' mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: '2025-01-01T17:01:01' lastModifiedAt: '2025-01-02T17:30:00' formB: @@ -1365,18 +1383,26 @@ components: scope: '#/properties/phone' mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: '2025-01-01T17:01:01' lastModifiedAt: '2025-01-02T17:30:00' validation: @@ -1436,18 +1462,26 @@ components: scope: '#/properties/phone' mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: '2025-01-01T17:01:01' lastModifiedAt: '2025-01-02T17:30:00' formB: @@ -1484,18 +1518,26 @@ components: scope: '#/properties/phone' mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: '2025-01-01T17:01:01' lastModifiedAt: '2025-01-02T17:30:00' validation: @@ -1550,10 +1592,20 @@ components: $ref: '#/components/schemas/CommonGrants.Fields.Event' description: The date the competition was created example: - openDate: {} - closeDate: {} + openDate: + name: Open Date + eventType: singleDate + date: '2025-01-01' + closeDate: + name: Close Date + eventType: singleDate + date: '2025-01-30' otherDates: - reviewPeriod: {} + reviewPeriod: + name: Application Review Period + eventType: dateRange + startDate: '2025-02-01' + endDate: '2025-02-28' CommonGrants.Models.Form: type: object required: @@ -1645,18 +1697,26 @@ components: scope: '#/properties/phone' mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: '2025-01-01T17:01:01' lastModifiedAt: '2025-01-02T17:30:00' CommonGrants.Models.FormJsonSchema: @@ -1807,10 +1867,18 @@ components: } ``` example: - id: {} + id: + const: '123' opportunity: - status: {} - amount: {} + status: + switch: + field: summary.opportunity_status + case: + active: open + inactive: closed + default: custom + amount: + field: summary.opportunity_amount CommonGrants.Models.MappingSwitchFunction: type: object required: @@ -2113,13 +2181,41 @@ components: Examples might include a deadline for questions, anticipated award date, etc. description: Key dates and events in the opportunity's timeline, such as when the opportunity is posted and closes example: - postDate: {} - closeDate: {} + postDate: + name: Application posted date + eventType: singleDate + date: '2024-01-15' + description: Opportunity is posted publicly + closeDate: + name: Opportunity close date + eventType: singleDate + date: '2024-12-31' + time: '17:00:00' + description: Opportunity closes for all applications otherDates: - anticipatedAward: {} - applicationPeriod: {} - performancePeriod: {} - infoSessions: {} + anticipatedAward: + name: Anticipated award date + eventType: singleDate + date: '2025-03-15' + description: When we expect to announce awards for this opportunity. + applicationPeriod: + name: Application period + eventType: dateRange + startDate: '2024-01-01' + endDate: '2024-01-31' + endTime: '17:00:00' + description: Primary application period for the grant opportunity + performancePeriod: + name: Period of Performance + eventType: dateRange + startDate: '2024-01-01' + endDate: '2024-12-31' + description: Period of performance for the grant + infoSessions: + name: Info sessions + eventType: other + details: Every other Tuesday + description: Info sessions for the opportunity CommonGrants.Models.OpportunityBase: type: object required: diff --git a/website/public/openapi/openapi.0.3.0.yaml b/website/public/openapi/openapi.0.3.0.yaml index 34d9b3dfb..c6b1b8007 100644 --- a/website/public/openapi/openapi.0.3.0.yaml +++ b/website/public/openapi/openapi.0.3.0.yaml @@ -26,7 +26,7 @@ tags: description: Endpoints that MAY be implemented by CommonGrants APIs, but are not guaranteed to be stable paths: /common-grants/applications/search: - get: + post: operationId: Applications_searchApplications summary: Search applications description: 'Search for applications. Note: The search results for a given query will depend on the scopes attached to the API token used to make the request.' @@ -1467,10 +1467,20 @@ components: customValue: custom description: Competition is open for applications keyDates: - openDate: {} - closeDate: {} + openDate: + name: Open Date + eventType: singleDate + date: '2025-01-01' + closeDate: + name: Close Date + eventType: singleDate + date: '2025-01-30' otherDates: - reviewPeriod: {} + reviewPeriod: + name: Application Review Period + eventType: dateRange + startDate: '2025-02-01' + endDate: '2025-02-28' forms: forms: formA: @@ -1507,18 +1517,26 @@ components: scope: '#/properties/phone' mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: '2025-01-01T17:01:01' lastModifiedAt: '2025-01-02T17:30:00' formB: @@ -1555,18 +1573,26 @@ components: scope: '#/properties/phone' mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: '2025-01-01T17:01:01' lastModifiedAt: '2025-01-02T17:30:00' validation: @@ -1626,18 +1652,26 @@ components: scope: '#/properties/phone' mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: '2025-01-01T17:01:01' lastModifiedAt: '2025-01-02T17:30:00' formB: @@ -1674,18 +1708,26 @@ components: scope: '#/properties/phone' mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: '2025-01-01T17:01:01' lastModifiedAt: '2025-01-02T17:30:00' validation: @@ -1740,10 +1782,20 @@ components: $ref: '#/components/schemas/CommonGrants.Fields.Event' description: The date the competition was created example: - openDate: {} - closeDate: {} + openDate: + name: Open Date + eventType: singleDate + date: '2025-01-01' + closeDate: + name: Close Date + eventType: singleDate + date: '2025-01-30' otherDates: - reviewPeriod: {} + reviewPeriod: + name: Application Review Period + eventType: dateRange + startDate: '2025-02-01' + endDate: '2025-02-28' CommonGrants.Models.FormBase: type: object required: @@ -1837,18 +1889,26 @@ components: scope: '#/properties/phone' mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: '2025-01-01T17:01:01' lastModifiedAt: '2025-01-02T17:30:00' CommonGrants.Models.FormJsonSchema: @@ -1999,10 +2059,18 @@ components: } ``` example: - id: {} + id: + const: '123' opportunity: - status: {} - amount: {} + status: + switch: + field: summary.opportunity_status + case: + active: open + inactive: closed + default: custom + amount: + field: summary.opportunity_amount CommonGrants.Models.MappingSwitchFunction: type: object required: @@ -2305,13 +2373,41 @@ components: Examples might include a deadline for questions, anticipated award date, etc. description: Key dates and events in the opportunity's timeline, such as when the opportunity is posted and closes example: - postDate: {} - closeDate: {} + postDate: + name: Application posted date + eventType: singleDate + date: '2024-01-15' + description: Opportunity is posted publicly + closeDate: + name: Opportunity close date + eventType: singleDate + date: '2024-12-31' + time: '17:00:00' + description: Opportunity closes for all applications otherDates: - anticipatedAward: {} - applicationPeriod: {} - performancePeriod: {} - infoSessions: {} + anticipatedAward: + name: Anticipated award date + eventType: singleDate + date: '2025-03-15' + description: When we expect to announce awards for this opportunity. + applicationPeriod: + name: Application period + eventType: dateRange + startDate: '2024-01-01' + endDate: '2024-01-31' + endTime: '17:00:00' + description: Primary application period for the grant opportunity + performancePeriod: + name: Period of Performance + eventType: dateRange + startDate: '2024-01-01' + endDate: '2024-12-31' + description: Period of performance for the grant + infoSessions: + name: Info sessions + eventType: other + details: Every other Tuesday + description: Info sessions for the opportunity CommonGrants.Models.OpportunityBase: type: object required: diff --git a/website/public/schemas/yaml/CompetitionBase.yaml b/website/public/schemas/yaml/CompetitionBase.yaml index d684a951e..89f408279 100644 --- a/website/public/schemas/yaml/CompetitionBase.yaml +++ b/website/public/schemas/yaml/CompetitionBase.yaml @@ -117,18 +117,26 @@ examples: scope: "#/properties/phone" mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: 2025-01-01T17:01:01 lastModifiedAt: 2025-01-02T17:30:00 formB: @@ -165,18 +173,26 @@ examples: scope: "#/properties/phone" mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: 2025-01-01T17:01:01 lastModifiedAt: 2025-01-02T17:30:00 validation: diff --git a/website/public/schemas/yaml/CompetitionForms.yaml b/website/public/schemas/yaml/CompetitionForms.yaml index 54d2573f3..4eb395864 100644 --- a/website/public/schemas/yaml/CompetitionForms.yaml +++ b/website/public/schemas/yaml/CompetitionForms.yaml @@ -48,18 +48,26 @@ examples: scope: "#/properties/phone" mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: 2025-01-01T17:01:01 lastModifiedAt: 2025-01-02T17:30:00 formB: @@ -96,18 +104,26 @@ examples: scope: "#/properties/phone" mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: 2025-01-01T17:01:01 lastModifiedAt: 2025-01-02T17:30:00 validation: diff --git a/website/public/schemas/yaml/FormBase.yaml b/website/public/schemas/yaml/FormBase.yaml index 3f962d1ff..50da8910d 100644 --- a/website/public/schemas/yaml/FormBase.yaml +++ b/website/public/schemas/yaml/FormBase.yaml @@ -84,18 +84,26 @@ examples: scope: "#/properties/phone" mappingToCommonGrants: name: - firstName: {} - lastName: {} + firstName: + field: name.first + lastName: + field: name.last emails: - primary: {} + primary: + field: email phones: - primary: {} + primary: + field: phone mappingFromCommonGrants: name: - first: {} - last: {} - email: {} - phone: {} + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary createdAt: 2025-01-01T17:01:01 lastModifiedAt: 2025-01-02T17:30:00 description: A form for collecting data from a user. diff --git a/website/public/schemas/yaml/MappingSchema.yaml b/website/public/schemas/yaml/MappingSchema.yaml index d56aee301..eed24b483 100644 --- a/website/public/schemas/yaml/MappingSchema.yaml +++ b/website/public/schemas/yaml/MappingSchema.yaml @@ -7,22 +7,50 @@ unevaluatedProperties: - $ref: MappingFunction.yaml - $ref: MappingSchema.yaml examples: - - id: {} + - id: + const: "123" opportunity: - status: {} - amount: {} + status: + switch: + field: summary.opportunity_status + case: + active: open + inactive: closed + default: custom + amount: + field: summary.opportunity_amount - opportunity: - status: {} - amount: {} - - opportunityAmount: {} - opportunityStatus: {} - - id: {} + status: + switch: + field: summary.opportunity_status + case: + active: open + inactive: closed + default: custom + amount: + field: summary.opportunity_amount + - opportunityAmount: + field: summary.opportunity_amount + opportunityStatus: + switch: + field: summary.opportunity_status + case: + active: open + inactive: closed + default: custom + - id: + const: "123" opportunity: - status: {} - amount: {} - - id: {} - opportunityStatus: {} - opportunityAmount: {} + status: + field: summary.opportunity_status + amount: + field: summary.opportunity_amount + - id: + const: "123" + opportunityStatus: + field: summary.opportunity_status + opportunityAmount: + field: summary.opportunity_amount description: |- A mapping format for translating data from one schema to another. From b554d8f856b7f57515ddeebdce881c1290d3379f Mon Sep 17 00:00:00 2001 From: widal001 Date: Wed, 11 Feb 2026 21:50:17 -0500 Subject: [PATCH 06/22] docs(website): Updates SchemaFormatTabs for models --- lib/core/lib/core/models/competition.tsp | 1 + lib/core/lib/core/models/proposal.tsp | 3 +++ .../docs/protocol/models/application.mdx | 14 ++++++------- .../docs/protocol/models/competition.mdx | 16 +++++++-------- .../src/content/docs/protocol/models/form.mdx | 10 +++++----- .../docs/protocol/models/opportunity.mdx | 20 +++++++++---------- .../docs/protocol/models/organization.mdx | 6 +++--- .../content/docs/protocol/models/person.mdx | 4 ++-- .../content/docs/protocol/models/proposal.mdx | 18 ++++++++--------- 9 files changed, 48 insertions(+), 44 deletions(-) diff --git a/lib/core/lib/core/models/competition.tsp b/lib/core/lib/core/models/competition.tsp index a88754b0e..90b06cc19 100644 --- a/lib/core/lib/core/models/competition.tsp +++ b/lib/core/lib/core/models/competition.tsp @@ -96,6 +96,7 @@ model CompetitionForms { // CompetitionTimeline // ######################################################### +/** Key dates in the competition's timeline. */ @example(Examples.Competition.keyDates) @Versioning.added(CommonGrants.Versions.v0_1) model CompetitionTimeline { diff --git a/lib/core/lib/core/models/proposal.tsp b/lib/core/lib/core/models/proposal.tsp index 9673497c7..c8da77229 100644 --- a/lib/core/lib/core/models/proposal.tsp +++ b/lib/core/lib/core/models/proposal.tsp @@ -54,6 +54,7 @@ model ProposalOpportunity { // ProjectTimeline // ######################################################### +/** Key dates for the project. */ @Versioning.added(CommonGrants.Versions.v0_2) model ProjectTimeline { /** The start date of the period for which the funding is requested. */ @@ -73,6 +74,7 @@ model ProjectTimeline { // ProjectContacts // ######################################################### +/** The points of contact for the proposal. */ @Versioning.added(CommonGrants.Versions.v0_2) model ProposalContacts { /** The primary point of contact for the proposal. */ @@ -86,6 +88,7 @@ model ProposalContacts { // ProposalOrgs // ######################################################### +/** The organizations that are requesting funding or supporting the proposal. */ @Versioning.added(CommonGrants.Versions.v0_2) model ProposalOrgs { /** The primary organization that is requesting funding. */ diff --git a/website/src/content/docs/protocol/models/application.mdx b/website/src/content/docs/protocol/models/application.mdx index ffea37036..a1211fe99 100644 --- a/website/src/content/docs/protocol/models/application.mdx +++ b/website/src/content/docs/protocol/models/application.mdx @@ -35,7 +35,7 @@ applicationBase: file: path: "lib/core/lib/core/models/application.tsp" startLine: 3 - endLine: 33 + endLine: 37 appStatus: example: code: | @@ -49,8 +49,8 @@ appStatus: typeSpec: file: path: "lib/core/lib/core/models/application.tsp" - startLine: 39 - endLine: 51 + startLine: 43 + endLine: 55 appStatusOptions: example: code: '"submitted"' @@ -60,8 +60,8 @@ appStatusOptions: typeSpec: file: path: "lib/core/lib/core/models/application.tsp" - startLine: 57 - endLine: 70 + startLine: 61 + endLine: 75 appFormResponse: example: code: | @@ -95,8 +95,8 @@ appFormResponse: typeSpec: file: path: "lib/core/lib/core/models/application.tsp" - startLine: 76 - endLine: 85 + startLine: 81 + endLine: 90 --- import SchemaFormatTabs from "@/components/SchemaFormatTabs.astro"; diff --git a/website/src/content/docs/protocol/models/competition.mdx b/website/src/content/docs/protocol/models/competition.mdx index 8d71a8f28..04dc7f880 100644 --- a/website/src/content/docs/protocol/models/competition.mdx +++ b/website/src/content/docs/protocol/models/competition.mdx @@ -72,7 +72,7 @@ competitionStatus: file: path: "lib/core/lib/core/models/competition.tsp" startLine: 50 - endLine: 61 + endLine: 62 competitionStatusOptions: example: code: '"open"' @@ -82,8 +82,8 @@ competitionStatusOptions: typeSpec: file: path: "lib/core/lib/core/models/competition.tsp" - startLine: 67 - endLine: 76 + startLine: 68 + endLine: 78 competitionForms: example: code: | @@ -102,8 +102,8 @@ competitionForms: typeSpec: file: path: "lib/core/lib/core/models/competition.tsp" - startLine: 82 - endLine: 90 + startLine: 84 + endLine: 93 competitionTimeline: example: code: | @@ -133,8 +133,8 @@ competitionTimeline: typeSpec: file: path: "lib/core/lib/core/models/competition.tsp" - startLine: 96 - endLine: 106 + startLine: 99 + endLine: 111 --- import SchemaFormatTabs from "@/components/SchemaFormatTabs.astro"; @@ -227,7 +227,7 @@ Set of forms that need to be completed to apply to the competition. ## CompetitionTimeline -The key dates in the competition timeline. +The key dates in the competition's timeline. ### Table diff --git a/website/src/content/docs/protocol/models/form.mdx b/website/src/content/docs/protocol/models/form.mdx index cafbb3521..27d2eaabb 100644 --- a/website/src/content/docs/protocol/models/form.mdx +++ b/website/src/content/docs/protocol/models/form.mdx @@ -14,7 +14,7 @@ form: file: path: "lib/core/lib/core/models/form.tsp" startLine: 9 - endLine: 39 + endLine: 46 formJsonSchema: example: code: | @@ -36,8 +36,8 @@ formJsonSchema: typeSpec: file: path: "lib/core/lib/core/models/form.tsp" - startLine: 45 - endLine: 50 + startLine: 52 + endLine: 57 formUISchema: example: code: | @@ -62,8 +62,8 @@ formUISchema: typeSpec: file: path: "lib/core/lib/core/models/form.tsp" - startLine: 56 - endLine: 61 + startLine: 63 + endLine: 68 --- import SchemaFormatTabs from "@/components/SchemaFormatTabs.astro"; diff --git a/website/src/content/docs/protocol/models/opportunity.mdx b/website/src/content/docs/protocol/models/opportunity.mdx index ab89e5429..1d8f9e6c1 100644 --- a/website/src/content/docs/protocol/models/opportunity.mdx +++ b/website/src/content/docs/protocol/models/opportunity.mdx @@ -13,8 +13,8 @@ opportunityBase: typeSpec: file: path: "lib/core/lib/core/models/opportunity/base.tsp" - startLine: 43 - endLine: 72 + startLine: 42 + endLine: 78 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/models/opp_base.py" @@ -35,8 +35,8 @@ opportunityDetails: typeSpec: file: path: "lib/core/lib/core/models/opportunity/base.tsp" - startLine: 83 - endLine: 88 + startLine: 84 + endLine: 89 oppStatus: example: file: @@ -47,8 +47,8 @@ oppStatus: typeSpec: file: path: "lib/core/lib/core/models/opportunity/status.tsp" - startLine: 22 - endLine: 34 + startLine: 25 + endLine: 38 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/models/opp_status.py" @@ -69,8 +69,8 @@ oppStatusOptions: typeSpec: file: path: "lib/core/lib/core/models/opportunity/status.tsp" - startLine: 10 - endLine: 16 + startLine: 7 + endLine: 19 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/models/opp_status.py" @@ -92,7 +92,7 @@ oppFunding: file: path: "lib/core/lib/core/models/opportunity/funding.tsp" startLine: 12 - endLine: 40 + endLine: 44 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/models/opp_funding.py" @@ -114,7 +114,7 @@ oppTimeline: file: path: "lib/core/lib/core/models/opportunity/timeline.tsp" startLine: 13 - endLine: 27 + endLine: 28 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/models/opp_timeline.py" diff --git a/website/src/content/docs/protocol/models/organization.mdx b/website/src/content/docs/protocol/models/organization.mdx index 4b5e320f4..d5b1f2690 100644 --- a/website/src/content/docs/protocol/models/organization.mdx +++ b/website/src/content/docs/protocol/models/organization.mdx @@ -97,7 +97,7 @@ organizationBase: file: path: "lib/core/lib/core/models/organization.tsp" startLine: 5 - endLine: 46 + endLine: 47 orgSocialLinks: example: code: | @@ -119,8 +119,8 @@ orgSocialLinks: typeSpec: file: path: "lib/core/lib/core/models/organization.tsp" - startLine: 52 - endLine: 75 + startLine: 53 + endLine: 77 --- import SchemaFormatTabs from "@/components/SchemaFormatTabs.astro"; diff --git a/website/src/content/docs/protocol/models/person.mdx b/website/src/content/docs/protocol/models/person.mdx index 45e31f884..375742f44 100644 --- a/website/src/content/docs/protocol/models/person.mdx +++ b/website/src/content/docs/protocol/models/person.mdx @@ -62,8 +62,8 @@ personBase: typeSpec: file: path: "lib/core/lib/core/models/person.tsp" - startLine: 1 - endLine: 31 + startLine: 6 + endLine: 30 --- import SchemaFormatTabs from "@/components/SchemaFormatTabs.astro"; diff --git a/website/src/content/docs/protocol/models/proposal.mdx b/website/src/content/docs/protocol/models/proposal.mdx index a7c2a3461..65e64edf2 100644 --- a/website/src/content/docs/protocol/models/proposal.mdx +++ b/website/src/content/docs/protocol/models/proposal.mdx @@ -114,7 +114,7 @@ proposalBase: file: path: "lib/core/lib/core/models/proposal.tsp" startLine: 7 - endLine: 33 + endLine: 34 proposalOpportunity: example: code: | @@ -136,8 +136,8 @@ proposalOpportunity: typeSpec: file: path: "lib/core/lib/core/models/proposal.tsp" - startLine: 39 - endLine: 49 + startLine: 40 + endLine: 51 projectTimeline: example: code: | @@ -169,8 +169,8 @@ projectTimeline: typeSpec: file: path: "lib/core/lib/core/models/proposal.tsp" - startLine: 55 - endLine: 67 + startLine: 57 + endLine: 71 proposalContacts: example: code: | @@ -213,8 +213,8 @@ proposalContacts: typeSpec: file: path: "lib/core/lib/core/models/proposal.tsp" - startLine: 73 - endLine: 79 + startLine: 77 + endLine: 85 proposalOrgs: example: code: | @@ -243,8 +243,8 @@ proposalOrgs: typeSpec: file: path: "lib/core/lib/core/models/proposal.tsp" - startLine: 85 - endLine: 91 + startLine: 91 + endLine: 99 --- import SchemaFormatTabs from "@/components/SchemaFormatTabs.astro"; From 205d7382cdae7472e23082b21c78c6dac94c187e Mon Sep 17 00:00:00 2001 From: widal001 Date: Wed, 11 Feb 2026 22:02:15 -0500 Subject: [PATCH 07/22] docs(website): Updates SchemaFormatTabs for fields --- .../docs/protocol/fields/custom-field.mdx | 6 ++--- .../content/docs/protocol/fields/event.mdx | 22 +++++++++---------- .../content/docs/protocol/fields/metadata.mdx | 2 +- .../content/docs/protocol/fields/money.mdx | 2 +- .../src/content/docs/protocol/fields/pcs.mdx | 4 ++-- .../content/docs/protocol/fields/phone.mdx | 6 ++--- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/website/src/content/docs/protocol/fields/custom-field.mdx b/website/src/content/docs/protocol/fields/custom-field.mdx index 42fa9ebcb..a50b4d83b 100644 --- a/website/src/content/docs/protocol/fields/custom-field.mdx +++ b/website/src/content/docs/protocol/fields/custom-field.mdx @@ -11,8 +11,8 @@ customField: typeSpec: file: path: "lib/core/lib/core/fields/custom-field.tsp" - startLine: 46 - endLine: 62 + startLine: 47 + endLine: 64 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/fields/custom.py" @@ -33,7 +33,7 @@ customFieldType: file: path: "lib/core/lib/core/fields/custom-field.tsp" startLine: 7 - endLine: 15 + endLine: 16 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/fields/custom.py" diff --git a/website/src/content/docs/protocol/fields/event.mdx b/website/src/content/docs/protocol/fields/event.mdx index 958a539c1..86be00d56 100644 --- a/website/src/content/docs/protocol/fields/event.mdx +++ b/website/src/content/docs/protocol/fields/event.mdx @@ -12,7 +12,7 @@ eventType: file: path: "lib/core/lib/core/fields/event.tsp" startLine: 11 - endLine: 26 + endLine: 27 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/fields/event.py" @@ -33,8 +33,8 @@ event: typeSpec: file: path: "lib/core/lib/core/fields/event.tsp" - startLine: 32 - endLine: 42 + startLine: 33 + endLine: 45 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/fields/event.py" @@ -55,8 +55,8 @@ eventBase: typeSpec: file: path: "lib/core/lib/core/fields/event.tsp" - startLine: 48 - endLine: 59 + startLine: 51 + endLine: 62 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/fields/event.py" @@ -77,8 +77,8 @@ singleDateEvent: typeSpec: file: path: "lib/core/lib/core/fields/event.tsp" - startLine: 65 - endLine: 77 + startLine: 68 + endLine: 81 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/fields/event.py" @@ -99,8 +99,8 @@ dateRangeEvent: typeSpec: file: path: "lib/core/lib/core/fields/event.tsp" - startLine: 83 - endLine: 101 + startLine: 86 + endLine: 106 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/fields/event.py" @@ -121,8 +121,8 @@ otherEvent: typeSpec: file: path: "lib/core/lib/core/fields/event.tsp" - startLine: 107 - endLine: 119 + startLine: 112 + endLine: 125 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/fields/event.py" diff --git a/website/src/content/docs/protocol/fields/metadata.mdx b/website/src/content/docs/protocol/fields/metadata.mdx index 1cc5a9b45..f98e4b6be 100644 --- a/website/src/content/docs/protocol/fields/metadata.mdx +++ b/website/src/content/docs/protocol/fields/metadata.mdx @@ -12,7 +12,7 @@ systemMetadata: file: path: "lib/core/lib/core/fields/metadata.tsp" startLine: 21 - endLine: 30 + endLine: 31 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/fields/metadata.py" diff --git a/website/src/content/docs/protocol/fields/money.mdx b/website/src/content/docs/protocol/fields/money.mdx index c54db48e5..dedf1c253 100644 --- a/website/src/content/docs/protocol/fields/money.mdx +++ b/website/src/content/docs/protocol/fields/money.mdx @@ -12,7 +12,7 @@ money: file: path: "lib/core/lib/core/fields/money.tsp" startLine: 21 - endLine: 28 + endLine: 29 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/fields/money.py" diff --git a/website/src/content/docs/protocol/fields/pcs.mdx b/website/src/content/docs/protocol/fields/pcs.mdx index bdcae6362..57f44e477 100644 --- a/website/src/content/docs/protocol/fields/pcs.mdx +++ b/website/src/content/docs/protocol/fields/pcs.mdx @@ -12,7 +12,7 @@ pcsTerm: file: path: "lib/core/lib/core/fields/pcs.tsp" startLine: 15 - endLine: 31 + endLine: 32 pcsClass: example: file: @@ -24,7 +24,7 @@ pcsClass: file: path: "lib/core/lib/core/fields/pcs.tsp" startLine: 37 - endLine: 45 + endLine: 46 pcsOrgType: example: file: diff --git a/website/src/content/docs/protocol/fields/phone.mdx b/website/src/content/docs/protocol/fields/phone.mdx index debc7c8dc..d0762f7af 100644 --- a/website/src/content/docs/protocol/fields/phone.mdx +++ b/website/src/content/docs/protocol/fields/phone.mdx @@ -12,7 +12,7 @@ phone: file: path: "lib/core/lib/core/fields/phone.tsp" startLine: 3 - endLine: 19 + endLine: 20 phoneCollection: example: file: @@ -23,8 +23,8 @@ phoneCollection: typeSpec: file: path: "lib/core/lib/core/fields/phone.tsp" - startLine: 25 - endLine: 37 + startLine: 26 + endLine: 39 --- import SchemaFormatTabs from "@/components/SchemaFormatTabs.astro"; From 7f1a7238e95e5df86555c1f63896ce63b8218df8 Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 10:18:56 -0500 Subject: [PATCH 08/22] docs(website): Updates SchemaFormatTabs for filters --- .../content/docs/protocol/filters/base.mdx | 22 +++++++++---------- .../content/docs/protocol/filters/date.mdx | 4 ++-- .../content/docs/protocol/filters/money.mdx | 6 ++--- .../content/docs/protocol/filters/numeric.mdx | 10 ++++----- .../content/docs/protocol/filters/string.mdx | 8 +++---- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/website/src/content/docs/protocol/filters/base.mdx b/website/src/content/docs/protocol/filters/base.mdx index 6d6f41c6f..f69ac5068 100644 --- a/website/src/content/docs/protocol/filters/base.mdx +++ b/website/src/content/docs/protocol/filters/base.mdx @@ -11,8 +11,8 @@ defaultFilter: typeSpec: file: path: "lib/core/lib/core/filters/base.tsp" - startLine: 70 - endLine: 83 + startLine: 75 + endLine: 89 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/base.py" @@ -34,7 +34,7 @@ equivalenceOperators: file: path: "lib/core/lib/core/filters/base.tsp" startLine: 7 - endLine: 14 + endLine: 15 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/base.py" @@ -55,8 +55,8 @@ comparisonOperators: typeSpec: file: path: "lib/core/lib/core/filters/base.tsp" - startLine: 16 - endLine: 29 + startLine: 17 + endLine: 30 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/base.py" @@ -77,8 +77,8 @@ stringOperators: typeSpec: file: path: "lib/core/lib/core/filters/base.tsp" - startLine: 40 - endLine: 47 + startLine: 43 + endLine: 50 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/base.py" @@ -99,8 +99,8 @@ arrayOperators: typeSpec: file: path: "lib/core/lib/core/filters/base.tsp" - startLine: 31 - endLine: 38 + startLine: 33 + endLine: 41 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/base.py" @@ -121,8 +121,8 @@ rangeOperators: typeSpec: file: path: "lib/core/lib/core/filters/base.tsp" - startLine: 49 - endLine: 56 + startLine: 52 + endLine: 59 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/base.py" diff --git a/website/src/content/docs/protocol/filters/date.mdx b/website/src/content/docs/protocol/filters/date.mdx index 7df126ebf..ba538a0da 100644 --- a/website/src/content/docs/protocol/filters/date.mdx +++ b/website/src/content/docs/protocol/filters/date.mdx @@ -12,7 +12,7 @@ dateRangeFilter: file: path: "lib/core/lib/core/filters/date.tsp" startLine: 24 - endLine: 38 + endLine: 39 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/date.py" @@ -34,7 +34,7 @@ dateComparisonFilter: file: path: "lib/core/lib/core/filters/date.tsp" startLine: 10 - endLine: 18 + endLine: 20 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/date.py" diff --git a/website/src/content/docs/protocol/filters/money.mdx b/website/src/content/docs/protocol/filters/money.mdx index 99eef22e4..f986e97ae 100644 --- a/website/src/content/docs/protocol/filters/money.mdx +++ b/website/src/content/docs/protocol/filters/money.mdx @@ -11,8 +11,8 @@ moneyRangeFilter: typeSpec: file: path: "lib/core/lib/core/filters/money.tsp" - startLine: 24 - endLine: 39 + startLine: 25 + endLine: 41 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/money.py" @@ -34,7 +34,7 @@ moneyComparisonFilter: file: path: "lib/core/lib/core/filters/money.tsp" startLine: 10 - endLine: 18 + endLine: 20 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/money.py" diff --git a/website/src/content/docs/protocol/filters/numeric.mdx b/website/src/content/docs/protocol/filters/numeric.mdx index debb4cb7d..1e9fa8cc6 100644 --- a/website/src/content/docs/protocol/filters/numeric.mdx +++ b/website/src/content/docs/protocol/filters/numeric.mdx @@ -12,7 +12,7 @@ numberComparisonFilter: file: path: "lib/core/lib/core/filters/numeric.tsp" startLine: 11 - endLine: 19 + endLine: 21 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/numeric.py" @@ -33,8 +33,8 @@ numberRangeFilter: typeSpec: file: path: "lib/core/lib/core/filters/numeric.tsp" - startLine: 25 - endLine: 36 + startLine: 27 + endLine: 39 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/numeric.py" @@ -55,8 +55,8 @@ numberArrayFilter: typeSpec: file: path: "lib/core/lib/core/filters/numeric.tsp" - startLine: 42 - endLine: 50 + startLine: 45 + endLine: 54 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/numeric.py" diff --git a/website/src/content/docs/protocol/filters/string.mdx b/website/src/content/docs/protocol/filters/string.mdx index b63d90213..77c9c6553 100644 --- a/website/src/content/docs/protocol/filters/string.mdx +++ b/website/src/content/docs/protocol/filters/string.mdx @@ -12,7 +12,7 @@ stringComparisonFilter: file: path: "lib/core/lib/core/filters/string.tsp" startLine: 9 - endLine: 17 + endLine: 18 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/string.py" @@ -33,8 +33,8 @@ stringArrayFilter: typeSpec: file: path: "lib/core/lib/core/filters/string.tsp" - startLine: 23 - endLine: 31 + startLine: 24 + endLine: 33 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/filters/string.py" @@ -83,7 +83,7 @@ A filter that applies a comparison to an array of string values. | Property | Type | Required | Description | | -------- | ------------------------------------------------------------------------------- | -------- | ----------------------------------------- | -| operator | [StringOperators](/protocol/filters/base#stringoperators) | Yes | The operator to apply to the filter value | +| operator | [ArrayOperators](/protocol/filters/base#arrayoperators) | Yes | The operator to apply to the filter value | | value | [Array](/protocol/types/other#array)\<[string](/protocol/types/string#string)\> | Yes | The value to use for the filter operation | ### Formats From 21d2c1e21755d75c9485079c948e35ddf7b4a298 Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 10:20:09 -0500 Subject: [PATCH 09/22] refactor(core): Updates NumberComparisonFilter Allows both EquivalenceOperator and ComparisonOperator --- lib/core/lib/core/filters/numeric.tsp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/core/lib/core/filters/numeric.tsp b/lib/core/lib/core/filters/numeric.tsp index ac456915f..b01933e23 100644 --- a/lib/core/lib/core/filters/numeric.tsp +++ b/lib/core/lib/core/filters/numeric.tsp @@ -12,7 +12,8 @@ namespace CommonGrants.Filters; @Versioning.added(CommonGrants.Versions.v0_1) model NumberComparisonFilter { /** The comparison operator to apply to the filter value */ - operator: ComparisonOperators; + @Versioning.typeChangedFrom(CommonGrants.Versions.v0_3, ComparisonOperators) + operator: ComparisonOperators | EquivalenceOperators; /** The value to use for the filter operation */ @example(1000) From be408c41b7b00004573379b21e17d7f1f91e2c44 Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 10:20:26 -0500 Subject: [PATCH 10/22] refactor(website): Updates auto-generated docs --- website/public/openapi/openapi.0.2.0.yaml | 1 + website/public/openapi/openapi.0.3.0.yaml | 1 + website/public/schemas/yaml/CompetitionTimeline.yaml | 1 + website/public/schemas/yaml/NumberComparisonFilter.yaml | 4 +++- website/public/schemas/yaml/ProjectTimeline.yaml | 1 + website/public/schemas/yaml/ProposalContacts.yaml | 1 + website/public/schemas/yaml/ProposalOrgs.yaml | 1 + 7 files changed, 9 insertions(+), 1 deletion(-) diff --git a/website/public/openapi/openapi.0.2.0.yaml b/website/public/openapi/openapi.0.2.0.yaml index 0bce880d5..e7c7de9bf 100644 --- a/website/public/openapi/openapi.0.2.0.yaml +++ b/website/public/openapi/openapi.0.2.0.yaml @@ -1591,6 +1591,7 @@ components: additionalProperties: $ref: '#/components/schemas/CommonGrants.Fields.Event' description: The date the competition was created + description: Key dates in the competition's timeline. example: openDate: name: Open Date diff --git a/website/public/openapi/openapi.0.3.0.yaml b/website/public/openapi/openapi.0.3.0.yaml index c6b1b8007..781e2d647 100644 --- a/website/public/openapi/openapi.0.3.0.yaml +++ b/website/public/openapi/openapi.0.3.0.yaml @@ -1781,6 +1781,7 @@ components: additionalProperties: $ref: '#/components/schemas/CommonGrants.Fields.Event' description: The date the competition was created + description: Key dates in the competition's timeline. example: openDate: name: Open Date diff --git a/website/public/schemas/yaml/CompetitionTimeline.yaml b/website/public/schemas/yaml/CompetitionTimeline.yaml index 6300503e6..b3be4e0d3 100644 --- a/website/public/schemas/yaml/CompetitionTimeline.yaml +++ b/website/public/schemas/yaml/CompetitionTimeline.yaml @@ -28,6 +28,7 @@ examples: eventType: dateRange startDate: 2025-02-01 endDate: 2025-02-28 +description: Key dates in the competition's timeline. $defs: RecordEvent: type: object diff --git a/website/public/schemas/yaml/NumberComparisonFilter.yaml b/website/public/schemas/yaml/NumberComparisonFilter.yaml index f045b7c85..16fc2e74d 100644 --- a/website/public/schemas/yaml/NumberComparisonFilter.yaml +++ b/website/public/schemas/yaml/NumberComparisonFilter.yaml @@ -3,7 +3,9 @@ $id: NumberComparisonFilter.yaml type: object properties: operator: - $ref: ComparisonOperators.yaml + anyOf: + - $ref: ComparisonOperators.yaml + - $ref: EquivalenceOperators.yaml description: The comparison operator to apply to the filter value value: type: number diff --git a/website/public/schemas/yaml/ProjectTimeline.yaml b/website/public/schemas/yaml/ProjectTimeline.yaml index cfcd383a4..0694bf443 100644 --- a/website/public/schemas/yaml/ProjectTimeline.yaml +++ b/website/public/schemas/yaml/ProjectTimeline.yaml @@ -16,6 +16,7 @@ properties: description: Details about the timeline that don't fit into the other fields. unevaluatedProperties: not: {} +description: Key dates for the project. $defs: RecordEvent: type: object diff --git a/website/public/schemas/yaml/ProposalContacts.yaml b/website/public/schemas/yaml/ProposalContacts.yaml index 39857c6f8..1a3d65709 100644 --- a/website/public/schemas/yaml/ProposalContacts.yaml +++ b/website/public/schemas/yaml/ProposalContacts.yaml @@ -12,6 +12,7 @@ required: - primary unevaluatedProperties: not: {} +description: The points of contact for the proposal. $defs: RecordPersonBase: type: object diff --git a/website/public/schemas/yaml/ProposalOrgs.yaml b/website/public/schemas/yaml/ProposalOrgs.yaml index 45d8e8461..68b5703f3 100644 --- a/website/public/schemas/yaml/ProposalOrgs.yaml +++ b/website/public/schemas/yaml/ProposalOrgs.yaml @@ -12,6 +12,7 @@ required: - primary unevaluatedProperties: not: {} +description: The organizations that are requesting funding or supporting the proposal. $defs: RecordOrganizationBase: type: object From c2256d5843ec5506c684fe69cc975f11b7379a09 Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 10:32:47 -0500 Subject: [PATCH 11/22] docs(website): Updates SchemaFormatTabs for types --- website/src/content/docs/protocol/types/date.mdx | 12 ++++++------ website/src/content/docs/protocol/types/numeric.mdx | 4 ++-- website/src/content/docs/protocol/types/string.mdx | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/website/src/content/docs/protocol/types/date.mdx b/website/src/content/docs/protocol/types/date.mdx index 53163fc56..1191fc382 100644 --- a/website/src/content/docs/protocol/types/date.mdx +++ b/website/src/content/docs/protocol/types/date.mdx @@ -13,8 +13,8 @@ isoDate: typeSpec: file: path: "lib/core/lib/core/types.tsp" - startLine: 80 - endLine: 82 + startLine: 84 + endLine: 87 typescript: file: path: "lib/ts-sdk/src/schemas/zod/types.ts" @@ -30,8 +30,8 @@ isoTime: typeSpec: file: path: "lib/core/lib/core/types.tsp" - startLine: 76 - endLine: 78 + startLine: 79 + endLine: 82 typescript: file: path: "lib/ts-sdk/src/schemas/zod/types.ts" @@ -77,8 +77,8 @@ calendarYear: typeSpec: file: path: "lib/core/lib/core/types.tsp" - startLine: 84 - endLine: 88 + startLine: 89 + endLine: 93 --- import SchemaFormatTabs from "@/components/SchemaFormatTabs.astro"; diff --git a/website/src/content/docs/protocol/types/numeric.mdx b/website/src/content/docs/protocol/types/numeric.mdx index 35de9b903..0ba59bc5b 100644 --- a/website/src/content/docs/protocol/types/numeric.mdx +++ b/website/src/content/docs/protocol/types/numeric.mdx @@ -51,8 +51,8 @@ decimalString: typeSpec: file: path: "lib/core/lib/core/types.tsp" - startLine: 62 - endLine: 70 + startLine: 64 + endLine: 73 typescript: file: path: "lib/ts-sdk/src/schemas/zod/types.ts" diff --git a/website/src/content/docs/protocol/types/string.mdx b/website/src/content/docs/protocol/types/string.mdx index f522e19d1..52dd9d41b 100644 --- a/website/src/content/docs/protocol/types/string.mdx +++ b/website/src/content/docs/protocol/types/string.mdx @@ -80,8 +80,8 @@ duns: typeSpec: file: path: "lib/core/lib/core/types.tsp" - startLine: 51 - endLine: 56 + startLine: 52 + endLine: 57 --- import SchemaFormatTabs from "@/components/SchemaFormatTabs.astro"; From bc309926e46d68f858a5059b05e50291913af77f Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 12:02:18 -0500 Subject: [PATCH 12/22] docs(website): Updates SchemaFormatTabs for responses --- lib/core/lib/core/responses/success.tsp | 2 + .../content/docs/protocol/responses/error.mdx | 2 +- .../docs/protocol/responses/filtered.mdx | 45 +++++++------ .../docs/protocol/responses/paginated.mdx | 21 ++---- .../docs/protocol/responses/sorted.mdx | 21 ++---- .../docs/protocol/responses/success.mdx | 65 ++++++++++++++++++- 6 files changed, 99 insertions(+), 57 deletions(-) diff --git a/lib/core/lib/core/responses/success.tsp b/lib/core/lib/core/responses/success.tsp index ea19ab847..81cf67124 100644 --- a/lib/core/lib/core/responses/success.tsp +++ b/lib/core/lib/core/responses/success.tsp @@ -101,6 +101,7 @@ model Paginated extends Success { * alias CustomModelSortedResponse = Responses.Sorted; * ``` */ +@doc("A paginated list of items with a sort order") @Versioning.added(CommonGrants.Versions.v0_1) model Sorted { // Inherit the properties of the Paginated response @@ -136,6 +137,7 @@ model Sorted { * alias CustomModelFilteredResponse = Responses.Filtered; * ``` */ +@doc("A paginated list of items with a filter") @Versioning.added(CommonGrants.Versions.v0_1) model Filtered extends Success { // Inherit the properties of the Sorted response diff --git a/website/src/content/docs/protocol/responses/error.mdx b/website/src/content/docs/protocol/responses/error.mdx index 175a5f510..e050a5e0c 100644 --- a/website/src/content/docs/protocol/responses/error.mdx +++ b/website/src/content/docs/protocol/responses/error.mdx @@ -36,7 +36,7 @@ applicationSubmissionError: file: path: "lib/core/lib/core/responses/error.tsp" startLine: 32 - endLine: 42 + endLine: 43 typescript: file: path: "lib/ts-sdk/src/schemas/zod/responses.ts" diff --git a/website/src/content/docs/protocol/responses/filtered.mdx b/website/src/content/docs/protocol/responses/filtered.mdx index cbe1621d7..a4e3944d1 100644 --- a/website/src/content/docs/protocol/responses/filtered.mdx +++ b/website/src/content/docs/protocol/responses/filtered.mdx @@ -30,9 +30,18 @@ filtered: "direction": "asc" }, "filterInfo": { - "lastModifiedAt": { - "operator": "gte", - "value": "2024-01-01T00:00:00Z" + "filters": { + "lastModifiedAt": { + "operator": "gte", + "value": "2024-01-01T00:00:00Z" + }, + "status": { + "operator": "in", + "value": [ + "active", + "inactive" + ] + } } } } @@ -42,15 +51,6 @@ filtered: $id: Filtered.yaml type: object properties: - status: - type: integer - minimum: 200 - default: 200 - description: The HTTP status code - message: - type: string - default: "Success" - description: The message to return items: type: array description: Items from the current page @@ -61,9 +61,18 @@ filtered: filterInfo: type: object description: The filters applied to the response items + properties: + filters: + type: object + description: The filters applied to the response items + errors: + type: array + items: + type: string + description: Non-fatal errors that occurred during filtering + allOf: + - $ref: Success.yaml required: - - status - - message - items - paginationInfo - sortInfo @@ -71,8 +80,8 @@ filtered: typeSpec: file: path: "lib/core/lib/core/responses/success.tsp" - startLine: 135 - endLine: 146 + startLine: 140 + endLine: 153 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/responses/success.py" @@ -112,7 +121,3 @@ A 200 response with a paginated list of filtered items. python={frontmatter.filtered.python} typescript={frontmatter.filtered.typescript} /> - -### Changelog - - diff --git a/website/src/content/docs/protocol/responses/paginated.mdx b/website/src/content/docs/protocol/responses/paginated.mdx index 01fc84f45..845287b9c 100644 --- a/website/src/content/docs/protocol/responses/paginated.mdx +++ b/website/src/content/docs/protocol/responses/paginated.mdx @@ -32,20 +32,13 @@ paginated: $id: Paginated.yaml type: object properties: - status: - type: integer - minimum: 200 - default: 200 - description: The HTTP status code - message: - type: string - default: "Success" - description: The message to return items: type: array description: Items from the current page paginationInfo: - $ref: "#/components/schemas/CommonGrants.Pagination.PaginationInfo" + $ref: PaginatedResultsInfo.yaml + allOf: + - $ref: Success.yaml required: - status - message @@ -54,8 +47,8 @@ paginated: typeSpec: file: path: "lib/core/lib/core/responses/success.tsp" - startLine: 68 - endLine: 79 + startLine: 70 + endLine: 82 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/responses/success.py" @@ -94,10 +87,6 @@ A 200 response with a paginated list of items. typescript={frontmatter.paginated.typescript} /> -### Changelog - - - ### Usage Here's an example of how to use the `Paginated` response within a an API operation: diff --git a/website/src/content/docs/protocol/responses/sorted.mdx b/website/src/content/docs/protocol/responses/sorted.mdx index d8478f58f..c53ed1902 100644 --- a/website/src/content/docs/protocol/responses/sorted.mdx +++ b/website/src/content/docs/protocol/responses/sorted.mdx @@ -36,15 +36,6 @@ sorted: $id: Sorted.yaml type: object properties: - status: - type: integer - minimum: 200 - default: 200 - description: The HTTP status code - message: - type: string - default: "Success" - description: The message to return items: type: array description: Items from the current page @@ -52,17 +43,17 @@ sorted: $ref: PaginatedResultsInfo.yaml sortInfo: $ref: SortedResultsInfo.yaml + allOf: + - $ref: Success.yaml required: - - status - - message - items - paginationInfo - sortInfo typeSpec: file: path: "lib/core/lib/core/responses/success.tsp" - startLine: 101 - endLine: 107 + startLine: 104 + endLine: 112 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/responses/success.py" @@ -102,10 +93,6 @@ A 200 response with a paginated list of sorted items. typescript={frontmatter.sorted.typescript} /> -### Changelog - - - ### Usage Here's an example of how to use the `Sorted` response within a an API operation: diff --git a/website/src/content/docs/protocol/responses/success.mdx b/website/src/content/docs/protocol/responses/success.mdx index fe756c90e..b24f741a5 100644 --- a/website/src/content/docs/protocol/responses/success.mdx +++ b/website/src/content/docs/protocol/responses/success.mdx @@ -3,6 +3,44 @@ title: Success description: The default response for a successful request. sidebar: order: 1 +ok: + example: + code: | + { + "status": 200, + "message": "Success", + "data": { + "id": "123", + "name": "Test 1" + } + } + jsonSchema: + code: | + $schema: https://json-schema.org/draft/2020-12/schema + $id: Ok.yaml + type: object + properties: + status: + type: integer + minimum: 200 + default: 200 + description: The HTTP status code + message: + type: string + default: "Success" + description: The message to return + data: + type: object + description: The data to return + required: + - status + - message + - data + typeSpec: + file: + path: "lib/core/lib/core/responses/success.tsp" + startLine: 40 + endLine: 48 success: example: file: @@ -14,7 +52,7 @@ success: file: path: "lib/core/lib/core/responses/success.tsp" startLine: 11 - endLine: 17 + endLine: 19 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/responses/success.py" @@ -32,7 +70,7 @@ import SchemaChangelog from "@/components/SchemaChangelog.astro"; ## Success -A 200 response with data. +Base model for all successful responses. ### Table @@ -40,7 +78,6 @@ A 200 response with data. | --------- | ------------------------------------------ | --------------------- | | status | [integer](/protocol/types/numeric#integer) | The HTTP status code | | message | [string](/protocol/types/string#string) | The message to return | -| data | any | The data to return | ### Formats @@ -56,6 +93,28 @@ A 200 response with data. +## Ok + +A 200 response with data. + +### Table + +| Parameter | Type | Description | +| --------- | ------------------------------------------ | --------------------- | +| status | [integer](/protocol/types/numeric#integer) | The HTTP status code | +| message | [string](/protocol/types/string#string) | The message to return | +| data | any | The data to return | + +### Formats + + + ### Usage Here's an example of how to use the `Ok` response within a an API operation: From 8b763ee0530533191c4282421d9bcdb6b8ec4468 Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 12:11:10 -0500 Subject: [PATCH 13/22] docs(website): Updates docs for pagination and sorting --- website/src/content/docs/protocol/pagination.mdx | 12 ++++++------ website/src/content/docs/protocol/sorting.mdx | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/website/src/content/docs/protocol/pagination.mdx b/website/src/content/docs/protocol/pagination.mdx index 95af76811..6e8bd0aae 100644 --- a/website/src/content/docs/protocol/pagination.mdx +++ b/website/src/content/docs/protocol/pagination.mdx @@ -11,8 +11,8 @@ paginatedQueryParams: typeSpec: file: path: "lib/core/lib/core/pagination.tsp" - startLine: 9 - endLine: 22 + startLine: 10 + endLine: 24 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/pagination.py" @@ -33,8 +33,8 @@ paginatedBodyParams: typeSpec: file: path: "lib/core/lib/core/pagination.tsp" - startLine: 24 - endLine: 35 + startLine: 26 + endLine: 38 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/pagination.py" @@ -55,8 +55,8 @@ paginatedResultsInfo: typeSpec: file: path: "lib/core/lib/core/pagination.tsp" - startLine: 37 - endLine: 56 + startLine: 40 + endLine: 60 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/pagination.py" diff --git a/website/src/content/docs/protocol/sorting.mdx b/website/src/content/docs/protocol/sorting.mdx index 9e881e7fd..68c94bde9 100644 --- a/website/src/content/docs/protocol/sorting.mdx +++ b/website/src/content/docs/protocol/sorting.mdx @@ -12,7 +12,7 @@ sortOrder: file: path: "lib/core/lib/core/sorting.tsp" startLine: 21 - endLine: 24 + endLine: 25 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/sorting.py" @@ -33,8 +33,8 @@ sortQueryParams: typeSpec: file: path: "lib/core/lib/core/sorting.tsp" - startLine: 26 - endLine: 42 + startLine: 27 + endLine: 44 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/sorting.py" @@ -55,8 +55,8 @@ sortBodyParams: typeSpec: file: path: "lib/core/lib/core/sorting.tsp" - startLine: 44 - endLine: 57 + startLine: 46 + endLine: 60 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/sorting.py" @@ -77,8 +77,8 @@ sortedResultsInfo: typeSpec: file: path: "lib/core/lib/core/sorting.tsp" - startLine: 59 - endLine: 75 + startLine: 62 + endLine: 79 python: file: path: "lib/python-sdk/common_grants_sdk/schemas/pydantic/sorting.py" From 58e9e952cd288c4860913e276dabef8eed96f6f2 Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 12:13:24 -0500 Subject: [PATCH 14/22] build(template): Revert accidental change to express-js --- templates/express-js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/express-js/package.json b/templates/express-js/package.json index 774c01245..f555a9717 100644 --- a/templates/express-js/package.json +++ b/templates/express-js/package.json @@ -40,7 +40,7 @@ "@types/cors": "^2.8.19", "@types/express": "^4.17.25", "@types/js-yaml": "^4.0.9", - "@types/node": "catalog:", + "@types/node": "^20.19.30", "@types/supertest": "^6.0.3", "@types/swagger-ui-express": "^4.1.8", "@types/uuid": "^10.0.0", From e33c4945e55653d077fcaa7ba4a3858df8f82b0d Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 12:22:00 -0500 Subject: [PATCH 15/22] refactor(cli): Auto-updates OpenAPI specs in CLI Auto-updates the OpenAPI specs generated from `@common-grants/core` These OpenAPI specs are used by `check spec` --- lib/cli/lib/openapi/openapi.0.1.0.yaml | 4 +- lib/cli/lib/openapi/openapi.0.2.0.yaml | 61 +- lib/cli/lib/openapi/openapi.0.3.0.yaml | 2644 ++++++++++++++++++++++++ 3 files changed, 2707 insertions(+), 2 deletions(-) create mode 100644 lib/cli/lib/openapi/openapi.0.3.0.yaml diff --git a/lib/cli/lib/openapi/openapi.0.1.0.yaml b/lib/cli/lib/openapi/openapi.0.1.0.yaml index 99f794cbd..1ad9dc535 100644 --- a/lib/cli/lib/openapi/openapi.0.1.0.yaml +++ b/lib/cli/lib/openapi/openapi.0.1.0.yaml @@ -13,7 +13,9 @@ tags: - name: Competitions description: Endpoints related to competitions, which are distinct application processes for the same funding opportunity - name: Applications - description: Endpoints related to applications for a given competition + description: Endpoints related to submitting applications for a given competition + - name: Application Reviews + description: Endpoints related to reviewing applications for a given competition - name: Forms description: Endpoints related to forms - name: required diff --git a/lib/cli/lib/openapi/openapi.0.2.0.yaml b/lib/cli/lib/openapi/openapi.0.2.0.yaml index 45b85ce4e..e7c7de9bf 100644 --- a/lib/cli/lib/openapi/openapi.0.2.0.yaml +++ b/lib/cli/lib/openapi/openapi.0.2.0.yaml @@ -13,7 +13,9 @@ tags: - name: Competitions description: Endpoints related to competitions, which are distinct application processes for the same funding opportunity - name: Applications - description: Endpoints related to applications for a given competition + description: Endpoints related to submitting applications for a given competition + - name: Application Reviews + description: Endpoints related to reviewing applications for a given competition - name: Forms description: Endpoints related to forms - name: required @@ -1161,6 +1163,40 @@ components: submittedAt: null createdAt: '2021-01-01T00:00:00Z' lastModifiedAt: '2021-01-01T00:00:00Z' + customFields: + attachments: + name: attachments + fieldType: object + value: + contacts: + downloadUrl: https://example.com/file.pdf + name: example.pdf + description: A PDF file with instructions + sizeInBytes: 1000 + mimeType: application/pdf + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + budget: + downloadUrl: https://example.com/excel.xlsx + name: excel.xlsx + description: The excel file for the application + sizeInBytes: 1000 + mimeType: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + description: The attachments for the application + applicationZipFile: + name: applicationZipFile + fieldType: object + value: + downloadUrl: https://example.com/application.zip + name: application.zip + description: The zip file for the application + sizeInBytes: 50000 + mimeType: application/zip + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + description: The zip file for the application CommonGrants.Models.CompetitionBase: type: object required: @@ -1311,6 +1347,8 @@ components: field: emails.primary phone: field: phones.primary + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' formB: id: b7c1e2f4-8a3d-4e2a-9c5b-1f2e3d4c5b6a name: Form A @@ -1365,6 +1403,8 @@ components: field: emails.primary phone: field: phones.primary + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' validation: required: - formA @@ -1442,6 +1482,8 @@ components: field: emails.primary phone: field: phones.primary + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' formB: id: b7c1e2f4-8a3d-4e2a-9c5b-1f2e3d4c5b6a name: Form A @@ -1496,6 +1538,8 @@ components: field: emails.primary phone: field: phones.primary + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' validation: required: - formA @@ -1547,6 +1591,7 @@ components: additionalProperties: $ref: '#/components/schemas/CommonGrants.Fields.Event' description: The date the competition was created + description: Key dates in the competition's timeline. example: openDate: name: Open Date @@ -1567,6 +1612,8 @@ components: required: - id - name + - createdAt + - lastModifiedAt properties: id: allOf: @@ -1606,6 +1653,16 @@ components: additionalProperties: $ref: '#/components/schemas/CommonGrants.Fields.CustomField' description: Custom attributes about the form itself, not custom fields within the form. + createdAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was created. + readOnly: true + lastModifiedAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was last modified. + readOnly: true description: A form for collecting data from a user. example: id: b7c1e2f4-8a3d-4e2a-9c5b-1f2e3d4c5b6a @@ -1661,6 +1718,8 @@ components: field: emails.primary phone: field: phones.primary + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' CommonGrants.Models.FormJsonSchema: type: object additionalProperties: {} diff --git a/lib/cli/lib/openapi/openapi.0.3.0.yaml b/lib/cli/lib/openapi/openapi.0.3.0.yaml new file mode 100644 index 000000000..781e2d647 --- /dev/null +++ b/lib/cli/lib/openapi/openapi.0.3.0.yaml @@ -0,0 +1,2644 @@ +openapi: 3.0.0 +info: + title: CommonGrants Base API + description: |- + The base OpenAPI specification for a CommonGrants API + + In order for an API to be "compliant" with the CommonGrants protocol, + it must implement all of the routes with the "required" tag in this specification. + version: 0.3.0 +tags: + - name: Opportunities + description: Endpoints related to funding opportunities + - name: Competitions + description: Endpoints related to competitions, which are distinct application processes for the same funding opportunity + - name: Applications + description: Endpoints related to submitting applications for a given competition + - name: Application Reviews + description: Endpoints related to reviewing applications for a given competition + - name: Forms + description: Endpoints related to forms + - name: required + description: Endpoints that MUST be implemented by all CommonGrants APIs + - name: optional + description: Endpoints that MAY be implemented by CommonGrants APIs + - name: experimental + description: Endpoints that MAY be implemented by CommonGrants APIs, but are not guaranteed to be stable +paths: + /common-grants/applications/search: + post: + operationId: Applications_searchApplications + summary: Search applications + description: 'Search for applications. Note: The search results for a given query will depend on the scopes attached to the API token used to make the request.' + parameters: + - name: filters + in: query + required: true + description: The filters to apply to the search + schema: + $ref: '#/components/schemas/CommonGrants.Models.AppFilters' + explode: false + - name: sorting + in: query + required: true + description: The sorting to apply to the search + schema: + $ref: '#/components/schemas/CommonGrants.Models.AppSorting' + explode: false + responses: + '200': + description: A paginated list of items with a filter + content: + application/json: + schema: + type: object + required: + - items + - paginationInfo + - status + - message + - sortInfo + - filterInfo + properties: + items: + type: array + items: + $ref: '#/components/schemas/CommonGrants.Models.ApplicationBase' + description: Items from the current page + paginationInfo: + allOf: + - $ref: '#/components/schemas/CommonGrants.Pagination.PaginatedResultsInfo' + description: Details about the paginated results + status: + type: integer + format: int32 + example: 200 + message: + type: string + example: Success + sortInfo: + allOf: + - $ref: '#/components/schemas/CommonGrants.Sorting.SortedResultsInfo' + description: The sort order of the items + filterInfo: + type: object + properties: + filters: + $ref: '#/components/schemas/CommonGrants.Models.AppFilters' + errors: + type: array + items: + type: string + description: Non-fatal errors that occurred during filtering + required: + - filters + description: The filters applied to the response items + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A paginated list of items with a filter + tags: + - Applications + - experimental + - Application Reviews + /common-grants/applications/start: + post: + operationId: Applications_startApplication + summary: Start an application + description: Start a new application for a given competition. + parameters: [] + responses: + '201': + description: A 201 response with data + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.ApplicationBase' + description: Response data + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A 201 response with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/CommonGrants.Responses.Error' + tags: + - Applications + - experimental + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + competitionId: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: The ID of the competition to start an application for + organizationId: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: The ID of the organization to start an application for, if applying on behalf of an organization + name: + type: string + description: The name of the application + required: + - competitionId + - name + /common-grants/applications/{appId}: + get: + operationId: Applications_getApplication + summary: View an application + description: View an application for a given competition, along with its form responses and validation errors. + parameters: + - name: appId + in: path + required: true + description: The ID of the application to get + schema: + $ref: '#/components/schemas/CommonGrants.Types.uuid' + responses: + '200': + description: A 200 response with data + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.ApplicationBase' + description: Response data + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A 200 response with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/CommonGrants.Responses.Error' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/CommonGrants.Responses.Error' + tags: + - Applications + - experimental + /common-grants/applications/{appId}/forms/{formId}: + put: + operationId: Applications_setFormResponse + summary: Respond to a form + description: Set or update the response to a given form in an application. + parameters: + - name: appId + in: path + required: true + description: The ID of the application to whose form response is being updated + schema: + $ref: '#/components/schemas/CommonGrants.Types.uuid' + - name: formId + in: path + required: true + description: The ID of the form whose response is being updated + schema: + $ref: '#/components/schemas/CommonGrants.Types.uuid' + responses: + '200': + description: A 200 response with data + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.AppFormResponse' + description: Response data + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A 200 response with data + tags: + - Applications + - experimental + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: {} + description: The response to the form + get: + operationId: Applications_getFormResponse + summary: Get a form response + description: Get the response to a given form in an application. + parameters: + - name: appId + in: path + required: true + description: The ID of the application to whose form response is being retrieved + schema: + $ref: '#/components/schemas/CommonGrants.Types.uuid' + - name: formId + in: path + required: true + description: The ID of the form whose response is being retrieved + schema: + $ref: '#/components/schemas/CommonGrants.Types.uuid' + responses: + '200': + description: A 200 response with data + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.AppFormResponse' + description: Response data + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A 200 response with data + tags: + - Applications + - experimental + /common-grants/applications/{appId}/submit: + put: + operationId: Applications_submitApplication + summary: Submit an application + description: Submit an application to a competition. Applications that have validation errors will be blocked from submitting until the errors are fixed. + parameters: + - name: appId + in: path + required: true + description: The ID of the application to submit + schema: + $ref: '#/components/schemas/CommonGrants.Types.uuid' + responses: + '200': + description: A 200 response with data + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + description: Response data + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A 200 response with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/CommonGrants.Responses.Error' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/CommonGrants.Responses.Error' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/CommonGrants.Responses.ApplicationSubmissionError' + tags: + - Applications + - experimental + /common-grants/competitions/{compId}: + get: + operationId: Competitions_read + summary: View competition details + description: |- + View details about a competition for a given funding opportunity. + + Each competition may have a distinct set of forms, be limited to a + certain types of applicants, or have a different application period. + parameters: + - name: compId + in: path + required: true + description: The ID of the competition to view + schema: + $ref: '#/components/schemas/CommonGrants.Types.uuid' + responses: + '200': + description: A 200 response with data + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.CompetitionBase' + description: Response data + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A 200 response with data + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/CommonGrants.Responses.Error' + tags: + - Competitions + - experimental + /common-grants/forms: + get: + operationId: Forms_list + summary: List forms + description: Get a paginated list of forms, sorted by `lastModifiedAt` with most recent first. + parameters: + - $ref: '#/components/parameters/CommonGrants.Pagination.PaginatedQueryParams.page' + - $ref: '#/components/parameters/CommonGrants.Pagination.PaginatedQueryParams.pageSize' + responses: + '200': + description: A 200 response with a paginated list of items + content: + application/json: + schema: + type: object + required: + - items + - paginationInfo + properties: + items: + type: array + items: + $ref: '#/components/schemas/CommonGrants.Models.FormBase' + description: Items from the current page + paginationInfo: + allOf: + - $ref: '#/components/schemas/CommonGrants.Pagination.PaginatedResultsInfo' + description: Details about the paginated results + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A 200 response with a paginated list of items + tags: + - Forms + - experimental + /common-grants/forms/{formId}: + get: + operationId: Forms_read + summary: View form details + description: View details about a given form. + parameters: + - name: formId + in: path + required: true + description: The ID of the form to view + schema: + $ref: '#/components/schemas/CommonGrants.Types.uuid' + responses: + '200': + description: A 200 response with data + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.FormBase' + description: Response data + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A 200 response with data + tags: + - Forms + - experimental + /common-grants/opportunities: + get: + operationId: Opportunities_list + summary: List opportunities + description: Get a paginated list of opportunities, sorted by `lastModifiedAt` with most recent first. + parameters: + - $ref: '#/components/parameters/CommonGrants.Pagination.PaginatedQueryParams.page' + - $ref: '#/components/parameters/CommonGrants.Pagination.PaginatedQueryParams.pageSize' + responses: + '200': + description: A 200 response with a paginated list of items + content: + application/json: + schema: + type: object + required: + - items + - paginationInfo + properties: + items: + type: array + items: + $ref: '#/components/schemas/CommonGrants.Models.OpportunityBase' + description: Items from the current page + paginationInfo: + allOf: + - $ref: '#/components/schemas/CommonGrants.Pagination.PaginatedResultsInfo' + description: Details about the paginated results + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A 200 response with a paginated list of items + tags: + - Opportunities + - required + /common-grants/opportunities/search: + post: + operationId: Opportunities_search + summary: Search opportunities + description: Search for opportunities based on the provided filters. + parameters: [] + responses: + '200': + description: A paginated list of items with a filter + content: + application/json: + schema: + type: object + required: + - items + - paginationInfo + - status + - message + - sortInfo + - filterInfo + properties: + items: + type: array + items: + $ref: '#/components/schemas/CommonGrants.Models.OpportunityBase' + description: Items from the current page + paginationInfo: + allOf: + - $ref: '#/components/schemas/CommonGrants.Pagination.PaginatedResultsInfo' + description: Details about the paginated results + status: + type: integer + format: int32 + example: 200 + message: + type: string + example: Success + sortInfo: + allOf: + - $ref: '#/components/schemas/CommonGrants.Sorting.SortedResultsInfo' + description: The sort order of the items + filterInfo: + type: object + properties: + filters: + $ref: '#/components/schemas/CommonGrants.Models.OppFilters' + errors: + type: array + items: + type: string + description: Non-fatal errors that occurred during filtering + required: + - filters + description: The filters applied to the response items + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A paginated list of items with a filter + tags: + - Opportunities + - optional + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + search: + type: string + description: Opportunity search query + example: Pre-school education + filters: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.OppFilters' + description: |- + Filters to apply to the opportunity search + + Multiple filter conditions will be combined with AND logic, so that + results only include opportunities that match all of the provided filters. + sorting: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.OppSorting' + description: The sort order to apply to the results + pagination: + allOf: + - $ref: '#/components/schemas/CommonGrants.Pagination.PaginatedBodyParams' + description: Pagination instructions for the results + /common-grants/opportunities/{oppId}: + get: + operationId: Opportunities_read + summary: View opportunity details + description: View details about an opportunity. + parameters: + - name: oppId + in: path + required: true + description: The ID of the opportunity to view + schema: + $ref: '#/components/schemas/CommonGrants.Types.uuid' + responses: + '200': + description: A 200 response with data + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.OpportunityDetails' + description: Response data + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Success' + description: A 200 response with data + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/CommonGrants.Responses.Error' + tags: + - Opportunities + - required +components: + parameters: + CommonGrants.Pagination.PaginatedQueryParams.page: + name: page + in: query + required: false + description: The page to return + schema: + type: integer + format: int32 + minimum: 1 + default: 1 + explode: false + CommonGrants.Pagination.PaginatedQueryParams.pageSize: + name: pageSize + in: query + required: false + description: The number of items to return per page + schema: + type: integer + format: int32 + minimum: 1 + default: 100 + explode: false + schemas: + CommonGrants.Fields.CustomField: + type: object + required: + - name + - fieldType + - value + properties: + name: + type: string + description: Name of the custom field + fieldType: + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.CustomFieldType' + description: The JSON schema type to use when de-serializing the `value` field + schema: + type: string + format: uri + description: Link to the full JSON schema for this custom field + value: + description: Value of the custom field + description: + type: string + description: Description of the custom field's purpose + description: A custom field on a model + example: + name: eligibilityType + fieldType: array + value: + - nonprofit + - academic + description: Types of eligible organizations + CommonGrants.Fields.CustomFieldType: + type: string + enum: + - string + - number + - integer + - boolean + - object + - array + description: The set of JSON schema types supported by a custom field + CommonGrants.Fields.DateRangeEvent: + type: object + required: + - eventType + - startDate + - endDate + properties: + eventType: + type: string + enum: + - dateRange + description: Type of event + startDate: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.isoDate' + description: 'Start date of the event in ISO 8601 format: YYYY-MM-DD' + startTime: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.isoTime' + description: 'Start time of the event in ISO 8601 format: HH:MM:SS' + endDate: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.isoDate' + description: 'End date of the event in ISO 8601 format: YYYY-MM-DD' + endTime: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.isoTime' + description: 'End time of the event in ISO 8601 format: HH:MM:SS' + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.EventBase' + description: Description of an event that has a start and end date (and possible time) associated with it + example: + name: Application period + eventType: dateRange + startDate: '2024-01-01' + endDate: '2024-01-31' + endTime: '17:00:00' + description: Primary application period for the grant opportunity + CommonGrants.Fields.Event: + anyOf: + - $ref: '#/components/schemas/CommonGrants.Fields.SingleDateEvent' + - $ref: '#/components/schemas/CommonGrants.Fields.DateRangeEvent' + - $ref: '#/components/schemas/CommonGrants.Fields.OtherEvent' + description: Union of all event types + CommonGrants.Fields.EventBase: + type: object + required: + - name + - eventType + properties: + name: + type: string + description: Human-readable name of the event (e.g., 'Application posted', 'Question deadline') + eventType: + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.EventType' + description: Type of event + description: + type: string + description: Description of what this event represents + discriminator: + propertyName: eventType + mapping: + dateRange: '#/components/schemas/CommonGrants.Fields.DateRangeEvent' + other: '#/components/schemas/CommonGrants.Fields.OtherEvent' + description: Base model for all events + CommonGrants.Fields.EventType: + type: string + enum: + - singleDate + - dateRange + - other + description: |- + Type of event (e.g., a single date, a date range, or a custom event) + + - singleDate: A single date (and possible time) + - dateRange: A period of time with a start and end date + - other: Other event type (e.g., a recurring event) + CommonGrants.Fields.File: + type: object + required: + - downloadUrl + - name + - createdAt + - lastModifiedAt + properties: + downloadUrl: + type: string + format: uri + description: The file's download URL. + name: + type: string + description: The file's name. + description: + type: string + description: The file's description. + sizeInBytes: + type: number + description: The file's size in bytes. + mimeType: + type: string + description: The file's MIME type. + createdAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was created. + readOnly: true + lastModifiedAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was last modified. + readOnly: true + description: A field representing a downloadable file. + example: + downloadUrl: https://example.com/file.pdf + name: example.pdf + description: A PDF file with instructions + sizeInBytes: 1000 + mimeType: application/pdf + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + CommonGrants.Fields.Money: + type: object + required: + - amount + - currency + properties: + amount: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.decimalString' + description: The amount of money + currency: + type: string + description: The ISO 4217 currency code in which the amount is denominated + description: A monetary amount and the currency in which it's denominated + example: + amount: '-50.50' + currency: USD + CommonGrants.Fields.OtherEvent: + type: object + required: + - eventType + properties: + eventType: + type: string + enum: + - other + description: Type of event + details: + type: string + description: Details of the event's timeline (e.g. "Every other Tuesday") + description: + type: string + description: Description of the event + example: Applications begin being accepted + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.EventBase' + description: Description of an event that is not a single date or date range + example: + name: Info sessions + eventType: other + details: Every other Tuesday at 10:00 AM during the application period + description: Info sessions for the opportunity + CommonGrants.Fields.SingleDateEvent: + type: object + required: + - eventType + - date + properties: + eventType: + type: string + enum: + - singleDate + description: Type of event + date: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.isoDate' + description: 'Date of the event in in ISO 8601 format: YYYY-MM-DD' + time: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.isoTime' + description: 'Time of the event in ISO 8601 format: HH:MM:SS' + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.EventBase' + description: Description of an event that has a date (and possible time) associated with it + example: + name: Opportunity close date + eventType: singleDate + date: '2024-12-31' + time: '17:00:00' + description: Opportunity closes for all applications + CommonGrants.Filters.AllOperators: + type: string + enum: + - eq + - neq + - gt + - gte + - lt + - lte + - in + - notIn + - between + - outside + - like + - notLike + CommonGrants.Filters.ArrayOperators: + type: string + enum: + - in + - notIn + description: Operators that filter a field based on an array of values + CommonGrants.Filters.ComparisonOperators: + type: string + enum: + - gt + - gte + - lt + - lte + description: Operators that filter a field based on a comparison to a value + CommonGrants.Filters.DateRangeFilter: + type: object + required: + - operator + - value + properties: + operator: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.RangeOperators' + description: The operator to apply to the filter value + value: + type: object + properties: + min: + anyOf: + - $ref: '#/components/schemas/CommonGrants.Types.isoDate' + - type: string + format: date-time + - type: string + format: date-time + max: + anyOf: + - $ref: '#/components/schemas/CommonGrants.Types.isoDate' + - type: string + format: date-time + - type: string + format: date-time + required: + - min + - max + description: The value to use for the filter operation + example: + min: '2021-01-01' + max: '2021-01-02' + description: Filters by comparing a field to a range of date values + CommonGrants.Filters.DefaultFilter: + type: object + required: + - operator + - value + properties: + operator: + anyOf: + - $ref: '#/components/schemas/CommonGrants.Filters.EquivalenceOperators' + - $ref: '#/components/schemas/CommonGrants.Filters.ComparisonOperators' + - $ref: '#/components/schemas/CommonGrants.Filters.ArrayOperators' + - $ref: '#/components/schemas/CommonGrants.Filters.StringOperators' + - $ref: '#/components/schemas/CommonGrants.Filters.RangeOperators' + - $ref: '#/components/schemas/CommonGrants.Filters.AllOperators' + description: The operator to apply to the filter value + value: + description: The value to use for the filter operation + description: A base filter model that can be used to create more specific filter models + CommonGrants.Filters.EquivalenceOperators: + type: string + enum: + - eq + - neq + description: Operators that filter a field based on an exact match to a value + CommonGrants.Filters.MoneyRangeFilter: + type: object + required: + - operator + - value + properties: + operator: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.RangeOperators' + description: The operator to apply to the filter value + value: + type: object + properties: + min: + $ref: '#/components/schemas/CommonGrants.Fields.Money' + max: + $ref: '#/components/schemas/CommonGrants.Fields.Money' + required: + - min + - max + description: The value to use for the filter operation + example: + min: + amount: '1000' + currency: USD + max: + amount: '10000' + currency: USD + description: Filters by comparing a field to a range of monetary values + CommonGrants.Filters.RangeOperators: + type: string + enum: + - between + - outside + description: Operators that filter a field based on a range of values + CommonGrants.Filters.StringArrayFilter: + type: object + required: + - operator + - value + properties: + operator: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.ArrayOperators' + description: The operator to apply to the filter value + value: + type: array + items: + type: string + description: The value to use for the filter operation + example: + - value1 + - value2 + description: Filters by comparing a field to an array of string values + CommonGrants.Filters.StringOperators: + type: string + enum: + - like + - notLike + description: Operators that filter a field based on a string value + CommonGrants.Models.AppDefaultFilters: + type: object + properties: + opportunityId: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.StringArrayFilter' + description: '`opportunityId` matches one of the following values' + example: + operator: in + value: + - ad3b469a-d89a-42d3-c439-6c1234567890 + competitionId: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.StringArrayFilter' + description: '`competitionId` matches one of the following values' + example: + operator: in + value: + - 123e4567-e89b-12d3-a456-426614174000 + submittedAtRange: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.DateRangeFilter' + description: '`submittedAt` is between the given range' + example: + operator: between + value: + min: '2025-01-01' + max: '2025-01-30' + status: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.StringArrayFilter' + description: '`status.value` matches one of the following values' + example: + operator: in + value: + - submitted + - accepted + allOf: + - type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Filters.DefaultFilter' + description: The standard set of filters supported for application searches + CommonGrants.Models.AppFilters: + type: object + properties: + opportunityId: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.StringArrayFilter' + description: '`opportunityId` matches one of the following values' + example: + operator: in + value: + - ad3b469a-d89a-42d3-c439-6c1234567890 + competitionId: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.StringArrayFilter' + description: '`competitionId` matches one of the following values' + example: + operator: in + value: + - 123e4567-e89b-12d3-a456-426614174000 + submittedAtRange: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.DateRangeFilter' + description: '`submittedAt` is between the given range' + example: + operator: between + value: + min: '2025-01-01' + max: '2025-01-30' + status: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.StringArrayFilter' + description: '`status.value` matches one of the following values' + example: + operator: in + value: + - submitted + - accepted + customFilters: + type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Filters.DefaultFilter' + description: Additional implementation-defined filters to apply to the search + description: Filters to apply when searching for applications + CommonGrants.Models.AppFormResponse: + type: object + required: + - applicationId + - id + - formId + - response + - status + - createdAt + - lastModifiedAt + properties: + applicationId: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: The unique identifier for the application + id: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: The unique identifier for the form response + formId: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: The form being responded to + response: + type: object + additionalProperties: {} + description: The response to the form + status: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.FormResponseStatus' + description: The status of the form response + validationErrors: + type: array + items: {} + description: The validation errors for the form response + customFields: + type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Fields.CustomField' + description: Custom attributes about the form response + createdAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was created. + readOnly: true + lastModifiedAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was last modified. + readOnly: true + description: The model for a form response included in an application + example: + applicationId: 123e4567-e89b-12d3-a456-426614174000 + id: 123e4567-e89b-12d3-a456-426614174000 + formId: 123e4567-e89b-12d3-a456-426614174000 + response: + firstName: John + lastName: Doe + email: john.doe@example.com + phone: 123-456-7890 + address: + street: 123 Main St + city: Anytown + state: CA + zip: '12345' + country: null + status: + value: inProgress + description: The form response is in progress + validationErrors: + - field: address.country + message: Country is required + createdAt: '2021-01-01T00:00:00Z' + lastModifiedAt: '2021-01-01T00:00:00Z' + CommonGrants.Models.AppSortBy: + type: string + enum: + - lastModifiedAt + - createdAt + - submittedAt + - status.value + - opportunityId + - competitionId + - custom + description: The fields that can be used to sort applications + CommonGrants.Models.AppSorting: + type: object + required: + - sortBy + properties: + sortBy: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.AppSortBy' + description: The field to sort by + example: opportunityId + allOf: + - $ref: '#/components/schemas/CommonGrants.Sorting.SortBodyParams' + description: Sorting parameters for applications + CommonGrants.Models.AppStatus: + type: object + required: + - value + properties: + value: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.AppStatusOptions' + description: The status of the application, from a predefined set of options + customValue: + type: string + description: A custom value for the status + description: + type: string + description: A human-readable description of the status + description: The status of the application + example: + value: submitted + description: The application has been submitted. + CommonGrants.Models.AppStatusOptions: + type: string + enum: + - inProgress + - submitted + - accepted + - rejected + - custom + description: |- + The default set of values accepted for application status: + - `inProgress`: The application is in progress + - `submitted`: The application has been submitted and is being reviewed + - `accepted`: The application has been accepted + - `rejected`: The application has been rejected + - `custom`: A custom status + CommonGrants.Models.ApplicantType: + type: object + required: + - value + properties: + value: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.ApplicantTypeOptions' + description: The type of applicant + customValue: + type: string + description: The custom value for the applicant type + description: + type: string + description: The description of the applicant type + description: The type of applicant eligible to apply for funding + example: + value: individual + description: An individual applicant + CommonGrants.Models.ApplicantTypeOptions: + type: string + enum: + - individual + - organization + - government_state + - government_county + - government_municipal + - government_special_district + - government_tribal + - organization_tribal_other + - school_district_independent + - higher_education_public + - higher_education_private + - non_profit_with_501c3 + - nonprofit_without_501c3 + - for_profit_small_business + - for_profit_not_small_business + - unrestricted + - custom + description: The set of possible applicant types + CommonGrants.Models.ApplicationBase: + type: object + required: + - id + - name + - competitionId + - opportunityId + - formResponses + - status + - createdAt + - lastModifiedAt + properties: + id: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: The unique identifier for the application + name: + type: string + description: The name of the application + competitionId: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: The unique identifier for the competition + opportunityId: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: The unique identifier for the opportunity being applied to + formResponses: + type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Models.AppFormResponse' + description: The form responses for the application + status: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.AppStatus' + description: The status of the application + submittedAt: + type: string + format: date-time + nullable: true + description: The date and time the application was submitted + validationErrors: + type: array + items: {} + description: The validation errors for the application and form responses + customFields: + type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Fields.CustomField' + description: The custom fields about the application + createdAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was created. + readOnly: true + lastModifiedAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was last modified. + readOnly: true + description: The base model for an application to a competition for a funding opportunity + example: + id: 123e4567-e89b-12d3-a456-426614174000 + name: My Application + competitionId: 123e4567-e89b-12d3-a456-426614174000 + opportunityId: ad3b469a-d89a-42d3-c439-6c1234567890 + formResponses: + formA: + applicationId: 123e4567-e89b-12d3-a456-426614174000 + id: 123e4567-e89b-12d3-a456-426614174000 + formId: 123e4567-e89b-12d3-a456-426614174000 + response: + firstName: John + lastName: Doe + email: john.doe@example.com + phone: 123-456-7890 + address: + street: 123 Main St + city: Anytown + state: CA + zip: '12345' + country: null + status: + value: inProgress + description: The form response is in progress + validationErrors: + - field: address.country + message: Country is required + createdAt: '2021-01-01T00:00:00Z' + lastModifiedAt: '2021-01-01T00:00:00Z' + status: + value: inProgress + description: The application is in progress. + submittedAt: null + createdAt: '2021-01-01T00:00:00Z' + lastModifiedAt: '2021-01-01T00:00:00Z' + customFields: + attachments: + name: attachments + fieldType: object + value: + contacts: + downloadUrl: https://example.com/file.pdf + name: example.pdf + description: A PDF file with instructions + sizeInBytes: 1000 + mimeType: application/pdf + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + budget: + downloadUrl: https://example.com/excel.xlsx + name: excel.xlsx + description: The excel file for the application + sizeInBytes: 1000 + mimeType: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + description: The attachments for the application + applicationZipFile: + name: applicationZipFile + fieldType: object + value: + downloadUrl: https://example.com/application.zip + name: application.zip + description: The zip file for the application + sizeInBytes: 50000 + mimeType: application/zip + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + description: The zip file for the application + CommonGrants.Models.CompetitionBase: + type: object + required: + - id + - opportunityId + - title + - status + - forms + - createdAt + - lastModifiedAt + properties: + id: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: Globally unique id for the competition + opportunityId: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: The opportunity id for the competition + title: + type: string + description: The title of the competition + description: + type: string + description: The description of the competition + instructions: + anyOf: + - type: string + - type: array + items: + $ref: '#/components/schemas/CommonGrants.Fields.File' + description: The instructions for the competition + status: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.CompetitionStatus' + description: The status of the competition + keyDates: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.CompetitionTimeline' + description: The key dates in the competition timeline + forms: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.CompetitionForms' + description: The forms for the competition + acceptedApplicantTypes: + type: array + items: + $ref: '#/components/schemas/CommonGrants.Models.ApplicantType' + description: Accepted applicant types for the competition + customFields: + type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Fields.CustomField' + description: The custom fields for the competition + createdAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was created. + readOnly: true + lastModifiedAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was last modified. + readOnly: true + description: |- + The base model for a competition. + + A competition is an application process for a funding opportunity. It often has a + distinct application period and set of application forms. + example: + id: b7c1e2f4-8a3d-4e2a-9c5b-1f2e3d4c5b6a + opportunityId: b7c1e2f4-8a3d-4e2a-9c5b-1f2e3d4c5b6b + title: Competition 1 + description: Competition 1 description + instructions: Competition 1 instructions + status: + value: open + customValue: custom + description: Competition is open for applications + keyDates: + openDate: + name: Open Date + eventType: singleDate + date: '2025-01-01' + closeDate: + name: Close Date + eventType: singleDate + date: '2025-01-30' + otherDates: + reviewPeriod: + name: Application Review Period + eventType: dateRange + startDate: '2025-02-01' + endDate: '2025-02-28' + forms: + forms: + formA: + id: b7c1e2f4-8a3d-4e2a-9c5b-1f2e3d4c5b6a + name: Form A + description: Form A description + instructions: Form A instructions + jsonSchema: + $id: formA.json + type: object + properties: + name: + first: + type: string + last: + type: string + email: + type: string + phone: + type: string + uiSchema: + type: VerticalLayout + elements: + - type: Group + label: Name + elements: + - type: Control + scope: '#/properties/name/first' + - type: Control + scope: '#/properties/name/last' + - type: Control + scope: '#/properties/email' + - type: Control + scope: '#/properties/phone' + mappingToCommonGrants: + name: + firstName: + field: name.first + lastName: + field: name.last + emails: + primary: + field: email + phones: + primary: + field: phone + mappingFromCommonGrants: + name: + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + formB: + id: b7c1e2f4-8a3d-4e2a-9c5b-1f2e3d4c5b6a + name: Form A + description: Form A description + instructions: Form A instructions + jsonSchema: + $id: formA.json + type: object + properties: + name: + first: + type: string + last: + type: string + email: + type: string + phone: + type: string + uiSchema: + type: VerticalLayout + elements: + - type: Group + label: Name + elements: + - type: Control + scope: '#/properties/name/first' + - type: Control + scope: '#/properties/name/last' + - type: Control + scope: '#/properties/email' + - type: Control + scope: '#/properties/phone' + mappingToCommonGrants: + name: + firstName: + field: name.first + lastName: + field: name.last + emails: + primary: + field: email + phones: + primary: + field: phone + mappingFromCommonGrants: + name: + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + validation: + required: + - formA + - formB + createdAt: '2025-01-01T00:00:00Z' + lastModifiedAt: '2025-01-01T00:00:00Z' + CommonGrants.Models.CompetitionForms: + type: object + required: + - forms + properties: + forms: + type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Models.FormBase' + description: The forms for the competition + validation: + type: object + additionalProperties: {} + description: The validation rules for the competition forms + description: Set of forms that need to be completed to apply to the competition. + example: + forms: + formA: + id: b7c1e2f4-8a3d-4e2a-9c5b-1f2e3d4c5b6a + name: Form A + description: Form A description + instructions: Form A instructions + jsonSchema: + $id: formA.json + type: object + properties: + name: + first: + type: string + last: + type: string + email: + type: string + phone: + type: string + uiSchema: + type: VerticalLayout + elements: + - type: Group + label: Name + elements: + - type: Control + scope: '#/properties/name/first' + - type: Control + scope: '#/properties/name/last' + - type: Control + scope: '#/properties/email' + - type: Control + scope: '#/properties/phone' + mappingToCommonGrants: + name: + firstName: + field: name.first + lastName: + field: name.last + emails: + primary: + field: email + phones: + primary: + field: phone + mappingFromCommonGrants: + name: + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + formB: + id: b7c1e2f4-8a3d-4e2a-9c5b-1f2e3d4c5b6a + name: Form A + description: Form A description + instructions: Form A instructions + jsonSchema: + $id: formA.json + type: object + properties: + name: + first: + type: string + last: + type: string + email: + type: string + phone: + type: string + uiSchema: + type: VerticalLayout + elements: + - type: Group + label: Name + elements: + - type: Control + scope: '#/properties/name/first' + - type: Control + scope: '#/properties/name/last' + - type: Control + scope: '#/properties/email' + - type: Control + scope: '#/properties/phone' + mappingToCommonGrants: + name: + firstName: + field: name.first + lastName: + field: name.last + emails: + primary: + field: email + phones: + primary: + field: phone + mappingFromCommonGrants: + name: + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + validation: + required: + - formA + - formB + CommonGrants.Models.CompetitionStatus: + type: object + required: + - value + properties: + value: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.CompetitionStatusOptions' + description: The status of the competition, from a predefined set of options + customValue: + type: string + description: A custom value for the status + description: + type: string + description: A human-readable description of the status + description: The status of the competition + example: + value: open + customValue: custom + description: Competition is open for applications + CommonGrants.Models.CompetitionStatusOptions: + type: string + enum: + - open + - closed + - custom + description: |- + The set of values accepted for competition status + - `open`: The competition is open for applications + - `closed`: The competition is no longer accepting applications + - `custom`: A custom status + CommonGrants.Models.CompetitionTimeline: + type: object + properties: + openDate: + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.Event' + description: The start date of the competition + closeDate: + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.Event' + description: The end date of the competition + otherDates: + type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Fields.Event' + description: The date the competition was created + description: Key dates in the competition's timeline. + example: + openDate: + name: Open Date + eventType: singleDate + date: '2025-01-01' + closeDate: + name: Close Date + eventType: singleDate + date: '2025-01-30' + otherDates: + reviewPeriod: + name: Application Review Period + eventType: dateRange + startDate: '2025-02-01' + endDate: '2025-02-28' + CommonGrants.Models.FormBase: + type: object + required: + - id + - name + - createdAt + - lastModifiedAt + properties: + id: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: The form's unique identifier. + name: + type: string + description: The form's name. + description: + type: string + description: The form's description. + version: + type: string + instructions: + anyOf: + - type: string + - type: array + items: + $ref: '#/components/schemas/CommonGrants.Fields.File' + description: The form's instructions. + jsonSchema: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.FormJsonSchema' + description: The form's JSON schema used to render the form and validate responses. + uiSchema: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.FormUISchema' + description: The form's UI schema used to render the form in the browser. + mappingToCommonGrants: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.MappingSchema' + description: A mapping from form schema to CommonGrants schema. + mappingFromCommonGrants: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.MappingSchema' + description: A mapping from CommonGrants schema to form schema. + customFields: + type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Fields.CustomField' + description: Custom attributes about the form itself, not custom fields within the form. + createdAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was created. + readOnly: true + lastModifiedAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was last modified. + readOnly: true + description: A form for collecting data from a user. + example: + id: b7c1e2f4-8a3d-4e2a-9c5b-1f2e3d4c5b6a + name: Form A + description: Form A description + instructions: Form A instructions + jsonSchema: + $id: formA.json + type: object + properties: + name: + first: + type: string + last: + type: string + email: + type: string + phone: + type: string + uiSchema: + type: VerticalLayout + elements: + - type: Group + label: Name + elements: + - type: Control + scope: '#/properties/name/first' + - type: Control + scope: '#/properties/name/last' + - type: Control + scope: '#/properties/email' + - type: Control + scope: '#/properties/phone' + mappingToCommonGrants: + name: + firstName: + field: name.first + lastName: + field: name.last + emails: + primary: + field: email + phones: + primary: + field: phone + mappingFromCommonGrants: + name: + first: + field: name.firstName + last: + field: name.lastName + email: + field: emails.primary + phone: + field: phones.primary + createdAt: '2025-01-01T17:01:01' + lastModifiedAt: '2025-01-02T17:30:00' + CommonGrants.Models.FormJsonSchema: + type: object + additionalProperties: {} + description: A JSON schema used to validate form responses. + example: + $id: formA.json + type: object + properties: + name: + first: + type: string + last: + type: string + email: + type: string + phone: + type: string + CommonGrants.Models.FormResponseStatus: + type: object + required: + - value + properties: + value: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.FormResponseStatusOptions' + description: The status of the form response, from a predefined set of options + customValue: + type: string + description: A custom value for the status + description: + type: string + description: A human-readable description of the status + description: The status of the form response + example: + value: inProgress + description: The form response is in progress + CommonGrants.Models.FormResponseStatusOptions: + type: string + enum: + - notStarted + - inProgress + - complete + description: |- + The set of values accepted for form response status: + - `notStarted`: The form response has not been started + - `inProgress`: The form response is in progress + - `complete`: The form response is complete, meaning all required fields have been filled out and there are no validation errors + - `custom`: A custom status + CommonGrants.Models.FormUISchema: + type: object + additionalProperties: {} + description: A UI schema used to render the form in the browser. + example: + type: VerticalLayout + elements: + - type: Group + label: Name + elements: + - type: Control + scope: '#/properties/name/first' + - type: Control + scope: '#/properties/name/last' + - type: Control + scope: '#/properties/email' + - type: Control + scope: '#/properties/phone' + CommonGrants.Models.MappingConstantFunction: + type: object + required: + - const + properties: + const: {} + description: Returns a constant value. + example: + const: '123' + CommonGrants.Models.MappingFieldFunction: + type: object + required: + - field + properties: + field: + type: string + description: Returns the value of a field in the source data. + example: + field: summary.opportunity_amount + CommonGrants.Models.MappingFunction: + anyOf: + - $ref: '#/components/schemas/CommonGrants.Models.MappingConstantFunction' + - $ref: '#/components/schemas/CommonGrants.Models.MappingFieldFunction' + - $ref: '#/components/schemas/CommonGrants.Models.MappingSwitchFunction' + description: The set of supported mapping functions. + example: + switch: + field: summary.opportunity_status + case: + active: open + inactive: closed + default: custom + CommonGrants.Models.MappingSchema: + type: object + additionalProperties: + anyOf: + - $ref: '#/components/schemas/CommonGrants.Models.MappingFunction' + - $ref: '#/components/schemas/CommonGrants.Models.MappingSchema' + description: |- + A mapping format for translating data from one schema to another. + + Example: + + The following mapping: + + ```json + { + "id": { "const": "123" }, + "opportunity": { + "status": { + "switch": { + "field": "summary.opportunity_status", + "case": { "active": "open", "inactive": "closed" }, + "default": "custom", + }, + }, + "amount": { "field": "summary.opportunity_amount" }, + } + } + ``` + + Will translate the following data: + + ```json + { + "id": "123", + "summary": { + "opportunity_status": "active", + "opportunity_amount": 100, + }, + } + ``` + + To the following data: + + ```json + { + "id": "123", + "opportunity": { "status": "open", "amount": 100 }, + } + ``` + example: + id: + const: '123' + opportunity: + status: + switch: + field: summary.opportunity_status + case: + active: open + inactive: closed + default: custom + amount: + field: summary.opportunity_amount + CommonGrants.Models.MappingSwitchFunction: + type: object + required: + - switch + properties: + switch: + type: object + properties: + field: + type: string + description: The field in the source data to switch on. + case: + type: object + additionalProperties: {} + description: An object mapping source field values to desired output values. + default: + description: The default value to output if no case matches the source field value. + required: + - field + - case + description: Returns a new value based on the value of a field in the source data using a switch statement. + example: + switch: + field: summary.opportunity_status + case: + active: open + inactive: closed + default: custom + CommonGrants.Models.OppDefaultFilters: + type: object + properties: + status: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.StringArrayFilter' + description: '`status.value` matches one of the following values' + example: + operator: in + value: + - forecasted + - open + closeDateRange: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.DateRangeFilter' + description: '`keyDates.closeDate` is between the given range' + example: + operator: between + value: + min: '2021-01-01' + max: '2021-01-02' + totalFundingAvailableRange: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.MoneyRangeFilter' + description: |- + `funding.totalAmountAvailable` is between the given range + + Funding amounts that are denominated in a different currency will + be excluded from the search. + example: + operator: between + value: + min: + amount: '1000000' + currency: USD + max: + amount: '2000000' + currency: USD + minAwardAmountRange: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.MoneyRangeFilter' + description: |- + `funding.minAwardAmount` is between the given range + + Funding amounts that are denominated in a different currency will + be excluded from the search. + example: + operator: between + value: + min: + amount: '1000000' + currency: USD + max: + amount: '2000000' + currency: USD + maxAwardAmountRange: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.MoneyRangeFilter' + description: |- + `funding.maxAwardAmount` is between the given range. + + Funding amounts that are denominated in a different currency will + be excluded from the search. + example: + operator: between + value: + min: + amount: '1000000' + currency: USD + max: + amount: '2000000' + currency: USD + allOf: + - type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Filters.DefaultFilter' + description: The standard set of filters supported for opportunity searches + CommonGrants.Models.OppFilters: + type: object + properties: + status: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.StringArrayFilter' + description: '`status.value` matches one of the following values' + example: + operator: in + value: + - forecasted + - open + closeDateRange: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.DateRangeFilter' + description: '`keyDates.closeDate` is between the given range' + example: + operator: between + value: + min: '2021-01-01' + max: '2021-01-02' + totalFundingAvailableRange: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.MoneyRangeFilter' + description: |- + `funding.totalAmountAvailable` is between the given range + + Funding amounts that are denominated in a different currency will + be excluded from the search. + example: + operator: between + value: + min: + amount: '1000000' + currency: USD + max: + amount: '2000000' + currency: USD + minAwardAmountRange: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.MoneyRangeFilter' + description: |- + `funding.minAwardAmount` is between the given range + + Funding amounts that are denominated in a different currency will + be excluded from the search. + example: + operator: between + value: + min: + amount: '1000000' + currency: USD + max: + amount: '2000000' + currency: USD + maxAwardAmountRange: + allOf: + - $ref: '#/components/schemas/CommonGrants.Filters.MoneyRangeFilter' + description: |- + `funding.maxAwardAmount` is between the given range. + + Funding amounts that are denominated in a different currency will + be excluded from the search. + example: + operator: between + value: + min: + amount: '1000000' + currency: USD + max: + amount: '2000000' + currency: USD + customFilters: + type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Filters.DefaultFilter' + description: Additional implementation-defined filters to apply to the search + description: Filters to apply when searching for opportunities + CommonGrants.Models.OppFunding: + type: object + properties: + details: + type: string + description: Details about the funding available for this opportunity that don't fit other fields + totalAmountAvailable: + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.Money' + description: Total amount of funding available for this opportunity + minAwardAmount: + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.Money' + description: Minimum amount of funding granted per award + maxAwardAmount: + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.Money' + description: Maximum amount of funding granted per award + minAwardCount: + type: integer + description: Minimum number of awards granted + maxAwardCount: + type: integer + description: Maximum number of awards granted + estimatedAwardCount: + type: integer + description: Estimated number of awards that will be granted + description: Details about the funding available for this opportunity + example: + totalAmountAvailable: + amount: '1000000.00' + currency: USD + minAwardAmount: + amount: '10000.00' + currency: USD + maxAwardAmount: + amount: '50000.00' + currency: USD + minAwardCount: 5 + maxAwardCount: 20 + estimatedAwardCount: 10 + CommonGrants.Models.OppSortBy: + type: string + enum: + - lastModifiedAt + - createdAt + - title + - status.value + - keyDates.closeDate + - funding.maxAwardAmount + - funding.minAwardAmount + - funding.totalAmountAvailable + - funding.estimatedAwardCount + - custom + CommonGrants.Models.OppSorting: + type: object + required: + - sortBy + properties: + sortBy: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.OppSortBy' + description: The field to sort by + example: lastModifiedAt + allOf: + - $ref: '#/components/schemas/CommonGrants.Sorting.SortBodyParams' + CommonGrants.Models.OppStatus: + type: object + required: + - value + properties: + value: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.OppStatusOptions' + description: The status of the opportunity, from a predefined set of options + customValue: + type: string + description: A custom value for the status + description: + type: string + description: A human-readable description of the status + description: The status of the opportunity + example: + value: open + description: The opportunity is currently accepting applications + CommonGrants.Models.OppStatusOptions: + type: string + enum: + - forecasted + - open + - closed + - custom + description: |- + The set of values accepted for opportunity status: + - `forecasted`: The opportunity is forecasted and not yet open for applications + - `open`: The opportunity is open for applications + - `closed`: The opportunity is no longer accepting applications + - `custom`: A custom status + CommonGrants.Models.OppTimeline: + type: object + properties: + postDate: + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.Event' + description: The date (and time) at which the opportunity is posted + closeDate: + allOf: + - $ref: '#/components/schemas/CommonGrants.Fields.Event' + description: The date (and time) at which the opportunity closes + otherDates: + type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Fields.Event' + description: |- + An optional map of other key dates or events in the opportunity timeline + + Examples might include a deadline for questions, anticipated award date, etc. + description: Key dates and events in the opportunity's timeline, such as when the opportunity is posted and closes + example: + postDate: + name: Application posted date + eventType: singleDate + date: '2024-01-15' + description: Opportunity is posted publicly + closeDate: + name: Opportunity close date + eventType: singleDate + date: '2024-12-31' + time: '17:00:00' + description: Opportunity closes for all applications + otherDates: + anticipatedAward: + name: Anticipated award date + eventType: singleDate + date: '2025-03-15' + description: When we expect to announce awards for this opportunity. + applicationPeriod: + name: Application period + eventType: dateRange + startDate: '2024-01-01' + endDate: '2024-01-31' + endTime: '17:00:00' + description: Primary application period for the grant opportunity + performancePeriod: + name: Period of Performance + eventType: dateRange + startDate: '2024-01-01' + endDate: '2024-12-31' + description: Period of performance for the grant + infoSessions: + name: Info sessions + eventType: other + details: Every other Tuesday + description: Info sessions for the opportunity + CommonGrants.Models.OpportunityBase: + type: object + required: + - id + - title + - status + - description + - createdAt + - lastModifiedAt + properties: + id: + allOf: + - $ref: '#/components/schemas/CommonGrants.Types.uuid' + description: Globally unique id for the opportunity + readOnly: true + title: + type: string + description: Title or name of the funding opportunity + example: Small business grant program + status: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.OppStatus' + description: Status of the opportunity + description: + type: string + description: Description of the opportunity's purpose and scope + example: This program provides funding to small businesses to help them grow and create jobs + funding: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.OppFunding' + description: Details about the funding available + keyDates: + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.OppTimeline' + description: Key dates for the opportunity, such as when the application opens and closes + acceptedApplicantTypes: + type: array + items: + $ref: '#/components/schemas/CommonGrants.Models.ApplicantType' + description: The type of applicant for the opportunity + source: + type: string + format: uri + description: URL for the original source of the opportunity + customFields: + type: object + additionalProperties: + $ref: '#/components/schemas/CommonGrants.Fields.CustomField' + description: Additional custom fields specific to this opportunity + createdAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was created. + readOnly: true + lastModifiedAt: + type: string + format: date-time + description: The timestamp (in UTC) at which the record was last modified. + readOnly: true + description: A funding opportunity + CommonGrants.Models.OpportunityDetails: + type: object + properties: + competitions: + type: array + items: + $ref: '#/components/schemas/CommonGrants.Models.CompetitionBase' + description: The competitions associated with the opportunity + allOf: + - $ref: '#/components/schemas/CommonGrants.Models.OpportunityBase' + description: A funding opportunity with additional details, like available competitions. + CommonGrants.Pagination.PaginatedBodyParams: + type: object + properties: + page: + type: integer + format: int32 + minimum: 1 + description: The page to return + default: 1 + pageSize: + type: integer + format: int32 + minimum: 1 + description: The number of items to return per page + default: 100 + description: Body parameters for paginated routes + CommonGrants.Pagination.PaginatedResultsInfo: + type: object + required: + - page + - pageSize + properties: + page: + type: integer + format: int32 + minimum: 1 + description: Current page number (indexing starts at 1) + example: 1 + pageSize: + type: integer + minimum: 1 + description: Number of items per page + example: 20 + totalItems: + type: integer + description: Total number of items across all pages + example: 100 + totalPages: + type: integer + description: Total number of pages + example: 5 + description: Details about the paginated results + CommonGrants.Responses.ApplicationSubmissionError: + type: object + required: + - status + properties: + status: + type: number + enum: + - 400 + example: 400 + allOf: + - $ref: '#/components/schemas/CommonGrants.Responses.Error' + description: A failure to submit an application due to validation errors + example: + status: 400 + message: Application submission failed due to validation errors + errors: + - field: formA.name + message: Name is required + CommonGrants.Responses.Error: + type: object + required: + - status + - message + - errors + properties: + status: + type: integer + format: int32 + example: 400 + message: + type: string + description: Human-readable error message + example: Error + errors: + type: array + items: {} + description: List of errors + description: A non-2xx response schema + CommonGrants.Responses.Success: + type: object + required: + - status + - message + properties: + status: + type: integer + format: int32 + example: 200 + message: + type: string + example: Success + CommonGrants.Sorting.SortBodyParams: + type: object + required: + - sortBy + properties: + sortBy: + description: The field to sort by + example: lastModifiedAt + customSortBy: + type: string + description: Implementation-defined sort key + example: customField + sortOrder: + allOf: + - $ref: '#/components/schemas/CommonGrants.Sorting.SortOrder' + description: The order to sort by + example: asc + description: Sorting parameters included in the request body + CommonGrants.Sorting.SortOrder: + type: string + enum: + - asc + - desc + CommonGrants.Sorting.SortedResultsInfo: + type: object + required: + - sortBy + - sortOrder + properties: + sortBy: + type: string + description: The field results are sorted by, or "custom" if an implementation-defined sort key is used + example: lastModifiedAt + customSortBy: + type: string + description: Implementation-defined sort key used to sort the results, if applicable + example: customField + sortOrder: + allOf: + - $ref: '#/components/schemas/CommonGrants.Sorting.SortOrder' + description: The order in which the results are sorted, e.g. ascending or descending + example: asc + errors: + type: array + items: + type: string + description: Non-fatal errors that occurred during sorting + description: Information about the sort order of the items returned + CommonGrants.Types.decimalString: + type: string + pattern: ^-?[0-9]+\.?[0-9]*$ + description: A decimal number (with variable scale) encoded as a string, to avoid floating point issues + example: '-100.5' + CommonGrants.Types.isoDate: + type: string + format: date + description: A date on a calendar in ISO 8601 format YYYY-MM-DD + example: '2025-01-01' + CommonGrants.Types.isoTime: + type: string + format: time + description: A time on a clock, without a timezone, in ISO 8601 format HH:mm:ss + example: '17:00:00' + CommonGrants.Types.uuid: + type: string + format: uuid + description: A universally unique identifier + example: 30a12e5e-5940-4c08-921c-17a8960fcf4b From 06016ae9b18a0147f68ddca9ae3fd382b0066ef9 Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 12:26:22 -0500 Subject: [PATCH 16/22] refactor(ts-sdk): Updates NumberComparisonFilterSchema We updated the core library to accept Equivalence operators so we need the schemas to accept them as well --- lib/ts-sdk/__tests__/schemas/zod/filters.spec.ts | 4 ++-- lib/ts-sdk/src/schemas/zod/filters.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ts-sdk/__tests__/schemas/zod/filters.spec.ts b/lib/ts-sdk/__tests__/schemas/zod/filters.spec.ts index 2d3b9338b..a124ff4ba 100644 --- a/lib/ts-sdk/__tests__/schemas/zod/filters.spec.ts +++ b/lib/ts-sdk/__tests__/schemas/zod/filters.spec.ts @@ -261,8 +261,8 @@ describe("NumberComparisonFilter Schema", () => { }); it("should raise an error for an invalid NumberComparisonFilter", () => { - // "eq" is not a comparison operator (only gt, gte, lt, lte are allowed) - expect(() => NumberComparisonFilterSchema.parse({ operator: "eq", value: 100 })).toThrow(); + // "in" is not a comparison operator (only eq, neq, gt, gte, lt, lte are allowed) + expect(() => NumberComparisonFilterSchema.parse({ operator: "in", value: 100 })).toThrow(); // Value must be a number, not a string expect(() => NumberComparisonFilterSchema.parse({ operator: "gt", value: "100" })).toThrow(); // Missing required "value" field diff --git a/lib/ts-sdk/src/schemas/zod/filters.ts b/lib/ts-sdk/src/schemas/zod/filters.ts index 9df8f22cd..9522c9f25 100644 --- a/lib/ts-sdk/src/schemas/zod/filters.ts +++ b/lib/ts-sdk/src/schemas/zod/filters.ts @@ -51,7 +51,7 @@ export const StringArrayFilterSchema = z.object({ // ############################################################################ export const NumberComparisonFilterSchema = z.object({ - operator: ComparisonOperatorsEnum, + operator: z.union([ComparisonOperatorsEnum, EquivalenceOperatorsEnum]), value: z.number(), }); From c34f4d2a6e0a518cb81c468a4493d55eff257533 Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 12:37:18 -0500 Subject: [PATCH 17/22] fix: Vulnerability in root-level pnpm lockfile --- pnpm-lock.yaml | 14 +++++++------- pnpm-workspace.yaml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d22a17d23..2ed3cf21e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ overrides: fast-xml-parser@>=4.3.6 <=5.3.3: '>=5.3.4' glob@>=10.2.0 <10.5.0: '>=10.5.0' lodash@>=4.0.0 <=4.17.22: '>=4.17.23' - qs@<6.14.1: '>=6.14.1' + qs@<6.14.1: '>=6.14.2' tar@<7.5.7: '>=7.5.7' tar@=7.5.1: '>=7.5.2' undici@>=7.0.0 <7.18.2: '>=7.18.2' @@ -5919,8 +5919,8 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + qs@6.14.2: + resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} engines: {node: '>=0.6'} quansync@0.2.11: @@ -10979,7 +10979,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.14.1 + qs: 6.14.2 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -11922,7 +11922,7 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.14.1 + qs: 6.14.2 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.0 @@ -14036,7 +14036,7 @@ snapshots: pure-rand@6.1.0: {} - qs@6.14.1: + qs@6.14.2: dependencies: side-channel: 1.1.0 @@ -14798,7 +14798,7 @@ snapshots: formidable: 3.5.4 methods: 1.1.2 mime: 2.6.0 - qs: 6.14.1 + qs: 6.14.2 transitivePeerDependencies: - supports-color diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 50e71256f..56076d2b5 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,7 +13,7 @@ overrides: fast-xml-parser@>=4.3.6 <=5.3.3: ">=5.3.4" glob@>=10.2.0 <10.5.0: ">=10.5.0" lodash@>=4.0.0 <=4.17.22: ">=4.17.23" - qs@<6.14.1: ">=6.14.1" + qs@<6.14.1: ">=6.14.2" tar@<7.5.7: ">=7.5.7" tar@=7.5.1: ">=7.5.2" undici@>=7.0.0 <7.18.2: ">=7.18.2" From f7db527b32bfd89315d015360cf593b28aa12a34 Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 12:39:42 -0500 Subject: [PATCH 18/22] ci(website): Fix formatting issue --- website/src/content/docs/protocol/filters/string.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/content/docs/protocol/filters/string.mdx b/website/src/content/docs/protocol/filters/string.mdx index 77c9c6553..95c4d1780 100644 --- a/website/src/content/docs/protocol/filters/string.mdx +++ b/website/src/content/docs/protocol/filters/string.mdx @@ -83,7 +83,7 @@ A filter that applies a comparison to an array of string values. | Property | Type | Required | Description | | -------- | ------------------------------------------------------------------------------- | -------- | ----------------------------------------- | -| operator | [ArrayOperators](/protocol/filters/base#arrayoperators) | Yes | The operator to apply to the filter value | +| operator | [ArrayOperators](/protocol/filters/base#arrayoperators) | Yes | The operator to apply to the filter value | | value | [Array](/protocol/types/other#array)\<[string](/protocol/types/string#string)\> | Yes | The value to use for the filter operation | ### Formats From d1018e8fb6c38f8eb4ac814d2159baf3c7b11ddb Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 12:55:17 -0500 Subject: [PATCH 19/22] refactor(core): Fix version added for Competition schemas --- lib/core/lib/core/models/competition.tsp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/core/lib/core/models/competition.tsp b/lib/core/lib/core/models/competition.tsp index 90b06cc19..a092fd7e5 100644 --- a/lib/core/lib/core/models/competition.tsp +++ b/lib/core/lib/core/models/competition.tsp @@ -49,7 +49,7 @@ model CompetitionBase { /** The status of the competition */ @example(Examples.Competition.status) -@Versioning.added(CommonGrants.Versions.v0_1) +@Versioning.added(CommonGrants.Versions.v0_2) model CompetitionStatus { /** The status of the competition, from a predefined set of options */ value: CompetitionStatusOptions; @@ -70,7 +70,7 @@ model CompetitionStatus { * - `closed`: The competition is no longer accepting applications * - `custom`: A custom status */ -@Versioning.added(CommonGrants.Versions.v0_1) +@Versioning.added(CommonGrants.Versions.v0_2) enum CompetitionStatusOptions { open, closed, @@ -83,7 +83,7 @@ enum CompetitionStatusOptions { /** Set of forms that need to be completed to apply to the competition. */ @example(Examples.Competition.forms) -@Versioning.added(CommonGrants.Versions.v0_1) +@Versioning.added(CommonGrants.Versions.v0_2) model CompetitionForms { /** The forms for the competition */ forms: Record; @@ -98,7 +98,7 @@ model CompetitionForms { /** Key dates in the competition's timeline. */ @example(Examples.Competition.keyDates) -@Versioning.added(CommonGrants.Versions.v0_1) +@Versioning.added(CommonGrants.Versions.v0_2) model CompetitionTimeline { /** The start date of the competition */ openDate?: Fields.Event; From 22a4b1c4dc67309ae783e0bdca3c627c371ec0ef Mon Sep 17 00:00:00 2001 From: widal001 Date: Thu, 12 Feb 2026 13:34:51 -0500 Subject: [PATCH 20/22] refactor(website): Update default OpenAPI docs --- website/src/components/OpenApiDocs.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/src/components/OpenApiDocs.tsx b/website/src/components/OpenApiDocs.tsx index c103c4265..b2a29477a 100644 --- a/website/src/components/OpenApiDocs.tsx +++ b/website/src/components/OpenApiDocs.tsx @@ -4,13 +4,13 @@ import "swagger-ui-react/swagger-ui.css"; // Available OpenAPI versions const availableVersions = [ - { version: "0.3.0", label: "v0.3.0 (Pre-release)" }, - { version: "0.2.0", label: "v0.2.0 (Latest)" }, + { version: "0.3.0", label: "v0.3.0 (Latest)" }, + { version: "0.2.0", label: "v0.2.0" }, { version: "0.1.0", label: "v0.1.0" }, ]; // Get the default version (latest) -const defaultVersion = availableVersions[1].version; +const defaultVersion = availableVersions[0].version; interface OpenApiDocsProps { className?: string; From 0d638a7c480e2917f9af39dd5c3ebcbb974d812e Mon Sep 17 00:00:00 2001 From: widal001 Date: Fri, 13 Feb 2026 16:51:10 -0500 Subject: [PATCH 21/22] docs(core): Update JSON schema example for Event --- lib/cli/lib/openapi/openapi.0.1.0.yaml | 2 +- lib/cli/lib/openapi/openapi.0.2.0.yaml | 2 +- lib/cli/lib/openapi/openapi.0.3.0.yaml | 2 +- lib/core/lib/core/fields/event.tsp | 2 +- website/public/openapi/openapi.0.1.0.yaml | 2 +- website/public/openapi/openapi.0.2.0.yaml | 2 +- website/public/openapi/openapi.0.3.0.yaml | 2 +- website/public/schemas/yaml/OppTimeline.yaml | 2 +- website/public/schemas/yaml/SingleDateEvent.yaml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/cli/lib/openapi/openapi.0.1.0.yaml b/lib/cli/lib/openapi/openapi.0.1.0.yaml index 1ad9dc535..c3704a827 100644 --- a/lib/cli/lib/openapi/openapi.0.1.0.yaml +++ b/lib/cli/lib/openapi/openapi.0.1.0.yaml @@ -821,7 +821,7 @@ components: description: Key dates and events in the opportunity's timeline, such as when the opportunity is posted and closes example: postDate: - name: Application posted date + name: Opportunity posted date eventType: singleDate date: '2024-01-15' description: Opportunity is posted publicly diff --git a/lib/cli/lib/openapi/openapi.0.2.0.yaml b/lib/cli/lib/openapi/openapi.0.2.0.yaml index e7c7de9bf..7d2919290 100644 --- a/lib/cli/lib/openapi/openapi.0.2.0.yaml +++ b/lib/cli/lib/openapi/openapi.0.2.0.yaml @@ -2183,7 +2183,7 @@ components: description: Key dates and events in the opportunity's timeline, such as when the opportunity is posted and closes example: postDate: - name: Application posted date + name: Opportunity posted date eventType: singleDate date: '2024-01-15' description: Opportunity is posted publicly diff --git a/lib/cli/lib/openapi/openapi.0.3.0.yaml b/lib/cli/lib/openapi/openapi.0.3.0.yaml index 781e2d647..a3967b9f6 100644 --- a/lib/cli/lib/openapi/openapi.0.3.0.yaml +++ b/lib/cli/lib/openapi/openapi.0.3.0.yaml @@ -2375,7 +2375,7 @@ components: description: Key dates and events in the opportunity's timeline, such as when the opportunity is posted and closes example: postDate: - name: Application posted date + name: Opportunity posted date eventType: singleDate date: '2024-01-15' description: Opportunity is posted publicly diff --git a/lib/core/lib/core/fields/event.tsp b/lib/core/lib/core/fields/event.tsp index fbd961dd1..198290527 100644 --- a/lib/core/lib/core/fields/event.tsp +++ b/lib/core/lib/core/fields/event.tsp @@ -140,7 +140,7 @@ namespace Examples.Event { /** An example of an opportunity posted date without a specific time */ const postedDate = #{ - name: "Application posted date", + name: "Opportunity posted date", eventType: EventType.singleDate, date: isoDate.fromISO("2024-01-15"), description: "Opportunity is posted publicly", diff --git a/website/public/openapi/openapi.0.1.0.yaml b/website/public/openapi/openapi.0.1.0.yaml index 1ad9dc535..c3704a827 100644 --- a/website/public/openapi/openapi.0.1.0.yaml +++ b/website/public/openapi/openapi.0.1.0.yaml @@ -821,7 +821,7 @@ components: description: Key dates and events in the opportunity's timeline, such as when the opportunity is posted and closes example: postDate: - name: Application posted date + name: Opportunity posted date eventType: singleDate date: '2024-01-15' description: Opportunity is posted publicly diff --git a/website/public/openapi/openapi.0.2.0.yaml b/website/public/openapi/openapi.0.2.0.yaml index e7c7de9bf..7d2919290 100644 --- a/website/public/openapi/openapi.0.2.0.yaml +++ b/website/public/openapi/openapi.0.2.0.yaml @@ -2183,7 +2183,7 @@ components: description: Key dates and events in the opportunity's timeline, such as when the opportunity is posted and closes example: postDate: - name: Application posted date + name: Opportunity posted date eventType: singleDate date: '2024-01-15' description: Opportunity is posted publicly diff --git a/website/public/openapi/openapi.0.3.0.yaml b/website/public/openapi/openapi.0.3.0.yaml index 781e2d647..a3967b9f6 100644 --- a/website/public/openapi/openapi.0.3.0.yaml +++ b/website/public/openapi/openapi.0.3.0.yaml @@ -2375,7 +2375,7 @@ components: description: Key dates and events in the opportunity's timeline, such as when the opportunity is posted and closes example: postDate: - name: Application posted date + name: Opportunity posted date eventType: singleDate date: '2024-01-15' description: Opportunity is posted publicly diff --git a/website/public/schemas/yaml/OppTimeline.yaml b/website/public/schemas/yaml/OppTimeline.yaml index 977d9ede5..fc9988c1d 100644 --- a/website/public/schemas/yaml/OppTimeline.yaml +++ b/website/public/schemas/yaml/OppTimeline.yaml @@ -18,7 +18,7 @@ unevaluatedProperties: not: {} examples: - postDate: - name: Application posted date + name: Opportunity posted date eventType: singleDate date: 2024-01-15 description: Opportunity is posted publicly diff --git a/website/public/schemas/yaml/SingleDateEvent.yaml b/website/public/schemas/yaml/SingleDateEvent.yaml index 06c512a0e..19e1a7925 100644 --- a/website/public/schemas/yaml/SingleDateEvent.yaml +++ b/website/public/schemas/yaml/SingleDateEvent.yaml @@ -25,7 +25,7 @@ examples: date: 2024-12-31 time: 17:00:00 description: Opportunity closes for all applications - - name: Application posted date + - name: Opportunity posted date eventType: singleDate date: 2024-01-15 description: Opportunity is posted publicly From dbc97249c0db91ade859cc4cca077f747d6db74a Mon Sep 17 00:00:00 2001 From: widal001 Date: Fri, 13 Feb 2026 17:10:54 -0500 Subject: [PATCH 22/22] build: Adds changesets for CLI and core --- .changeset/hot-pets-marry.md | 13 +++++++++++++ .changeset/moody-shoes-lay.md | 10 ++++++++++ 2 files changed, 23 insertions(+) create mode 100644 .changeset/hot-pets-marry.md create mode 100644 .changeset/moody-shoes-lay.md diff --git a/.changeset/hot-pets-marry.md b/.changeset/hot-pets-marry.md new file mode 100644 index 000000000..c232e44f6 --- /dev/null +++ b/.changeset/hot-pets-marry.md @@ -0,0 +1,13 @@ +--- +"@common-grants/cli": minor +--- + +Supports checking APIs against the v0.3.0 CommonGrants OpenAPI spec. + +Enables CLI users to check against the v0.3.0 CommonGrants OpenAPI spec. This will be the new default version when running `cg check spec` + +Users can still validate against previous versions of the CommonGrants OpenAPI spec by specifying the `--protocol-version` flag. For example: + +```bash +cg check spec openapi.yaml --protocol-version 0.2.0 +``` diff --git a/.changeset/moody-shoes-lay.md b/.changeset/moody-shoes-lay.md new file mode 100644 index 000000000..2c061f559 --- /dev/null +++ b/.changeset/moody-shoes-lay.md @@ -0,0 +1,10 @@ +--- +"@common-grants/core": minor +--- + +Adds models and routes for application reviews. + +- Adds new OpenAPI tag for "Application reviews" +- Adds new route `POST /common-grants/applications/search/` and a set of supporting models +- Changes `NumberComparisonFilter.operator` type to `ComparisonOperators | EquivalenceOperators` so that we can filter using `eq` and `neq` in addition to `ge`, `gte`, etc. +- Adds explicit `@Versioning.added()` decorator to all schemas, so that the version in which a schema was added is explicitly defined, rather than defaulting to v0.1.0