@setbase/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/resource.ts","../src/types/deployment.ts","../src/providers/factory.ts","../src/utils/id.ts","../src/utils/logger.ts","../src/orchestrator/resource-graph.ts","../src/orchestrator/command-orchestrator.ts","../src/orchestrator/deployment-orchestrator.ts","../src/providers/registry.ts","../src/providers/base/provider.ts","../src/state/state-manager.ts","../src/errors/index.ts","../src/state/credential-store.ts","../src/manifest/parser.ts","../src/manifest/schema.ts","../src/manifest/validator.ts","../src/environment/env-manager.ts","../src/environment/env-aggregator.ts","../src/utils/validation.ts"],"sourcesContent":["/**\n * Resource type definitions\n */\n\nexport enum ResourceType {\n DATABASE = 'database',\n CACHE = 'cache',\n STORAGE = 'storage',\n EMAIL = 'email',\n COMPUTE = 'compute',\n}\n\nexport enum ResourceStatus {\n PENDING = 'pending',\n PROVISIONING = 'provisioning',\n READY = 'ready',\n UPDATING = 'updating',\n DESTROYING = 'destroying',\n ERROR = 'error',\n}\n\nexport interface Resource {\n id: string;\n type: ResourceType;\n provider: string;\n name: string;\n config: ResourceConfig;\n outputs: ResourceOutputs;\n status: ResourceStatus;\n dependencies: string[];\n}\n\nexport type ResourceConfig = Record<string, unknown>;\nexport type ResourceOutputs = Record<string, unknown>;\n\n// Database resource types\nexport interface DatabaseConfig {\n region?: string;\n instanceType?: string;\n storage?: number;\n version?: string;\n}\n\nexport interface DatabaseOutputs {\n connectionString: string;\n host: string;\n port: number;\n database: string;\n username: string;\n password: string;\n sslEnabled: boolean;\n}\n\n// Cache resource types\nexport interface CacheConfig {\n region?: string;\n maxMemory?: string;\n evictionPolicy?: 'allkeys-lru' | 'volatile-lru';\n}\n\nexport interface CacheOutputs {\n host: string;\n port: number;\n password?: string;\n url: string;\n tls: boolean;\n}\n\n// Storage resource types\nexport interface StorageConfig {\n region?: string;\n public?: boolean;\n cors?: CorsConfig;\n}\n\nexport interface CorsConfig {\n allowedOrigins: string[];\n allowedMethods?: string[];\n allowedHeaders?: string[];\n}\n\nexport interface StorageOutputs {\n bucketName: string;\n endpoint: string;\n accessKeyId: string;\n secretAccessKey: string;\n publicUrl?: string;\n}\n\n// Email resource types\nexport interface EmailConfig {\n domain?: string;\n fromEmail?: string;\n fromName?: string;\n replyTo?: string;\n dkimEnabled?: boolean;\n}\n\nexport interface EmailOutputs {\n domain: string;\n apiEndpoint: string;\n fromEmail: string;\n fromName: string;\n verified: boolean;\n dkimEnabled: boolean;\n apiKey?: string;\n smtpHost?: string;\n smtpPort?: number;\n smtpUsername?: string;\n smtpPassword?: string;\n metadata?: Record<string, unknown>;\n}\n\n// Compute resource types\nexport interface ComputeConfig {\n name?: string;\n runtime: 'node' | 'python' | 'go';\n buildCommand?: string;\n startCommand?: string;\n dockerfilePath?: string;\n instanceType?: string;\n environmentVariables?: Record<string, string>;\n region?: string;\n healthCheckPath?: string;\n healthCheck?: string;\n}\n\nexport interface ComputeOutputs {\n url: string;\n version: string;\n provider?: string;\n region?: string;\n deploymentId?: string;\n status?: string;\n metadata?: Record<string, unknown>;\n}\n","/**\n * Deployment type definitions\n */\n\nexport enum DeploymentStatus {\n PENDING = 'pending',\n BUILDING = 'building',\n DEPLOYING = 'deploying',\n READY = 'ready',\n FAILED = 'failed',\n}\n\nexport interface Deployment {\n id: string;\n projectId: string;\n environment: string;\n provider: string;\n status: DeploymentStatus;\n url?: string;\n version?: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface DeploymentOptions {\n environment: string;\n force?: boolean;\n skipBuild?: boolean;\n}\n\nexport interface DeploymentResult {\n id: string;\n url: string;\n status: DeploymentStatus;\n version: string;\n}\n","/**\n * Provider factory - creates provider instances\n */\n\nimport type { ProviderCredentials } from '../types/provider.js';\nimport type { ResourceType } from '../types/resource.js';\n\nimport type { BaseProvider } from './base/provider.js';\n\nexport class ProviderFactory {\n /**\n * Create a provider instance\n */\n static async create(\n _type: ResourceType,\n providerId: string,\n credentials: ProviderCredentials\n ): Promise<BaseProvider> {\n try {\n // Dynamic import will be implemented when providers are added\n const module = await import(`@setbase/providers/${providerId}`);\n const ProviderClass = module.default;\n const provider = new ProviderClass();\n await provider.initialize(credentials);\n return provider;\n } catch (error) {\n throw new Error(`Failed to create provider: ${providerId}`, { cause: error });\n }\n }\n}\n","/**\n * ID generation utilities\n */\n\nimport { nanoid } from 'nanoid';\n\nexport function generateId(): string {\n return nanoid();\n}\n\nexport function generateProjectId(): string {\n return `proj_${nanoid(16)}`;\n}\n\nexport function generateResourceId(): string {\n return `res_${nanoid(16)}`;\n}\n\nexport function generateDeploymentId(): string {\n return `dep_${nanoid(16)}`;\n}\n","/**\n * Logger utility\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface Logger {\n debug(message: string, ...args: any[]): void;\n info(message: string, ...args: any[]): void;\n warn(message: string, ...args: any[]): void;\n error(message: string, ...args: any[]): void;\n}\n\nclass ConsoleLogger implements Logger {\n debug(message: string, ...args: any[]): void {\n console.debug(`[DEBUG] ${message}`, ...args);\n }\n\n info(message: string, ...args: any[]): void {\n console.info(`[INFO] ${message}`, ...args);\n }\n\n warn(message: string, ...args: any[]): void {\n console.warn(`[WARN] ${message}`, ...args);\n }\n\n error(message: string, ...args: any[]): void {\n console.error(`[ERROR] ${message}`, ...args);\n }\n}\n\nexport const logger: Logger = new ConsoleLogger();\n","/**\n * Resource dependency graph for orchestrating provisioning order\n */\n\nexport interface ResourceNode {\n id: string;\n dependencies: string[];\n}\n\nexport class ResourceGraph {\n private nodes = new Map<string, ResourceNode>();\n\n addNode(id: string, dependencies: string[] = []): void {\n this.nodes.set(id, { id, dependencies });\n }\n\n /**\n * Get resources in topological order (respecting dependencies)\n */\n getProvisioningOrder(): string[] {\n const visited = new Set<string>();\n const result: string[] = [];\n\n const visit = (nodeId: string): void => {\n if (visited.has(nodeId)) return;\n\n const node = this.nodes.get(nodeId);\n if (!node) return;\n\n visited.add(nodeId);\n\n // Visit dependencies first\n for (const dep of node.dependencies) {\n visit(dep);\n }\n\n result.push(nodeId);\n };\n\n // Visit all nodes\n for (const nodeId of this.nodes.keys()) {\n visit(nodeId);\n }\n\n return result;\n }\n\n /**\n * Detect circular dependencies\n */\n hasCycle(): boolean {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n\n const hasCycleUtil = (nodeId: string): boolean => {\n visited.add(nodeId);\n recursionStack.add(nodeId);\n\n const node = this.nodes.get(nodeId);\n if (node) {\n for (const dep of node.dependencies) {\n if (!visited.has(dep)) {\n if (hasCycleUtil(dep)) return true;\n } else if (recursionStack.has(dep)) {\n return true;\n }\n }\n }\n\n recursionStack.delete(nodeId);\n return false;\n };\n\n for (const nodeId of this.nodes.keys()) {\n if (!visited.has(nodeId)) {\n if (hasCycleUtil(nodeId)) return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Command orchestrator - coordinates multi-provider operations\n */\n\nimport { ProviderFactory } from '../providers/factory.js';\nimport type { CredentialStore } from '../state/credential-store.js';\nimport type { StateManager } from '../state/state-manager.js';\nimport type { Manifest } from '../types/manifest.js';\nimport { ResourceStatus, ResourceType } from '../types/resource.js';\nimport type { ProjectState, ResourceState } from '../types/state.js';\nimport { generateId } from '../utils/id.js';\nimport { logger } from '../utils/logger.js';\n\nimport { ResourceGraph } from './resource-graph.js';\n\n\nexport interface CommandOrchestrator {\n /**\n * Initialize a new project\n */\n initializeProject(manifest: Manifest): Promise<ProjectState>;\n\n /**\n * Provision all resources defined in manifest\n */\n provisionResources(manifest: Manifest): Promise<void>;\n\n /**\n * Destroy all provisioned resources\n */\n destroyResources(): Promise<void>;\n\n /**\n * Get current project state\n */\n getState(): Promise<ProjectState>;\n}\n\nexport class DefaultCommandOrchestrator implements CommandOrchestrator {\n constructor(\n private readonly stateManager: StateManager,\n private readonly credentialStore: CredentialStore\n ) {}\n\n async initializeProject(manifest: Manifest): Promise<ProjectState> {\n logger.info('Initializing project', { name: manifest.project.name });\n\n // Check if project already initialized\n const existingState = await this.stateManager.load();\n if (existingState) {\n logger.warn('Project already initialized', { projectId: existingState.projectId });\n return existingState;\n }\n\n // Create initial project state\n const projectState: ProjectState = {\n version: '1.0',\n projectId: generateId(),\n resources: {},\n deployments: [],\n lastUpdated: new Date().toISOString(),\n };\n\n await this.stateManager.save(projectState);\n logger.info('Project initialized', { projectId: projectState.projectId });\n\n return projectState;\n }\n\n async provisionResources(manifest: Manifest): Promise<void> {\n logger.info('Starting resource provisioning');\n\n // Load current state\n const state = await this.stateManager.load();\n if (!state) {\n throw new Error('Project not initialized. Run init first.');\n }\n\n // Build dependency graph\n const graph = new ResourceGraph();\n\n // Map resource types to their definitions\n const resourceMap: Array<{\n id: string;\n type: ResourceType;\n def: { provider: string; config: unknown; dependsOn?: string[] };\n }> = [];\n\n if (manifest.resources.database) {\n resourceMap.push({ id: 'database', type: ResourceType.DATABASE, def: manifest.resources.database });\n graph.addNode('database', manifest.resources.database.dependsOn || []);\n }\n if (manifest.resources.cache) {\n resourceMap.push({ id: 'cache', type: ResourceType.CACHE, def: manifest.resources.cache });\n graph.addNode('cache', manifest.resources.cache.dependsOn || []);\n }\n if (manifest.resources.storage) {\n resourceMap.push({ id: 'storage', type: ResourceType.STORAGE, def: manifest.resources.storage });\n graph.addNode('storage', manifest.resources.storage.dependsOn || []);\n }\n if (manifest.resources.email) {\n resourceMap.push({ id: 'email', type: ResourceType.EMAIL, def: manifest.resources.email });\n graph.addNode('email', manifest.resources.email.dependsOn || []);\n }\n\n // Check for circular dependencies\n if (graph.hasCycle()) {\n throw new Error('Circular dependency detected in resource graph');\n }\n\n // Get provisioning order\n const provisioningOrder = graph.getProvisioningOrder();\n logger.info('Provisioning order determined', { order: provisioningOrder });\n\n // Provision resources in order\n for (const resourceId of provisioningOrder) {\n const resource = resourceMap.find(r => r.id === resourceId);\n if (!resource) continue;\n\n // Skip if already provisioned\n if (state.resources[resourceId]?.status === ResourceStatus.READY) {\n logger.info('Resource already provisioned, skipping', { resourceId });\n continue;\n }\n\n logger.info('Provisioning resource', { resourceId, type: resource.type });\n\n try {\n // Get credentials for provider\n const credentials = await this.credentialStore.load(resource.def.provider);\n if (!credentials) {\n throw new Error(`No credentials found for provider: ${resource.def.provider}`);\n }\n\n // Create provider instance\n const provider = await ProviderFactory.create(\n resource.type,\n resource.def.provider,\n credentials\n );\n\n // Provision resource\n const result = await provider.provision(resource.def.config);\n\n // Update state\n const resourceState: ResourceState = {\n type: resource.type,\n provider: resource.def.provider,\n resourceId: result.resourceId,\n status: ResourceStatus.READY,\n metadata: {\n outputs: result.outputs,\n },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n state.resources[resourceId] = resourceState;\n await this.stateManager.save(state);\n\n logger.info('Resource provisioned successfully', {\n resourceId,\n providerResourceId: result.resourceId,\n });\n } catch (error) {\n logger.error('Failed to provision resource', { resourceId, error });\n\n // Update state with error\n state.resources[resourceId] = {\n type: resource.type,\n provider: resource.def.provider,\n resourceId: resourceId,\n status: ResourceStatus.ERROR,\n metadata: { error: (error as Error).message },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n await this.stateManager.save(state);\n\n throw error;\n }\n }\n\n logger.info('All resources provisioned successfully');\n }\n\n async destroyResources(): Promise<void> {\n logger.info('Starting resource destruction');\n\n const state = await this.stateManager.load();\n if (!state) {\n logger.warn('No project state found, nothing to destroy');\n return;\n }\n\n // Destroy resources in reverse order\n const resourceIds = Object.keys(state.resources).reverse();\n\n for (const resourceId of resourceIds) {\n const resourceState = state.resources[resourceId];\n if (!resourceState) continue;\n\n logger.info('Destroying resource', { resourceId });\n\n try {\n // Get credentials\n const credentials = await this.credentialStore.load(resourceState.provider);\n if (!credentials) {\n logger.warn('No credentials found, skipping', {\n resourceId,\n provider: resourceState.provider,\n });\n continue;\n }\n\n // Create provider instance\n const provider = await ProviderFactory.create(\n resourceState.type as ResourceType,\n resourceState.provider,\n credentials\n );\n\n // Destroy resource\n await provider.destroy(resourceState.resourceId);\n\n // Remove from state\n delete state.resources[resourceId];\n await this.stateManager.save(state);\n\n logger.info('Resource destroyed successfully', { resourceId });\n } catch (error) {\n logger.error('Failed to destroy resource', { resourceId, error });\n throw error;\n }\n }\n\n logger.info('All resources destroyed successfully');\n }\n\n async getState(): Promise<ProjectState> {\n const state = await this.stateManager.load();\n if (!state) {\n throw new Error('Project not initialized');\n }\n return state;\n }\n}\n","/**\n * Deployment orchestrator - manages application deployments\n */\n\nimport { ProviderFactory } from '../providers/factory.js';\nimport type { CredentialStore } from '../state/credential-store.js';\nimport type { StateManager } from '../state/state-manager.js';\nimport type { DeploymentResult, DeploymentOptions, DeploymentStatus } from '../types/deployment.js';\nimport type { DeploymentConfig } from '../types/manifest.js';\nimport type { ComputeOutputs } from '../types/resource.js';\nimport { ResourceType } from '../types/resource.js';\nimport type { DeploymentState } from '../types/state.js';\nimport { generateId } from '../utils/id.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface DeploymentOrchestrator {\n /**\n * Deploy the application\n */\n deploy(config: DeploymentConfig, options: DeploymentOptions): Promise<DeploymentResult>;\n\n /**\n * Get deployment status\n */\n getDeploymentStatus(deploymentId: string): Promise<string>;\n\n /**\n * Get deployment logs\n */\n getLogs(deploymentId: string, options?: LogOptions): Promise<string[]>;\n}\n\nexport interface LogOptions {\n tail?: number;\n follow?: boolean;\n}\n\nexport class DefaultDeploymentOrchestrator implements DeploymentOrchestrator {\n constructor(\n private readonly stateManager: StateManager,\n private readonly credentialStore: CredentialStore\n ) {}\n\n async deploy(config: DeploymentConfig, options: DeploymentOptions): Promise<DeploymentResult> {\n logger.info('Starting deployment', { environment: options.environment });\n\n // Load current state\n const state = await this.stateManager.load();\n if (!state) {\n throw new Error('Project not initialized. Run init first.');\n }\n\n // Get credentials for deployment provider\n const credentials = await this.credentialStore.load(config.provider);\n if (!credentials) {\n throw new Error(`No credentials found for provider: ${config.provider}`);\n }\n\n // Create compute provider instance\n const provider = await ProviderFactory.create(\n ResourceType.COMPUTE,\n config.provider,\n credentials\n );\n\n // Use the config directly as it's already ComputeConfig\n const deploymentConfig = config.config;\n\n try {\n // Provision deployment\n const result = await provider.provision(deploymentConfig);\n const outputs = result.outputs as ComputeOutputs;\n\n // Create deployment state\n const deploymentState: DeploymentState = {\n id: generateId(),\n environment: options.environment,\n provider: config.provider,\n status: 'ready' as DeploymentStatus,\n url: outputs.url,\n version: outputs.version,\n createdAt: new Date().toISOString(),\n };\n\n // Update state\n state.deployments.push(deploymentState);\n await this.stateManager.save(state);\n\n logger.info('Deployment successful', {\n deploymentId: deploymentState.id,\n url: outputs.url,\n });\n\n return {\n id: deploymentState.id,\n url: outputs.url,\n status: 'ready' as DeploymentStatus,\n version: outputs.version,\n };\n } catch (error) {\n logger.error('Deployment failed', { error });\n throw error;\n }\n }\n\n async getDeploymentStatus(deploymentId: string): Promise<string> {\n const state = await this.stateManager.load();\n if (!state) {\n throw new Error('Project not initialized');\n }\n\n const deployment = state.deployments.find((d) => d.id === deploymentId);\n if (!deployment) {\n throw new Error(`Deployment not found: ${deploymentId}`);\n }\n\n return deployment.status;\n }\n\n async getLogs(deploymentId: string, options?: LogOptions): Promise<string[]> {\n logger.info('Fetching deployment logs', { deploymentId, options });\n\n const state = await this.stateManager.load();\n if (!state) {\n throw new Error('Project not initialized');\n }\n\n const deployment = state.deployments.find((d) => d.id === deploymentId);\n if (!deployment) {\n throw new Error(`Deployment not found: ${deploymentId}`);\n }\n\n // In a real implementation, this would fetch logs from the provider\n // For now, return simulated logs\n const logs = [\n `[${new Date().toISOString()}] Deployment ${deploymentId} started`,\n `[${new Date().toISOString()}] Building application...`,\n `[${new Date().toISOString()}] Build completed successfully`,\n `[${new Date().toISOString()}] Deploying to ${deployment.environment}...`,\n `[${new Date().toISOString()}] Deployment completed`,\n `[${new Date().toISOString()}] Application available at ${deployment.url}`,\n ];\n\n if (options?.tail) {\n return logs.slice(-options.tail);\n }\n\n return logs;\n }\n}\n","/**\n * Provider registry - manages provider lifecycle\n */\n\nimport type { ResourceType } from '../types/resource.js';\n\nimport type { BaseProvider } from './base/provider.js';\n\nexport class ProviderRegistry {\n private providers = new Map<string, BaseProvider>();\n\n /**\n * Register a provider\n */\n register(provider: BaseProvider): void {\n this.providers.set(provider.id, provider);\n }\n\n /**\n * Get a provider by ID\n */\n get(providerId: string): BaseProvider | undefined {\n return this.providers.get(providerId);\n }\n\n /**\n * Get all providers of a specific type\n */\n getByType(type: ResourceType): BaseProvider[] {\n return Array.from(this.providers.values()).filter((p) => p.type === type);\n }\n\n /**\n * Check if a provider is registered\n */\n has(providerId: string): boolean {\n return this.providers.has(providerId);\n }\n\n /**\n * Get all registered provider IDs\n */\n list(): string[] {\n return Array.from(this.providers.keys());\n }\n\n /**\n * Dynamically load providers\n */\n async loadProviders(providerIds: string[]): Promise<void> {\n for (const id of providerIds) {\n try {\n // Dynamic import will be implemented when providers are added\n const module = await import(`@setbase/providers/${id}`);\n const ProviderClass = module.default;\n const provider = new ProviderClass();\n this.register(provider);\n } catch (error) {\n throw new Error(`Failed to load provider: ${id}`, { cause: error });\n }\n }\n }\n}\n","/**\n * Base provider interface\n */\n\nimport type {\n Provider as IProvider,\n ProviderCredentials,\n ValidationResult,\n ProvisionResult,\n UpdateResult,\n} from '../../types/provider.js';\nimport type { ResourceType, ResourceStatus } from '../../types/resource.js';\n\nexport abstract class BaseProvider<TConfig = unknown, TOutputs = unknown>\n implements IProvider<TConfig, TOutputs>\n{\n abstract readonly id: string;\n abstract readonly type: ResourceType;\n abstract readonly version: string;\n\n abstract initialize(credentials: ProviderCredentials): Promise<void>;\n abstract validate(config: TConfig): Promise<ValidationResult>;\n abstract provision(config: TConfig): Promise<ProvisionResult<TOutputs>>;\n abstract update(resourceId: string, config: TConfig): Promise<UpdateResult<TOutputs>>;\n abstract destroy(resourceId: string): Promise<void>;\n abstract getStatus(resourceId: string): Promise<ResourceStatus>;\n abstract getOutputs(resourceId: string): Promise<TOutputs>;\n abstract getEnvironmentVariables(resourceId: string): Promise<Record<string, string>>;\n}\n","/**\n * State manager - handles project state persistence\n */\n\nimport { constants } from 'node:fs';\nimport { readFile, writeFile, unlink, access , mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\n\nimport { StateError } from '../errors/index.js';\nimport type { ProjectState } from '../types/state.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface StateManager {\n /**\n * Load project state from disk\n */\n load(): Promise<ProjectState | null>;\n\n /**\n * Save project state to disk\n */\n save(state: ProjectState): Promise<void>;\n\n /**\n * Delete project state\n */\n delete(): Promise<void>;\n\n /**\n * Check if state exists\n */\n exists(): Promise<boolean>;\n}\n\nexport class FileStateManager implements StateManager {\n constructor(private readonly stateFilePath: string) {}\n\n async load(): Promise<ProjectState | null> {\n try {\n const exists = await this.exists();\n if (!exists) {\n logger.debug('State file does not exist');\n return null;\n }\n\n const content = await readFile(this.stateFilePath, 'utf-8');\n const state = JSON.parse(content) as ProjectState;\n\n logger.debug('State loaded successfully', { projectId: state.projectId });\n return state;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw new StateError('Failed to load state', { error, path: this.stateFilePath });\n }\n }\n\n async save(state: ProjectState): Promise<void> {\n try {\n // Ensure directory exists\n const dir = dirname(this.stateFilePath);\n await mkdir(dir, { recursive: true });\n\n // Update lastUpdated timestamp\n const stateToSave = {\n ...state,\n lastUpdated: new Date().toISOString(),\n };\n\n // Write state file with pretty formatting\n const content = JSON.stringify(stateToSave, null, 2);\n await writeFile(this.stateFilePath, content, 'utf-8');\n\n logger.debug('State saved successfully', { projectId: state.projectId });\n } catch (error) {\n throw new StateError('Failed to save state', { error, path: this.stateFilePath });\n }\n }\n\n async delete(): Promise<void> {\n try {\n const exists = await this.exists();\n if (!exists) {\n logger.debug('State file does not exist, nothing to delete');\n return;\n }\n\n await unlink(this.stateFilePath);\n logger.debug('State deleted successfully');\n } catch (error) {\n throw new StateError('Failed to delete state', { error, path: this.stateFilePath });\n }\n }\n\n async exists(): Promise<boolean> {\n try {\n await access(this.stateFilePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Create a state manager for a project directory\n */\nexport function createStateManager(projectDir: string = process.cwd()): StateManager {\n const stateFilePath = join(projectDir, '.setbase', 'state.json');\n return new FileStateManager(stateFilePath);\n}\n","/**\n * Custom error classes for Setbase\n */\n\nexport class SetbaseError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'SetbaseError';\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nexport class ValidationError extends SetbaseError {\n constructor(message: string, details?: unknown) {\n super(message, 'VALIDATION_ERROR', details);\n this.name = 'ValidationError';\n }\n}\n\nexport class ProviderError extends SetbaseError {\n constructor(message: string, public readonly provider: string, details?: unknown) {\n super(message, 'PROVIDER_ERROR', details);\n this.name = 'ProviderError';\n }\n}\n\nexport class StateError extends SetbaseError {\n constructor(message: string, details?: unknown) {\n super(message, 'STATE_ERROR', details);\n this.name = 'StateError';\n }\n}\n\nexport class ManifestError extends SetbaseError {\n constructor(message: string, details?: unknown) {\n super(message, 'MANIFEST_ERROR', details);\n this.name = 'ManifestError';\n }\n}\n\nexport class DeploymentError extends SetbaseError {\n constructor(message: string, details?: unknown) {\n super(message, 'DEPLOYMENT_ERROR', details);\n this.name = 'DeploymentError';\n }\n}\n","/**\n * Credential store - securely manages provider credentials\n */\n\nimport { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';\nimport { constants } from 'node:fs';\nimport { readFile, writeFile, access , mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\n\nimport { StateError } from '../errors/index.js';\nimport type { ProviderCredentials as ProviderCreds } from '../types/provider.js';\nimport type { CredentialsFile } from '../types/state.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface CredentialStore {\n /**\n * Save provider credentials\n */\n save(providerId: string, credentials: ProviderCreds): Promise<void>;\n\n /**\n * Load provider credentials\n */\n load(providerId: string): Promise<ProviderCreds | null>;\n\n /**\n * Delete provider credentials\n */\n delete(providerId: string): Promise<void>;\n\n /**\n * Check if credentials exist for a provider\n */\n has(providerId: string): Promise<boolean>;\n\n /**\n * List all provider IDs with credentials\n */\n list(): Promise<string[]>;\n}\n\nexport class EncryptedCredentialStore implements CredentialStore {\n private readonly algorithm = 'aes-256-gcm';\n private readonly keyLength = 32;\n private readonly ivLength = 16;\n private readonly saltLength = 32;\n private readonly tagLength = 16;\n\n constructor(\n private readonly credentialsFilePath: string,\n private readonly passphrase: string\n ) {}\n\n async save(providerId: string, credentials: ProviderCreds): Promise<void> {\n try {\n // Load existing credentials file or create new\n const credFile = (await this.loadCredentialsFile()) || this.createEmptyCredentialsFile();\n\n // Add/update provider credentials\n credFile.providers[providerId] = credentials as Record<string, unknown>;\n\n // Save encrypted file\n await this.saveCredentialsFile(credFile);\n\n logger.debug('Credentials saved', { providerId });\n } catch (error) {\n throw new StateError(`Failed to save credentials for provider: ${providerId}`, { error });\n }\n }\n\n async load(providerId: string): Promise<ProviderCreds | null> {\n try {\n const credFile = await this.loadCredentialsFile();\n if (!credFile) {\n return null;\n }\n\n const credentials = credFile.providers[providerId];\n return credentials ? (credentials as ProviderCreds) : null;\n } catch (error) {\n throw new StateError(`Failed to load credentials for provider: ${providerId}`, { error });\n }\n }\n\n async delete(providerId: string): Promise<void> {\n try {\n const credFile = await this.loadCredentialsFile();\n if (!credFile) {\n return;\n }\n\n delete credFile.providers[providerId];\n await this.saveCredentialsFile(credFile);\n\n logger.debug('Credentials deleted', { providerId });\n } catch (error) {\n throw new StateError(`Failed to delete credentials for provider: ${providerId}`, { error });\n }\n }\n\n async has(providerId: string): Promise<boolean> {\n const credentials = await this.load(providerId);\n return credentials !== null;\n }\n\n async list(): Promise<string[]> {\n const credFile = await this.loadCredentialsFile();\n return credFile ? Object.keys(credFile.providers) : [];\n }\n\n /**\n * Load and decrypt credentials file\n */\n private async loadCredentialsFile(): Promise<CredentialsFile | null> {\n try {\n const exists = await this.fileExists();\n if (!exists) {\n return null;\n }\n\n const encrypted = await readFile(this.credentialsFilePath, 'utf-8');\n const decrypted = this.decrypt(encrypted);\n return JSON.parse(decrypted) as CredentialsFile;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Encrypt and save credentials file\n */\n private async saveCredentialsFile(credFile: CredentialsFile): Promise<void> {\n // Ensure directory exists\n const dir = dirname(this.credentialsFilePath);\n await mkdir(dir, { recursive: true });\n\n const json = JSON.stringify(credFile, null, 2);\n const encrypted = this.encrypt(json);\n\n await writeFile(this.credentialsFilePath, encrypted, 'utf-8');\n }\n\n /**\n * Check if credentials file exists\n */\n private async fileExists(): Promise<boolean> {\n try {\n await access(this.credentialsFilePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create empty credentials file structure\n */\n private createEmptyCredentialsFile(): CredentialsFile {\n return {\n version: '1.0',\n encrypted: true,\n providers: {},\n };\n }\n\n /**\n * Encrypt data using AES-256-GCM\n */\n private encrypt(data: string): string {\n // Generate random salt and IV\n const salt = randomBytes(this.saltLength);\n const iv = randomBytes(this.ivLength);\n\n // Derive key from passphrase and salt\n const key = scryptSync(this.passphrase, salt, this.keyLength);\n\n // Create cipher\n const cipher = createCipheriv(this.algorithm, key, iv);\n\n // Encrypt data\n const encrypted = Buffer.concat([cipher.update(data, 'utf-8'), cipher.final()]);\n\n // Get auth tag\n const tag = cipher.getAuthTag();\n\n // Combine: salt + iv + tag + encrypted data\n const result = Buffer.concat([salt, iv, tag, encrypted]);\n\n // Return as base64\n return result.toString('base64');\n }\n\n /**\n * Decrypt data using AES-256-GCM\n */\n private decrypt(encrypted: string): string {\n // Decode from base64\n const buffer = Buffer.from(encrypted, 'base64');\n\n // Extract components\n const salt = buffer.subarray(0, this.saltLength);\n const iv = buffer.subarray(this.saltLength, this.saltLength + this.ivLength);\n const tag = buffer.subarray(\n this.saltLength + this.ivLength,\n this.saltLength + this.ivLength + this.tagLength\n );\n const data = buffer.subarray(this.saltLength + this.ivLength + this.tagLength);\n\n // Derive key from passphrase and salt\n const key = scryptSync(this.passphrase, salt, this.keyLength);\n\n // Create decipher\n const decipher = createDecipheriv(this.algorithm, key, iv);\n decipher.setAuthTag(tag);\n\n // Decrypt data\n const decrypted = Buffer.concat([decipher.update(data), decipher.final()]);\n\n return decrypted.toString('utf-8');\n }\n}\n\n/**\n * Create a credential store for a project directory\n */\nexport function createCredentialStore(\n projectDir: string = process.cwd(),\n passphrase?: string\n): CredentialStore {\n const credentialsFilePath = join(projectDir, '.setbase', 'credentials.json');\n\n // Use environment variable or default passphrase\n const phrase = passphrase || process.env.SETBASE_PASSPHRASE || 'default-passphrase';\n\n return new EncryptedCredentialStore(credentialsFilePath, phrase);\n}\n","/**\n * Manifest parser - loads and parses setbase.json\n */\n\nimport { constants } from 'node:fs';\nimport { readFile, writeFile, access , mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\n\nimport { ManifestError } from '../errors/index.js';\nimport type { Manifest } from '../types/manifest.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface ManifestParser {\n /**\n * Parse manifest from file path\n */\n parse(filePath: string): Promise<Manifest>;\n\n /**\n * Parse manifest from string\n */\n parseString(content: string): Promise<Manifest>;\n\n /**\n * Write manifest to file\n */\n write(filePath: string, manifest: Manifest): Promise<void>;\n\n /**\n * Check if manifest exists\n */\n exists(filePath: string): Promise<boolean>;\n}\n\nexport class DefaultManifestParser implements ManifestParser {\n async parse(filePath: string): Promise<Manifest> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return await this.parseString(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new ManifestError(`Manifest file not found: ${filePath}`);\n }\n throw new ManifestError('Failed to read manifest file', { error, filePath });\n }\n }\n\n async parseString(content: string): Promise<Manifest> {\n try {\n const manifest = JSON.parse(content) as Manifest;\n\n // Basic validation\n if (!manifest.version) {\n throw new ManifestError('Manifest missing required field: version');\n }\n\n if (manifest.version !== '1.0') {\n throw new ManifestError(`Unsupported manifest version: ${manifest.version}`);\n }\n\n if (!manifest.project) {\n throw new ManifestError('Manifest missing required field: project');\n }\n\n if (!manifest.project.name) {\n throw new ManifestError('Manifest missing required field: project.name');\n }\n\n if (!manifest.project.runtime) {\n throw new ManifestError('Manifest missing required field: project.runtime');\n }\n\n logger.debug('Manifest parsed successfully', { project: manifest.project.name });\n\n return manifest;\n } catch (error) {\n if (error instanceof ManifestError) {\n throw error;\n }\n\n if (error instanceof SyntaxError) {\n throw new ManifestError('Invalid JSON in manifest file', { error });\n }\n\n throw new ManifestError('Failed to parse manifest', { error });\n }\n }\n\n async write(filePath: string, manifest: Manifest): Promise<void> {\n try {\n // Ensure directory exists\n const dir = dirname(filePath);\n await mkdir(dir, { recursive: true });\n\n // Write manifest with pretty formatting\n const content = JSON.stringify(manifest, null, 2);\n await writeFile(filePath, content, 'utf-8');\n\n logger.debug('Manifest written successfully', { filePath });\n } catch (error) {\n throw new ManifestError('Failed to write manifest file', { error, filePath });\n }\n }\n\n async exists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Create a manifest parser\n */\nexport function createManifestParser(): ManifestParser {\n return new DefaultManifestParser();\n}\n\n/**\n * Load manifest from project directory\n */\nexport async function loadManifest(projectDir: string = process.cwd()): Promise<Manifest> {\n const parser = createManifestParser();\n const manifestPath = join(projectDir, 'setbase.json');\n return parser.parse(manifestPath);\n}\n\n/**\n * Save manifest to project directory\n */\nexport async function saveManifest(\n manifest: Manifest,\n projectDir: string = process.cwd()\n): Promise<void> {\n const parser = createManifestParser();\n const manifestPath = join(projectDir, 'setbase.json');\n return parser.write(manifestPath, manifest);\n}\n","/**\n * Manifest schema using Zod\n */\n\nimport { z } from 'zod';\n\nexport const projectConfigSchema = z.object({\n name: z.string().min(3).max(50).regex(/^[a-z0-9-]+$/),\n description: z.string().optional(),\n runtime: z.enum(['node', 'python', 'go']),\n framework: z.string().optional(),\n});\n\nexport const databaseConfigSchema = z.object({\n region: z.string().optional(),\n instanceType: z.string().optional(),\n storage: z.number().optional(),\n version: z.string().optional(),\n});\n\nexport const cacheConfigSchema = z.object({\n region: z.string().optional(),\n maxMemory: z.string().optional(),\n evictionPolicy: z.enum(['allkeys-lru', 'volatile-lru']).optional(),\n});\n\nexport const storageConfigSchema = z.object({\n region: z.string().optional(),\n public: z.boolean().optional(),\n cors: z\n .object({\n allowedOrigins: z.array(z.string()),\n allowedMethods: z.array(z.string()).optional(),\n allowedHeaders: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nexport const emailConfigSchema = z.object({\n domain: z.string(),\n fromName: z.string().optional(),\n replyTo: z.string().email().optional(),\n});\n\nexport const computeConfigSchema = z.object({\n runtime: z.enum(['node', 'python', 'go']),\n buildCommand: z.string().optional(),\n startCommand: z.string(),\n environmentVariables: z.record(z.string()).optional(),\n region: z.string().optional(),\n healthCheck: z.string().optional(),\n});\n\nexport const resourceDefinitionSchema = z.object({\n provider: z.string(),\n config: z.record(z.unknown()),\n dependsOn: z.array(z.string()).optional(),\n});\n\nexport const resourceDefinitionsSchema = z.object({\n database: resourceDefinitionSchema.optional(),\n cache: resourceDefinitionSchema.optional(),\n storage: resourceDefinitionSchema.optional(),\n email: resourceDefinitionSchema.optional(),\n});\n\nexport const deploymentConfigSchema = z.object({\n provider: z.string(),\n config: computeConfigSchema,\n});\n\nexport const manifestSchema = z.object({\n $schema: z.string().optional(),\n version: z.literal('1.0'),\n project: projectConfigSchema,\n resources: resourceDefinitionsSchema,\n deployment: deploymentConfigSchema.optional(),\n});\n\nexport type ManifestSchema = z.infer<typeof manifestSchema>;\n","/**\n * Manifest validator - validates manifest against schema\n */\n\nimport type { Manifest } from '../types/manifest.js';\nimport { logger } from '../utils/logger.js';\n\nimport { manifestSchema } from './schema.js';\n\nexport interface ManifestValidator {\n /**\n * Validate a manifest\n */\n validate(manifest: Manifest): Promise<ValidationResult>;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n}\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport class DefaultManifestValidator implements ManifestValidator {\n async validate(manifest: Manifest): Promise<ValidationResult> {\n const result = manifestSchema.safeParse(manifest);\n\n if (result.success) {\n logger.debug('Manifest validation passed');\n return {\n valid: true,\n errors: [],\n };\n }\n\n const errors: ValidationError[] = result.error.errors.map((error) => ({\n path: error.path.join('.'),\n message: error.message,\n }));\n\n logger.warn('Manifest validation failed', { errors });\n\n return {\n valid: false,\n errors,\n };\n }\n}\n\n/**\n * Create a manifest validator\n */\nexport function createManifestValidator(): ManifestValidator {\n return new DefaultManifestValidator();\n}\n\n/**\n * Validate a manifest and throw if invalid\n */\nexport async function validateManifest(manifest: Manifest): Promise<void> {\n const validator = createManifestValidator();\n const result = await validator.validate(manifest);\n\n if (!result.valid) {\n const errorMessage = result.errors.map((e) => `${e.path}: ${e.message}`).join('\\n');\n throw new Error(`Manifest validation failed:\\n${errorMessage}`);\n }\n}\n","/**\n * Environment manager - manages environment variables\n */\n\nimport { writeFile } from 'node:fs/promises';\n\nimport type { StateManager } from '../state/state-manager.js';\nimport { logger } from '../utils/logger.js';\n\nimport type { EnvironmentAggregator } from './env-aggregator.js';\n\nexport interface EnvironmentManager {\n /**\n * Get all environment variables for a project\n */\n getEnvironmentVariables(environment: string): Promise<Record<string, string>>;\n\n /**\n * Get environment variables in dotenv format\n */\n toDotenv(environment: string): Promise<string>;\n\n /**\n * Get environment variables in JSON format\n */\n toJSON(environment: string): Promise<string>;\n\n /**\n * Write environment variables to file\n */\n writeToFile(environment: string, filePath: string, format: 'env' | 'json'): Promise<void>;\n}\n\nexport class DefaultEnvironmentManager implements EnvironmentManager {\n constructor(\n private readonly stateManager: StateManager,\n private readonly envAggregator: EnvironmentAggregator\n ) {}\n\n async getEnvironmentVariables(environment: string): Promise<Record<string, string>> {\n logger.info('Getting environment variables', { environment });\n\n // Load project state\n const state = await this.stateManager.load();\n if (!state) {\n throw new Error('Project not initialized');\n }\n\n // Aggregate environment variables from all resources\n const resourceEnvVars = await this.envAggregator.aggregate(state);\n\n // Add environment-specific variables\n const envVars: Record<string, string> = {\n NODE_ENV: environment,\n ENVIRONMENT: environment,\n PROJECT_ID: state.projectId,\n ...resourceEnvVars,\n };\n\n return envVars;\n }\n\n async toDotenv(environment: string): Promise<string> {\n const vars = await this.getEnvironmentVariables(environment);\n\n // Format as dotenv file with proper escaping\n const lines = Object.entries(vars).map(([key, value]) => {\n // Escape values that contain special characters\n const escapedValue = value.includes(' ') || value.includes('#') || value.includes('=')\n ? `\"${value.replace(/\"/g, '\\\\\"')}\"`\n : value;\n return `${key}=${escapedValue}`;\n });\n\n return lines.join('\\n');\n }\n\n async toJSON(environment: string): Promise<string> {\n const vars = await this.getEnvironmentVariables(environment);\n return JSON.stringify(vars, null, 2);\n }\n\n async writeToFile(environment: string, filePath: string, format: 'env' | 'json'): Promise<void> {\n logger.info('Writing environment variables to file', { environment, filePath, format });\n\n const content = format === 'env'\n ? await this.toDotenv(environment)\n : await this.toJSON(environment);\n\n await writeFile(filePath, content, 'utf-8');\n\n logger.info('Environment variables written successfully', { filePath });\n }\n}\n","/**\n * Environment aggregator - collects environment variables from all resources\n */\n\nimport { ProviderFactory } from '../providers/factory.js';\nimport type { CredentialStore } from '../state/credential-store.js';\nimport { ResourceType } from '../types/resource.js';\nimport type { ProjectState } from '../types/state.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface EnvironmentAggregator {\n /**\n * Aggregate environment variables from all provisioned resources\n */\n aggregate(state: ProjectState): Promise<Record<string, string>>;\n}\n\nexport class DefaultEnvironmentAggregator implements EnvironmentAggregator {\n constructor(private readonly credentialStore: CredentialStore) {}\n\n async aggregate(state: ProjectState): Promise<Record<string, string>> {\n logger.info('Aggregating environment variables from resources');\n\n const envVars: Record<string, string> = {};\n\n // Collect environment variables from each resource\n for (const [resourceName, resourceState] of Object.entries(state.resources)) {\n try {\n // Get credentials for provider\n const credentials = await this.credentialStore.load(resourceState.provider);\n if (!credentials) {\n logger.warn('No credentials found for provider, skipping', {\n resource: resourceName,\n provider: resourceState.provider,\n });\n continue;\n }\n\n // Create provider instance\n const provider = await ProviderFactory.create(\n resourceState.type as ResourceType,\n resourceState.provider,\n credentials\n );\n\n // Get environment variables from provider\n const resourceEnvVars = await provider.getEnvironmentVariables(resourceState.resourceId);\n\n // Merge with prefix based on resource name\n const prefix = resourceName.toUpperCase().replace(/[^A-Z0-9]/g, '_');\n for (const [key, value] of Object.entries(resourceEnvVars)) {\n // Add both prefixed and unprefixed versions\n envVars[key] = value;\n envVars[`${prefix}_${key}`] = value;\n }\n\n logger.debug('Collected environment variables', {\n resource: resourceName,\n count: Object.keys(resourceEnvVars).length,\n });\n } catch (error) {\n logger.error('Failed to get environment variables from resource', {\n resource: resourceName,\n error,\n });\n // Continue with other resources\n }\n }\n\n logger.info('Environment variable aggregation complete', {\n totalVars: Object.keys(envVars).length,\n });\n\n return envVars;\n }\n}\n","/**\n * Validation utilities\n */\n\nimport { ValidationError } from '../errors/index.js';\n\nconst PROJECT_NAME_REGEX = /^[a-z0-9-]{3,50}$/;\nconst RESOURCE_NAME_REGEX = /^[a-z0-9-_]{3,50}$/;\n\nexport function validateProjectName(name: string): void {\n if (!PROJECT_NAME_REGEX.test(name)) {\n throw new ValidationError(\n 'Project name must be 3-50 characters long and contain only lowercase letters, numbers, and hyphens',\n { name }\n );\n }\n}\n\nexport function validateResourceName(name: string): void {\n if (!RESOURCE_NAME_REGEX.test(name)) {\n throw new ValidationError(\n 'Resource name must be 3-50 characters long and contain only lowercase letters, numbers, hyphens, and underscores',\n { name }\n );\n }\n}\n"],"mappings":"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","names":["ResourceType","ResourceStatus","DeploymentStatus","constants","readFile","writeFile","access","mkdir","join","dirname","readFile","dirname","mkdir","writeFile","access","constants","join","constants","readFile","writeFile","access","mkdir","join","dirname","readFile","dirname","mkdir","writeFile","access","constants","join","writeFile","writeFile"]}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Resource type definitions
3
+ */
4
+ declare enum ResourceType {
5
+ DATABASE = "database",
6
+ CACHE = "cache",
7
+ STORAGE = "storage",
8
+ EMAIL = "email",
9
+ COMPUTE = "compute"
10
+ }
11
+ declare enum ResourceStatus {
12
+ PENDING = "pending",
13
+ PROVISIONING = "provisioning",
14
+ READY = "ready",
15
+ UPDATING = "updating",
16
+ DESTROYING = "destroying",
17
+ ERROR = "error"
18
+ }
19
+ interface Resource {
20
+ id: string;
21
+ type: ResourceType;
22
+ provider: string;
23
+ name: string;
24
+ config: ResourceConfig;
25
+ outputs: ResourceOutputs;
26
+ status: ResourceStatus;
27
+ dependencies: string[];
28
+ }
29
+ type ResourceConfig = Record<string, unknown>;
30
+ type ResourceOutputs = Record<string, unknown>;
31
+ interface DatabaseConfig {
32
+ region?: string;
33
+ instanceType?: string;
34
+ storage?: number;
35
+ version?: string;
36
+ }
37
+ interface DatabaseOutputs {
38
+ connectionString: string;
39
+ host: string;
40
+ port: number;
41
+ database: string;
42
+ username: string;
43
+ password: string;
44
+ sslEnabled: boolean;
45
+ }
46
+ interface CacheConfig {
47
+ region?: string;
48
+ maxMemory?: string;
49
+ evictionPolicy?: 'allkeys-lru' | 'volatile-lru';
50
+ }
51
+ interface CacheOutputs {
52
+ host: string;
53
+ port: number;
54
+ password?: string;
55
+ url: string;
56
+ tls: boolean;
57
+ }
58
+ interface StorageConfig {
59
+ region?: string;
60
+ public?: boolean;
61
+ cors?: CorsConfig;
62
+ }
63
+ interface CorsConfig {
64
+ allowedOrigins: string[];
65
+ allowedMethods?: string[];
66
+ allowedHeaders?: string[];
67
+ }
68
+ interface StorageOutputs {
69
+ bucketName: string;
70
+ endpoint: string;
71
+ accessKeyId: string;
72
+ secretAccessKey: string;
73
+ publicUrl?: string;
74
+ }
75
+ interface EmailConfig {
76
+ domain?: string;
77
+ fromEmail?: string;
78
+ fromName?: string;
79
+ replyTo?: string;
80
+ dkimEnabled?: boolean;
81
+ }
82
+ interface EmailOutputs {
83
+ domain: string;
84
+ apiEndpoint: string;
85
+ fromEmail: string;
86
+ fromName: string;
87
+ verified: boolean;
88
+ dkimEnabled: boolean;
89
+ apiKey?: string;
90
+ smtpHost?: string;
91
+ smtpPort?: number;
92
+ smtpUsername?: string;
93
+ smtpPassword?: string;
94
+ metadata?: Record<string, unknown>;
95
+ }
96
+ interface ComputeConfig {
97
+ name?: string;
98
+ runtime: 'node' | 'python' | 'go';
99
+ buildCommand?: string;
100
+ startCommand?: string;
101
+ dockerfilePath?: string;
102
+ instanceType?: string;
103
+ environmentVariables?: Record<string, string>;
104
+ region?: string;
105
+ healthCheckPath?: string;
106
+ healthCheck?: string;
107
+ }
108
+ interface ComputeOutputs {
109
+ url: string;
110
+ version: string;
111
+ provider?: string;
112
+ region?: string;
113
+ deploymentId?: string;
114
+ status?: string;
115
+ metadata?: Record<string, unknown>;
116
+ }
117
+
118
+ /**
119
+ * Manifest type definitions (setbase.json)
120
+ */
121
+
122
+ interface Manifest {
123
+ $schema?: string;
124
+ version: '1.0';
125
+ project: ProjectConfig;
126
+ resources: ResourceDefinitions;
127
+ deployment?: DeploymentConfig;
128
+ }
129
+ interface ProjectConfig {
130
+ name: string;
131
+ description?: string;
132
+ runtime: 'node' | 'python' | 'go';
133
+ framework?: string;
134
+ }
135
+ interface ResourceDefinitions {
136
+ database?: ResourceDefinition<DatabaseConfig>;
137
+ cache?: ResourceDefinition<CacheConfig>;
138
+ storage?: ResourceDefinition<StorageConfig>;
139
+ email?: ResourceDefinition<EmailConfig>;
140
+ }
141
+ interface ResourceDefinition<T = Record<string, unknown>> {
142
+ provider: string;
143
+ config: T;
144
+ dependsOn?: string[];
145
+ }
146
+ interface DeploymentConfig {
147
+ provider: string;
148
+ config: ComputeConfig;
149
+ }
150
+
151
+ /**
152
+ * Provider type definitions
153
+ */
154
+
155
+ interface Provider<TConfig = unknown, TOutputs = unknown> {
156
+ readonly id: string;
157
+ readonly type: ResourceType;
158
+ readonly version: string;
159
+ initialize(credentials: ProviderCredentials): Promise<void>;
160
+ validate(config: TConfig): Promise<ValidationResult>;
161
+ provision(config: TConfig): Promise<ProvisionResult<TOutputs>>;
162
+ update(resourceId: string, config: TConfig): Promise<UpdateResult<TOutputs>>;
163
+ destroy(resourceId: string): Promise<void>;
164
+ getStatus(resourceId: string): Promise<ResourceStatus>;
165
+ getOutputs(resourceId: string): Promise<TOutputs>;
166
+ getEnvironmentVariables(resourceId: string): Promise<Record<string, string>>;
167
+ }
168
+ interface ProviderCredentials {
169
+ apiKey?: string;
170
+ secretKey?: string;
171
+ [key: string]: unknown;
172
+ }
173
+ interface ValidationResult {
174
+ valid: boolean;
175
+ errors: string[];
176
+ }
177
+ interface ProvisionResult<TOutputs = unknown> {
178
+ resourceId: string;
179
+ outputs: TOutputs;
180
+ }
181
+ interface UpdateResult<TOutputs = unknown> {
182
+ outputs: TOutputs;
183
+ }
184
+ interface ProviderMetadata {
185
+ id: string;
186
+ name: string;
187
+ type: ResourceType;
188
+ version: string;
189
+ description: string;
190
+ }
191
+
192
+ /**
193
+ * Deployment type definitions
194
+ */
195
+ declare enum DeploymentStatus {
196
+ PENDING = "pending",
197
+ BUILDING = "building",
198
+ DEPLOYING = "deploying",
199
+ READY = "ready",
200
+ FAILED = "failed"
201
+ }
202
+ interface Deployment {
203
+ id: string;
204
+ projectId: string;
205
+ environment: string;
206
+ provider: string;
207
+ status: DeploymentStatus;
208
+ url?: string;
209
+ version?: string;
210
+ createdAt: Date;
211
+ updatedAt: Date;
212
+ }
213
+ interface DeploymentOptions {
214
+ environment: string;
215
+ force?: boolean;
216
+ skipBuild?: boolean;
217
+ }
218
+ interface DeploymentResult {
219
+ id: string;
220
+ url: string;
221
+ status: DeploymentStatus;
222
+ version: string;
223
+ }
224
+
225
+ /**
226
+ * State management type definitions
227
+ */
228
+
229
+ interface ProjectState {
230
+ version: string;
231
+ projectId: string;
232
+ resources: Record<string, ResourceState>;
233
+ deployments: DeploymentState[];
234
+ lastUpdated: string;
235
+ }
236
+ interface ResourceState {
237
+ type: string;
238
+ provider: string;
239
+ resourceId: string;
240
+ status: ResourceStatus;
241
+ metadata: Record<string, unknown>;
242
+ createdAt: string;
243
+ updatedAt: string;
244
+ }
245
+ interface DeploymentState {
246
+ id: string;
247
+ environment: string;
248
+ provider: string;
249
+ status: DeploymentStatus;
250
+ url?: string;
251
+ version?: string;
252
+ createdAt: string;
253
+ }
254
+ interface StateFile {
255
+ version: string;
256
+ projectId: string;
257
+ resources: Record<string, ResourceState>;
258
+ deployments: DeploymentState[];
259
+ }
260
+ interface CredentialsFile {
261
+ version: string;
262
+ encrypted: boolean;
263
+ providers: Record<string, Record<string, unknown>>;
264
+ }
265
+
266
+ /**
267
+ * Project type definitions
268
+ */
269
+
270
+ interface Project {
271
+ id: string;
272
+ name: string;
273
+ manifest: Manifest;
274
+ state: ProjectState;
275
+ createdAt: Date;
276
+ updatedAt: Date;
277
+ }
278
+ interface ProjectInitOptions {
279
+ name: string;
280
+ runtime: 'node' | 'python' | 'go';
281
+ framework?: string;
282
+ resources?: string[];
283
+ }
284
+ interface ProjectDestroyOptions {
285
+ force?: boolean;
286
+ keepState?: boolean;
287
+ }
288
+
289
+ export { type CacheConfig, type CacheOutputs, type ComputeConfig, type ComputeOutputs, type CorsConfig, type CredentialsFile, type DatabaseConfig, type DatabaseOutputs, type Deployment, type DeploymentConfig, type DeploymentOptions, type DeploymentResult, type DeploymentState, DeploymentStatus, type EmailConfig, type EmailOutputs, type Manifest, type Project, type ProjectConfig, type ProjectDestroyOptions, type ProjectInitOptions, type ProjectState, type Provider, type ProviderCredentials, type ProviderMetadata, type ProvisionResult, type Resource, type ResourceConfig, type ResourceDefinition, type ResourceDefinitions, type ResourceOutputs, type ResourceState, ResourceStatus, ResourceType, type StateFile, type StorageConfig, type StorageOutputs, type UpdateResult, type ValidationResult };
@@ -0,0 +1,34 @@
1
+ // src/types/resource.ts
2
+ var ResourceType = /* @__PURE__ */ ((ResourceType2) => {
3
+ ResourceType2["DATABASE"] = "database";
4
+ ResourceType2["CACHE"] = "cache";
5
+ ResourceType2["STORAGE"] = "storage";
6
+ ResourceType2["EMAIL"] = "email";
7
+ ResourceType2["COMPUTE"] = "compute";
8
+ return ResourceType2;
9
+ })(ResourceType || {});
10
+ var ResourceStatus = /* @__PURE__ */ ((ResourceStatus2) => {
11
+ ResourceStatus2["PENDING"] = "pending";
12
+ ResourceStatus2["PROVISIONING"] = "provisioning";
13
+ ResourceStatus2["READY"] = "ready";
14
+ ResourceStatus2["UPDATING"] = "updating";
15
+ ResourceStatus2["DESTROYING"] = "destroying";
16
+ ResourceStatus2["ERROR"] = "error";
17
+ return ResourceStatus2;
18
+ })(ResourceStatus || {});
19
+
20
+ // src/types/deployment.ts
21
+ var DeploymentStatus = /* @__PURE__ */ ((DeploymentStatus2) => {
22
+ DeploymentStatus2["PENDING"] = "pending";
23
+ DeploymentStatus2["BUILDING"] = "building";
24
+ DeploymentStatus2["DEPLOYING"] = "deploying";
25
+ DeploymentStatus2["READY"] = "ready";
26
+ DeploymentStatus2["FAILED"] = "failed";
27
+ return DeploymentStatus2;
28
+ })(DeploymentStatus || {});
29
+ export {
30
+ DeploymentStatus,
31
+ ResourceStatus,
32
+ ResourceType
33
+ };
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/types/resource.ts","../../src/types/deployment.ts"],"sourcesContent":["/**\n * Resource type definitions\n */\n\nexport enum ResourceType {\n DATABASE = 'database',\n CACHE = 'cache',\n STORAGE = 'storage',\n EMAIL = 'email',\n COMPUTE = 'compute',\n}\n\nexport enum ResourceStatus {\n PENDING = 'pending',\n PROVISIONING = 'provisioning',\n READY = 'ready',\n UPDATING = 'updating',\n DESTROYING = 'destroying',\n ERROR = 'error',\n}\n\nexport interface Resource {\n id: string;\n type: ResourceType;\n provider: string;\n name: string;\n config: ResourceConfig;\n outputs: ResourceOutputs;\n status: ResourceStatus;\n dependencies: string[];\n}\n\nexport type ResourceConfig = Record<string, unknown>;\nexport type ResourceOutputs = Record<string, unknown>;\n\n// Database resource types\nexport interface DatabaseConfig {\n region?: string;\n instanceType?: string;\n storage?: number;\n version?: string;\n}\n\nexport interface DatabaseOutputs {\n connectionString: string;\n host: string;\n port: number;\n database: string;\n username: string;\n password: string;\n sslEnabled: boolean;\n}\n\n// Cache resource types\nexport interface CacheConfig {\n region?: string;\n maxMemory?: string;\n evictionPolicy?: 'allkeys-lru' | 'volatile-lru';\n}\n\nexport interface CacheOutputs {\n host: string;\n port: number;\n password?: string;\n url: string;\n tls: boolean;\n}\n\n// Storage resource types\nexport interface StorageConfig {\n region?: string;\n public?: boolean;\n cors?: CorsConfig;\n}\n\nexport interface CorsConfig {\n allowedOrigins: string[];\n allowedMethods?: string[];\n allowedHeaders?: string[];\n}\n\nexport interface StorageOutputs {\n bucketName: string;\n endpoint: string;\n accessKeyId: string;\n secretAccessKey: string;\n publicUrl?: string;\n}\n\n// Email resource types\nexport interface EmailConfig {\n domain?: string;\n fromEmail?: string;\n fromName?: string;\n replyTo?: string;\n dkimEnabled?: boolean;\n}\n\nexport interface EmailOutputs {\n domain: string;\n apiEndpoint: string;\n fromEmail: string;\n fromName: string;\n verified: boolean;\n dkimEnabled: boolean;\n apiKey?: string;\n smtpHost?: string;\n smtpPort?: number;\n smtpUsername?: string;\n smtpPassword?: string;\n metadata?: Record<string, unknown>;\n}\n\n// Compute resource types\nexport interface ComputeConfig {\n name?: string;\n runtime: 'node' | 'python' | 'go';\n buildCommand?: string;\n startCommand?: string;\n dockerfilePath?: string;\n instanceType?: string;\n environmentVariables?: Record<string, string>;\n region?: string;\n healthCheckPath?: string;\n healthCheck?: string;\n}\n\nexport interface ComputeOutputs {\n url: string;\n version: string;\n provider?: string;\n region?: string;\n deploymentId?: string;\n status?: string;\n metadata?: Record<string, unknown>;\n}\n","/**\n * Deployment type definitions\n */\n\nexport enum DeploymentStatus {\n PENDING = 'pending',\n BUILDING = 'building',\n DEPLOYING = 'deploying',\n READY = 'ready',\n FAILED = 'failed',\n}\n\nexport interface Deployment {\n id: string;\n projectId: string;\n environment: string;\n provider: string;\n status: DeploymentStatus;\n url?: string;\n version?: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface DeploymentOptions {\n environment: string;\n force?: boolean;\n skipBuild?: boolean;\n}\n\nexport interface DeploymentResult {\n id: string;\n url: string;\n status: DeploymentStatus;\n version: string;\n}\n"],"mappings":";AAIO,IAAK,eAAL,kBAAKA,kBAAL;AACL,EAAAA,cAAA,cAAW;AACX,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,aAAU;AALA,SAAAA;AAAA,GAAA;AAQL,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gBAAA,aAAU;AACV,EAAAA,gBAAA,kBAAe;AACf,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,cAAW;AACX,EAAAA,gBAAA,gBAAa;AACb,EAAAA,gBAAA,WAAQ;AANE,SAAAA;AAAA,GAAA;;;ACRL,IAAK,mBAAL,kBAAKC,sBAAL;AACL,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,eAAY;AACZ,EAAAA,kBAAA,WAAQ;AACR,EAAAA,kBAAA,YAAS;AALC,SAAAA;AAAA,GAAA;","names":["ResourceType","ResourceStatus","DeploymentStatus"]}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@setbase/core",
3
+ "version": "0.1.0",
4
+ "description": "Core business logic and abstractions for Setbase",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ },
11
+ "./types": {
12
+ "types": "./dist/types/index.d.ts",
13
+ "import": "./dist/types/index.js"
14
+ }
15
+ },
16
+ "main": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsup",
23
+ "dev": "tsup --watch",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "lint": "eslint src/",
27
+ "typecheck": "tsc --noEmit",
28
+ "clean": "rm -rf dist *.tsbuildinfo"
29
+ },
30
+ "dependencies": {
31
+ "zod": "^3.23.8",
32
+ "nanoid": "^5.0.7"
33
+ },
34
+ "devDependencies": {
35
+ "@setbase/config": "workspace:*",
36
+ "@types/node": "^20.14.0",
37
+ "tsup": "^8.1.0",
38
+ "typescript": "^5.6.0",
39
+ "vitest": "^2.0.0"
40
+ },
41
+ "license": "MIT",
42
+ "author": "Setbase",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "https://github.com/set-base/SetBase.git"
46
+ },
47
+ "homepage": "https://setbase.pages.dev",
48
+ "bugs": {
49
+ "url": "https://github.com/set-base/SetBase/issues"
50
+ },
51
+ "keywords": [
52
+ "infrastructure",
53
+ "deployment",
54
+ "cloud",
55
+ "provisioning",
56
+ "devops",
57
+ "iaac"
58
+ ],
59
+ "publishConfig": {
60
+ "access": "public"
61
+ }
62
+ }