@lineai/gov-deals
Version:
Explore Federal contracts for government building renovations, city hall renovations, courthouse updates, library modernizations, federal building improvement contracts, base housing and facilities upgrades.
237 lines • 13.1 kB
JavaScript
/**
* Configuration constants for the gov-deals package
* These values can be updated as the SAM.gov API evolves
*/
import { z } from 'zod';
/**
* SAM.gov Opportunity Type Codes
* Source: SAM.gov API Documentation
* Last verified: 2024
*/
export const OPPORTUNITY_TYPES = {
PRESOLICITATION: 'p',
SOLICITATION: 'o',
AWARD_NOTICE: 'a',
INTENT_TO_BUNDLE: 'i',
JUSTIFICATION: 'u',
SOURCES_SOUGHT: 'r',
SPECIAL_NOTICE: 's',
COMBINED_SYNOPSIS: 'k',
SALE_OF_SURPLUS: 'g',
};
// Zod schema for runtime validation
export const OpportunityTypeSchema = z.enum([
OPPORTUNITY_TYPES.PRESOLICITATION,
OPPORTUNITY_TYPES.SOLICITATION,
OPPORTUNITY_TYPES.AWARD_NOTICE,
OPPORTUNITY_TYPES.INTENT_TO_BUNDLE,
OPPORTUNITY_TYPES.JUSTIFICATION,
OPPORTUNITY_TYPES.SOURCES_SOUGHT,
OPPORTUNITY_TYPES.SPECIAL_NOTICE,
OPPORTUNITY_TYPES.COMBINED_SYNOPSIS,
OPPORTUNITY_TYPES.SALE_OF_SURPLUS,
]);
/**
* Federal Set-Aside Type Codes
* Source: Federal Acquisition Regulation (FAR)
*/
export const SET_ASIDE_TYPES = {
SMALL_BUSINESS: 'SBA',
SMALL_BUSINESS_SET_ASIDE: 'SBP',
EIGHT_A: '8A',
EIGHT_A_SOLE_SOURCE: '8AN',
EIGHT_A_COMPETITIVE: '8AC',
HUB_ZONE: 'HZC',
HUB_ZONE_SOLE_SOURCE: 'HZS',
SDVOSB: 'SDVOSBC',
SDVOSB_SOLE_SOURCE: 'SDVOSBS',
WOMEN_OWNED: 'WOSB',
EDWOSB: 'EDWOSB',
LOCAL_AREA: 'LAS',
INDIAN_ECONOMIC: 'IEE',
INDIAN_SMALL_BUSINESS: 'ISBEE',
BUY_INDIAN: 'BICiv',
VETERAN_OWNED: 'VSA',
VETERAN_OWNED_SOLE_SOURCE: 'VSS',
NONE: 'NONE',
};
// Renamed to match actual API field name
export const TypeOfSetAsideSchema = z.enum([
SET_ASIDE_TYPES.SMALL_BUSINESS,
SET_ASIDE_TYPES.SMALL_BUSINESS_SET_ASIDE,
SET_ASIDE_TYPES.EIGHT_A,
SET_ASIDE_TYPES.EIGHT_A_SOLE_SOURCE,
SET_ASIDE_TYPES.EIGHT_A_COMPETITIVE,
SET_ASIDE_TYPES.HUB_ZONE,
SET_ASIDE_TYPES.HUB_ZONE_SOLE_SOURCE,
SET_ASIDE_TYPES.SDVOSB,
SET_ASIDE_TYPES.SDVOSB_SOLE_SOURCE,
SET_ASIDE_TYPES.WOMEN_OWNED,
SET_ASIDE_TYPES.EDWOSB,
SET_ASIDE_TYPES.LOCAL_AREA,
SET_ASIDE_TYPES.INDIAN_ECONOMIC,
SET_ASIDE_TYPES.INDIAN_SMALL_BUSINESS,
SET_ASIDE_TYPES.BUY_INDIAN,
SET_ASIDE_TYPES.VETERAN_OWNED,
SET_ASIDE_TYPES.VETERAN_OWNED_SOLE_SOURCE,
SET_ASIDE_TYPES.NONE,
]);
// Keep the old name for backward compatibility
export const SetAsideTypeSchema = TypeOfSetAsideSchema;
/**
* Construction-related NAICS Codes
* Source: North American Industry Classification System
*/
export const CONSTRUCTION_NAICS_CODES = {
COMMERCIAL_BUILDING: '236220',
INDUSTRIAL_BUILDING: '236210',
RESIDENTIAL_REMODELING: '236118',
ELECTRICAL_CONTRACTORS: '238210',
PLUMBING_HVAC: '238220',
DRYWALL_INSULATION: '238310',
PAINTING: '238320',
SITE_PREPARATION: '238910',
ROOFING: '238160',
CONCRETE: '238110',
};
// Create an array of values for the schema
const constructionNAICSValues = Object.values(CONSTRUCTION_NAICS_CODES);
export const ConstructionNAICSSchema = z.enum(constructionNAICSValues);
/**
* Contract Pricing Types
* Source: Federal Acquisition Regulation (FAR) Part 16
*/
export const CONTRACT_PRICING_TYPES = {
FIRM_FIXED_PRICE: 'FFP',
FIXED_PRICE_EPA: 'FPE',
FIXED_PRICE_INCENTIVE: 'FPI',
FIXED_PRICE_REDETERMINATION: 'FPR',
COST_PLUS_FIXED_FEE: 'CPFF',
COST_PLUS_INCENTIVE_FEE: 'CPIF',
COST_PLUS_AWARD_FEE: 'CPAF',
COST_SHARING: 'CS',
COST_REIMBURSEMENT: 'CR',
TIME_AND_MATERIALS: 'TM',
LABOR_HOURS: 'LH',
OTHER: 'OT',
};
const contractPricingValues = Object.values(CONTRACT_PRICING_TYPES);
export const ContractPricingTypeSchema = z.enum(contractPricingValues);
/**
* API Configuration
*/
export const API_CONFIG = {
SAM_GOV: {
BASE_URL: 'https://api.sam.gov/prod',
OPPORTUNITIES_ENDPOINT: '/opportunities/v2/search',
ENTITIES_ENDPOINT: '/entity-information/v3/entities',
HIERARCHY_ENDPOINT: '/federalorganizations/v2/hierarchy',
DESCRIPTION_ENDPOINT: '/opportunities/v1/noticedesc',
DEFAULT_PAGE_SIZE: 100,
MAX_PAGE_SIZE: 1000,
},
RETRY: {
MAX_ATTEMPTS: 3,
INITIAL_DELAY_MS: 1000,
MAX_DELAY_MS: 10000,
},
CACHE: {
DEFAULT_TTL_SECONDS: 300,
MAX_CACHE_SIZE: 100,
},
};
/**
* US State Codes
*/
export const US_STATES = {
ALABAMA: 'AL',
ALASKA: 'AK',
ARIZONA: 'AZ',
ARKANSAS: 'AR',
CALIFORNIA: 'CA',
COLORADO: 'CO',
CONNECTICUT: 'CT',
DELAWARE: 'DE',
FLORIDA: 'FL',
GEORGIA: 'GA',
HAWAII: 'HI',
IDAHO: 'ID',
ILLINOIS: 'IL',
INDIANA: 'IN',
IOWA: 'IA',
KANSAS: 'KS',
KENTUCKY: 'KY',
LOUISIANA: 'LA',
MAINE: 'ME',
MARYLAND: 'MD',
MASSACHUSETTS: 'MA',
MICHIGAN: 'MI',
MINNESOTA: 'MN',
MISSISSIPPI: 'MS',
MISSOURI: 'MO',
MONTANA: 'MT',
NEBRASKA: 'NE',
NEVADA: 'NV',
NEW_HAMPSHIRE: 'NH',
NEW_JERSEY: 'NJ',
NEW_MEXICO: 'NM',
NEW_YORK: 'NY',
NORTH_CAROLINA: 'NC',
NORTH_DAKOTA: 'ND',
OHIO: 'OH',
OKLAHOMA: 'OK',
OREGON: 'OR',
PENNSYLVANIA: 'PA',
RHODE_ISLAND: 'RI',
SOUTH_CAROLINA: 'SC',
SOUTH_DAKOTA: 'SD',
TENNESSEE: 'TN',
TEXAS: 'TX',
UTAH: 'UT',
VERMONT: 'VT',
VIRGINIA: 'VA',
WASHINGTON: 'WA',
WEST_VIRGINIA: 'WV',
WISCONSIN: 'WI',
WYOMING: 'WY',
DISTRICT_OF_COLUMBIA: 'DC',
PUERTO_RICO: 'PR',
US_VIRGIN_ISLANDS: 'VI',
GUAM: 'GU',
AMERICAN_SAMOA: 'AS',
NORTHERN_MARIANA_ISLANDS: 'MP',
};
const stateValues = Object.values(US_STATES);
export const StateCodeSchema = z.enum(stateValues);
/**
* Helper function to get state code from name
*/
export function getStateCode(stateName) {
return US_STATES[stateName];
}
/**
* Helper function to validate if a string is a valid state code
*/
export function isValidStateCode(code) {
return StateCodeSchema.safeParse(code).success;
}
/**
* Competition Strategy
*/
export const COMPETITION_STRATEGIES = {
FULL_AND_OPEN: 'fullAndOpen',
SET_ASIDE: 'setAside',
SOLE_SOURCE: 'soleSource',
LIMITED_SOURCES: 'limitedSources',
};
const competitionValues = Object.values(COMPETITION_STRATEGIES);
export const CompetitionStrategySchema = z.enum(competitionValues);
/**
* Active Status for opportunities (as returned by API)
*/
export const ACTIVE_STATUS = {
YES: 'Yes',
NO: 'No',
};
export const ActiveStatusSchema = z.enum([ACTIVE_STATUS.YES, ACTIVE_STATUS.NO]);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbmZpZy9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4Qjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDL0IsZUFBZSxFQUFFLEdBQUc7SUFDcEIsWUFBWSxFQUFFLEdBQUc7SUFDakIsWUFBWSxFQUFFLEdBQUc7SUFDakIsZ0JBQWdCLEVBQUUsR0FBRztJQUNyQixhQUFhLEVBQUUsR0FBRztJQUNsQixjQUFjLEVBQUUsR0FBRztJQUNuQixjQUFjLEVBQUUsR0FBRztJQUNuQixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxHQUFHO0NBQ1osQ0FBQztBQU1YLG9DQUFvQztBQUNwQyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFDLGlCQUFpQixDQUFDLGVBQWU7SUFDakMsaUJBQWlCLENBQUMsWUFBWTtJQUM5QixpQkFBaUIsQ0FBQyxZQUFZO0lBQzlCLGlCQUFpQixDQUFDLGdCQUFnQjtJQUNsQyxpQkFBaUIsQ0FBQyxhQUFhO0lBQy9CLGlCQUFpQixDQUFDLGNBQWM7SUFDaEMsaUJBQWlCLENBQUMsY0FBYztJQUNoQyxpQkFBaUIsQ0FBQyxpQkFBaUI7SUFDbkMsaUJBQWlCLENBQUMsZUFBZTtDQUNsQyxDQUFDLENBQUM7QUFFSDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFDN0IsY0FBYyxFQUFFLEtBQUs7SUFDckIsd0JBQXdCLEVBQUUsS0FBSztJQUMvQixPQUFPLEVBQUUsSUFBSTtJQUNiLG1CQUFtQixFQUFFLEtBQUs7SUFDMUIsbUJBQW1CLEVBQUUsS0FBSztJQUMxQixRQUFRLEVBQUUsS0FBSztJQUNmLG9CQUFvQixF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