@lineai/municipal-intel
Version:
AI-first municipal data API providing natural language descriptions of building permits and planning applications from major US cities
75 lines • 4.82 kB
JavaScript
/**
* Municipal data clients
*/
export * from './base-client';
export * from './socrata';
import { SocrataClient } from './socrata';
/**
* Factory to create appropriate client for a municipal source
*/
export class ClientFactory {
config;
constructor(config = {}) {
this.config = config;
}
/**
* Create a client for the given municipal source
*/
createClient(source, params) {
const baseConfig = {
source,
timeout: this.config.timeout,
retries: this.config.retries,
debug: this.config.debug
};
switch (source.type) {
case 'api':
return this.createApiClient(baseConfig, params);
case 'portal':
// TODO: Implement portal clients
throw new Error(`Portal clients not yet implemented for ${source.id}`);
case 'scraping':
// TODO: Implement scraping clients
throw new Error(`Scraping clients not yet implemented for ${source.id}`);
default:
throw new Error(`Unknown source type: ${source.type}`);
}
}
/**
* Create API client based on API type
*/
createApiClient(baseConfig, params) {
if (!baseConfig.source.api) {
throw new Error(`API configuration missing for ${baseConfig.source.id}`);
}
switch (baseConfig.source.api.type) {
case 'socrata':
const socrataConfig = {
...baseConfig,
appToken: this.config.socrataToken
};
return new SocrataClient(socrataConfig, params);
case 'arcgis':
// TODO: Implement ArcGIS client
throw new Error(`ArcGIS clients not yet implemented`);
case 'custom':
// TODO: Implement custom API clients
throw new Error(`Custom API clients not yet implemented for ${baseConfig.source.id}`);
default:
throw new Error(`Unknown API type: ${baseConfig.source.api.type}`);
}
}
/**
* Update configuration
*/
updateConfig(config) {
this.config = { ...this.config, ...config };
}
/**
* Set universal Socrata token
*/
setSocrataToken(token) {
this.config.socrataToken = token;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpZW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsV0FBVyxDQUFDO0FBSTFCLE9BQU8sRUFBRSxhQUFhLEVBQXVCLE1BQU0sV0FBVyxDQUFDO0FBZS9EOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFDaEIsTUFBTSxDQUFzQjtJQUVwQyxZQUFZLFNBQThCLEVBQUU7UUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLE1BQXVCLEVBQUUsTUFBNkI7UUFDakUsTUFBTSxVQUFVLEdBQXFCO1lBQ25DLE1BQU07WUFDTixPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQzVCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87WUFDNUIsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztTQUN6QixDQUFDO1FBRUYsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ25CLEtBQUssS0FBSztnQkFDUixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRWxELEtBQUssUUFBUTtnQkFDWCxpQ0FBaUM7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXpFLEtBQUssVUFBVTtnQkFDYixtQ0FBbUM7Z0JBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRTNFO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQzFEO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZSxDQUFDLFVBQTRCLEVBQUUsTUFBNkI7UUFDakYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMxRTtRQUVELFFBQVEsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQ2xDLEtBQUssU0FBUztnQkFDWixNQUFNLGFBQWEsR0FBd0I7b0JBQ3pDLEdBQUcsVUFBVTtvQkFDYixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO2lCQUNuQyxDQUFDO2dCQUNGLE9BQU8sSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRWxELEtBQUssUUFBUTtnQkFDWCxnQ0FBZ0M7Z0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUV4RCxLQUFLLFFBQVE7Z0JBQ1gscUNBQXFDO2dCQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFeEY7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN0RTtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxNQUFvQztRQUMvQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ25DLENBQUM7Q0FDRiJ9