import {z} from 'zod' export type GetApiV2HmaSubapplicationsArgs = {$filter?: string | undefined, $top?: number | undefined, $skip?: number | undefined, $count?: boolean | undefined, $filename?: string | undefined, $metadata?: boolean | undefined, $gzip?: boolean | undefined, $orderby?: (Array<'subapplicationIdentifier' | 'subapplicationIdentifier desc' | 'program' | 'program desc' | 'fiscalYear' | 'fiscalYear desc' | 'region' | 'region desc' | 'applicantUei' | 'applicantUei desc' | 'applicantName' | 'applicantName desc' | 'subapplicantUei' | 'subapplicantUei desc' | 'subapplicantName' | 'subapplicantName desc' | 'subapplicantCity' | 'subapplicantCity desc' | 'subapplicantState' | 'subapplicantState desc' | 'subapplicantStateAbbreviation' | 'subapplicantStateAbbreviation desc' | 'subapplicantZipCode' | 'subapplicantZipCode desc' | 'subapplicantZip4' | 'subapplicantZip4 desc' | 'subjectEO12372' | 'subjectEO12372 desc' | 'eo12372ReviewDate' | 'eo12372ReviewDate desc' | 'subapplicantFederalDebt' | 'subapplicantFederalDebt desc' | 'dateInitiatedInSystem' | 'dateInitiatedInSystem desc' | 'dateSubmittedToApplicant' | 'dateSubmittedToApplicant desc' | 'dateSubmittedToFema' | 'dateSubmittedToFema desc' | 'subapplicationTitle' | 'subapplicationTitle desc' | 'proposedProjectStartDate' | 'proposedProjectStartDate desc' | 'proposedProjectEndDate' | 'proposedProjectEndDate desc' | 'estimatedTotalDuration' | 'estimatedTotalDuration desc' | 'fundingCategory' | 'fundingCategory desc' | 'subapplicantType' | 'subapplicantType desc' | 'status' | 'status desc' | 'subapplicationType' | 'subapplicationType desc' | 'benefitingCounties' | 'benefitingCounties desc' | 'primaryActivity' | 'primaryActivity desc' | 'primarySubactivity' | 'primarySubactivity desc' | 'secondaryActivity' | 'secondaryActivity desc' | 'secondarySubactivity' | 'secondarySubactivity desc' | 'tertiaryActivity' | 'tertiaryActivity desc' | 'tertiarySubactivity' | 'tertiarySubactivity desc' | 'primaryCommunityLifeline' | 'primaryCommunityLifeline desc' | 'primaryCommunityLifelineComponent' | 'primaryCommunityLifelineComponent desc' | 'secondaryCommunityLifeline' | 'secondaryCommunityLifeline desc' | 'secondaryCommunityLifelineComponent' | 'secondaryCommunityLifelineComponent desc' | 'tertiaryCommunityLifeline' | 'tertiaryCommunityLifeline desc' | 'tertiaryCommunityLifelineComponent' | 'tertiaryCommunityLifelineComponent desc' | 'primaryHazard' | 'primaryHazard desc' | 'secondaryHazard' | 'secondaryHazard desc' | 'tertiaryHazard' | 'tertiaryHazard desc' | 'natureBasedSolution' | 'natureBasedSolution desc' | 'smallImpoverished' | 'smallImpoverished desc' | 'populationAffected' | 'populationAffected desc' | 'phasedProject' | 'phasedProject desc' | 'construction' | 'construction desc' | 'priorSubapplication' | 'priorSubapplication desc' | 'communityRatingSystem' | 'communityRatingSystem desc' | 'crsRating' | 'crsRating desc' | 'cooperatingTechnicalPartner' | 'cooperatingTechnicalPartner desc' | 'adoptedIcc' | 'adoptedIcc desc' | 'yearBuildingCode' | 'yearBuildingCode desc' | 'buildingCodesOnBcegs' | 'buildingCodesOnBcegs desc' | 'bcegsRating' | 'bcegsRating desc' | 'mitigationPlanCovered' | 'mitigationPlanCovered desc' | 'mitigationPlanType' | 'mitigationPlanType desc' | 'mitigationPlanSubtype' | 'mitigationPlanSubtype desc' | 'dateMitigationPlanApproved' | 'dateMitigationPlanApproved desc' | 'costEffectivenessMethod' | 'costEffectivenessMethod desc' | 'preCalculatedBenefit' | 'preCalculatedBenefit desc' | 'environmentalBenefit' | 'environmentalBenefit desc' | 'seaLevelRise' | 'seaLevelRise desc' | 'socialBenefit' | 'socialBenefit desc' | 'mitigatingProjectSiteInventory' | 'mitigatingProjectSiteInventory desc' | 'projectSiteInventoryLocationKnown' | 'projectSiteInventoryLocationKnown desc' | 'numberBuildingLocations' | 'numberBuildingLocations desc' | 'numberInfrastructureLocations' | 'numberInfrastructureLocations desc' | 'numberVacantLandLocations' | 'numberVacantLandLocations desc' | 'federalShareAmount' | 'federalShareAmount desc' | 'nonFederalShareAmount' | 'nonFederalShareAmount desc' | 'mgmtFederalShareAmount' | 'mgmtFederalShareAmount desc' | 'mgmtNonFederalShareAmount' | 'mgmtNonFederalShareAmount desc' | 'totalSubapplicationAmount' | 'totalSubapplicationAmount desc' | 'totalObligatedAmount' | 'totalObligatedAmount desc' | 'totalPaymentAmount' | 'totalPaymentAmount desc' | 'federalSharePercentage' | 'federalSharePercentage desc' | 'nonFederalSharePercentage' | 'nonFederalSharePercentage desc' | 'benefitCostRatio' | 'benefitCostRatio desc' | 'bcaTotalBenefits' | 'bcaTotalBenefits desc' | 'bcaTotalCosts' | 'bcaTotalCosts desc' | 'disasterNumber' | 'disasterNumber desc' | 'selectionStatus' | 'selectionStatus desc' | 'selectionFundingCategory' | 'selectionFundingCategory desc' | 'selectionProgramActivity' | 'selectionProgramActivity desc' | 'selectionFederalShareAmount' | 'selectionFederalShareAmount desc' | 'selectionFundCode' | 'selectionFundCode desc' | 'id' | 'id desc'>) | undefined, $select?: (Array<'subapplicationIdentifier' | 'program' | 'fiscalYear' | 'region' | 'applicantUei' | 'applicantName' | 'subapplicantUei' | 'subapplicantName' | 'subapplicantCity' | 'subapplicantState' | 'subapplicantStateAbbreviation' | 'subapplicantZipCode' | 'subapplicantZip4' | 'subjectEO12372' | 'eo12372ReviewDate' | 'subapplicantFederalDebt' | 'dateInitiatedInSystem' | 'dateSubmittedToApplicant' | 'dateSubmittedToFema' | 'subapplicationTitle' | 'proposedProjectStartDate' | 'proposedProjectEndDate' | 'estimatedTotalDuration' | 'fundingCategory' | 'subapplicantType' | 'status' | 'subapplicationType' | 'benefitingCounties' | 'primaryActivity' | 'primarySubactivity' | 'secondaryActivity' | 'secondarySubactivity' | 'tertiaryActivity' | 'tertiarySubactivity' | 'primaryCommunityLifeline' | 'primaryCommunityLifelineComponent' | 'secondaryCommunityLifeline' | 'secondaryCommunityLifelineComponent' | 'tertiaryCommunityLifeline' | 'tertiaryCommunityLifelineComponent' | 'primaryHazard' | 'secondaryHazard' | 'tertiaryHazard' | 'natureBasedSolution' | 'smallImpoverished' | 'populationAffected' | 'phasedProject' | 'construction' | 'priorSubapplication' | 'communityRatingSystem' | 'crsRating' | 'cooperatingTechnicalPartner' | 'adoptedIcc' | 'yearBuildingCode' | 'buildingCodesOnBcegs' | 'bcegsRating' | 'mitigationPlanCovered' | 'mitigationPlanType' | 'mitigationPlanSubtype' | 'dateMitigationPlanApproved' | 'costEffectivenessMethod' | 'preCalculatedBenefit' | 'environmentalBenefit' | 'seaLevelRise' | 'socialBenefit' | 'mitigatingProjectSiteInventory' | 'projectSiteInventoryLocationKnown' | 'numberBuildingLocations' | 'numberInfrastructureLocations' | 'numberVacantLandLocations' | 'federalShareAmount' | 'nonFederalShareAmount' | 'mgmtFederalShareAmount' | 'mgmtNonFederalShareAmount' | 'totalSubapplicationAmount' | 'totalObligatedAmount' | 'totalPaymentAmount' | 'federalSharePercentage' | 'nonFederalSharePercentage' | 'benefitCostRatio' | 'bcaTotalBenefits' | 'bcaTotalCosts' | 'disasterNumber' | 'selectionStatus' | 'selectionFundingCategory' | 'selectionProgramActivity' | 'selectionFederalShareAmount' | 'selectionFundCode' | 'id'>) | undefined, $format?: ('json' | 'jsona' | 'csv' | 'jsonl' | 'parquet') | undefined}; export type GetApiV2HmaSubapplicationsOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const metadata = z.object({skip: z.number().nullable().optional(), filter: z.string().nullable().optional(), orderBy: z.string().nullable().optional(), select: z.string().nullable().optional(), rundate: z.string().nullable().optional(), top: z.number().nullable().optional(), format: z.string().nullable().optional(), metadata: z.boolean().nullable().optional(), entityname: z.string().optional(), version: z.string().optional(), url: z.string().optional(), count: z.number().nullable().optional()}); export const v2HmaSubapplications = z.object({subapplicationIdentifier: z.string().optional(), program: z.string().optional(), fiscalYear: z.number().optional(), region: z.number().optional(), applicantUei: z.string().nullable().optional(), applicantName: z.string().optional(), subapplicantUei: z.string().nullable().optional(), subapplicantName: z.string().optional(), subapplicantCity: z.string().nullable().optional(), subapplicantState: z.string().nullable().optional(), subapplicantStateAbbreviation: z.string().nullable().optional(), subapplicantZipCode: z.string().nullable().optional(), subapplicantZip4: z.string().nullable().optional(), subjectEO12372: z.string().nullable().optional(), eo12372ReviewDate: z.string().nullable().optional(), subapplicantFederalDebt: z.boolean().nullable().optional(), dateInitiatedInSystem: z.string().nullable().optional(), dateSubmittedToApplicant: z.string().nullable().optional(), dateSubmittedToFema: z.string().nullable().optional(), subapplicationTitle: z.string().nullable().optional(), proposedProjectStartDate: z.string().nullable().optional(), proposedProjectEndDate: z.string().nullable().optional(), estimatedTotalDuration: z.number().nullable().optional(), fundingCategory: z.string().nullable().optional(), subapplicantType: z.string().nullable().optional(), status: z.string().nullable().optional(), subapplicationType: z.string().nullable().optional(), benefitingCounties: z.string().nullable().optional(), primaryActivity: z.string().nullable().optional(), primarySubactivity: z.string().nullable().optional(), secondaryActivity: z.string().nullable().optional(), secondarySubactivity: z.string().nullable().optional(), tertiaryActivity: z.string().nullable().optional(), tertiarySubactivity: z.string().nullable().optional(), primaryCommunityLifeline: z.string().nullable().optional(), primaryCommunityLifelineComponent: z.string().nullable().optional(), secondaryCommunityLifeline: z.string().nullable().optional(), secondaryCommunityLifelineComponent: z.string().nullable().optional(), tertiaryCommunityLifeline: z.string().nullable().optional(), tertiaryCommunityLifelineComponent: z.string().nullable().optional(), primaryHazard: z.string().nullable().optional(), secondaryHazard: z.string().nullable().optional(), tertiaryHazard: z.string().nullable().optional(), natureBasedSolution: z.string().nullable().optional(), smallImpoverished: z.boolean().nullable().optional(), populationAffected: z.number().nullable().optional(), phasedProject: z.boolean().nullable().optional(), construction: z.boolean().nullable().optional(), priorSubapplication: z.boolean().nullable().optional(), communityRatingSystem: z.boolean().nullable().optional(), crsRating: z.number().nullable().optional(), cooperatingTechnicalPartner: z.boolean().nullable().optional(), adoptedIcc: z.boolean().nullable().optional(), yearBuildingCode: z.number().nullable().optional(), buildingCodesOnBcegs: z.boolean().nullable().optional(), bcegsRating: z.number().nullable().optional(), mitigationPlanCovered: z.boolean().nullable().optional(), mitigationPlanType: z.string().nullable().optional(), mitigationPlanSubtype: z.string().nullable().optional(), dateMitigationPlanApproved: z.string().nullable().optional(), costEffectivenessMethod: z.string().nullable().optional(), preCalculatedBenefit: z.string().nullable().optional(), environmentalBenefit: z.boolean().nullable().optional(), seaLevelRise: z.boolean().nullable().optional(), socialBenefit: z.boolean().nullable().optional(), mitigatingProjectSiteInventory: z.boolean().nullable().optional(), projectSiteInventoryLocationKnown: z.boolean().nullable().optional(), numberBuildingLocations: z.number().nullable().optional(), numberInfrastructureLocations: z.number().nullable().optional(), numberVacantLandLocations: z.number().nullable().optional(), federalShareAmount: z.number().nullable().optional(), nonFederalShareAmount: z.number().nullable().optional(), mgmtFederalShareAmount: z.number().nullable().optional(), mgmtNonFederalShareAmount: z.number().nullable().optional(), totalSubapplicationAmount: z.number().nullable().optional(), totalObligatedAmount: z.number().nullable().optional(), totalPaymentAmount: z.number().nullable().optional(), federalSharePercentage: z.number().nullable().optional(), nonFederalSharePercentage: z.number().nullable().optional(), benefitCostRatio: z.number().nullable().optional(), bcaTotalBenefits: z.number().nullable().optional(), bcaTotalCosts: z.number().nullable().optional(), disasterNumber: z.string().nullable().optional(), selectionStatus: z.string().nullable().optional(), selectionFundingCategory: z.string().nullable().optional(), selectionProgramActivity: z.string().nullable().optional(), selectionFederalShareAmount: z.number().nullable().optional(), selectionFundCode: z.string().nullable().optional(), id: z.string().optional()}); export const getApiV2HmaSubapplicationsResponse = z.object({metadata: metadata.optional(), HmaSubapplications: z.array(v2HmaSubapplications).optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * HMA Subapplications * * GET /v2/HmaSubapplications */ export const getApiV2HmaSubapplications = async (args: GetApiV2HmaSubapplicationsArgs, options?: GetApiV2HmaSubapplicationsOptions) => { const {baseUrl = "https://www.fema.gov/api/open", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.$filter != null) query.append("$filter", String(args.$filter)) if (args.$top != null) query.append("$top", String(args.$top)) if (args.$skip != null) query.append("$skip", String(args.$skip)) if (args.$count != null) query.append("$count", String(args.$count)) if (args.$filename != null) query.append("$filename", String(args.$filename)) if (args.$metadata != null) query.append("$metadata", String(args.$metadata)) if (args.$gzip != null) query.append("$gzip", String(args.$gzip)) for (const item of args.$orderby ?? []) query.append("$orderby", String(item)) for (const item of args.$select ?? []) query.append("$select", String(item)) if (args.$format != null) query.append("$format", String(args.$format)) const url = `${baseUrl.replace(/\/+$/, '')}/v2/HmaSubapplications${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiV2HmaSubapplicationsResponse, await res.json()) };