@friggframework/schemas
Version:
Canonical JSON Schema definitions for Frigg Framework
377 lines (302 loc) • 10.1 kB
Markdown
# @friggframework/schemas
Canonical JSON Schema definitions for the Frigg Framework, providing formal validation and documentation for all core configuration objects.
## Overview
This package contains the official, versioned schemas for:
- **App Definition**: Configuration for Frigg applications
- **Integration Definition**: Configuration for Frigg integrations
- **API Module Definition**: Configuration for Frigg API modules
- **Serverless Configuration**: AWS deployment configuration
- **Environment Configuration**: Environment variable management
- **Core Models**: User, Entity, and Credential data models
## Installation
```bash
npm install @friggframework/schemas
```
## Usage
### Basic Validation
```javascript
const { validateAppDefinition } = require('@friggframework/schemas');
const appDefinition = {
integrations: [],
user: { password: true },
encryption: { useDefaultKMSForFieldLevelEncryption: true }
};
const result = validateAppDefinition(appDefinition);
if (result.valid) {
console.log('✅ App definition is valid');
} else {
console.error('❌ Validation errors:', result.errors);
}
```
### Advanced Validation
```javascript
const { validate, formatErrors } = require('@friggframework/schemas');
// Validate any schema by name
const result = validate('integration-definition', integrationData);
if (!result.valid) {
console.error('Validation failed:');
console.error(formatErrors(result.errors));
}
```
### Schema Introspection
```javascript
const { getSchemas, getSchema } = require('@friggframework/schemas');
// Get all available schemas
const allSchemas = getSchemas();
console.log('Available schemas:', Object.keys(allSchemas));
// Get a specific schema
const appSchema = getSchema('app-definition');
console.log('App definition schema:', appSchema);
```
## Available Schemas
### App Definition Schema
Defines the structure for Frigg application configuration.
**Key Properties:**
- `integrations` (required): Array of integration classes
- `user`: User management configuration
- `security`: CORS, rate limiting, and security settings
- `encryption`: KMS and encryption settings
- `logging`: Logging configuration
- `custom`: Application-specific settings
**Example:**
```javascript
const appDefinition = {
integrations: [HubSpotIntegration],
user: { password: true },
encryption: { useDefaultKMSForFieldLevelEncryption: true },
vpc: { enable: true },
security: {
cors: {
origin: "http://localhost:3000",
credentials: true
}
},
logging: { level: "info" },
custom: {
appName: "My Frigg App",
version: "1.0.0",
environment: "development"
}
};
```
### Integration Definition Schema
Defines the structure for Frigg integrations.
**Key Properties:**
- `name` (required): Integration identifier
- `version` (required): Semantic version
- `options`: Configuration options and display properties
- `capabilities`: Authentication, webhooks, sync capabilities
- `requirements`: Environment variables and dependencies
**Example:**
```javascript
const integrationDefinition = {
name: "hubspot",
version: "2.0.0",
options: {
type: "api",
hasUserConfig: true,
display: {
name: "HubSpot CRM",
description: "Integrate with HubSpot for CRM functionality",
category: "CRM",
tags: ["crm", "marketing"]
}
},
capabilities: {
auth: ["oauth2"],
webhooks: true,
sync: { bidirectional: true, incremental: true }
}
};
```
### API Module Definition Schema
Defines the structure for Frigg API modules.
**Key Properties:**
- `moduleName` (required): Module identifier
- `getName` (required): Function returning module name
- `requiredAuthMethods` (required): Authentication configuration
- `env`: Environment variable configuration
- `config`: Module-specific configuration
**Example:**
```javascript
const apiModuleDefinition = {
moduleName: "hubspot",
getName: function() { return "hubspot"; },
requiredAuthMethods: {
getToken: async function(api, params) { /* implementation */ },
apiPropertiesToPersist: {
credential: ["access_token", "refresh_token"],
entity: ["external_id", "portal_id"]
},
getCredentialDetails: async function(api) { /* implementation */ },
testAuthRequest: async function() { /* implementation */ }
},
env: {
client_id: process.env.HUBSPOT_CLIENT_ID,
client_secret: process.env.HUBSPOT_CLIENT_SECRET
}
};
```
### Serverless Configuration Schema
Defines the structure for Serverless Framework configuration used in AWS deployments.
**Key Properties:**
- `service` (required): Service name for the deployment
- `provider` (required): Cloud provider configuration (AWS, runtime, region, etc.)
- `functions`: Lambda function definitions with handlers and events
- `resources`: CloudFormation resource definitions
- `plugins`: Serverless Framework plugins
**Example:**
```javascript
const serverlessConfig = {
frameworkVersion: ">=3.17.0",
service: "frigg-backend",
provider: {
name: "aws",
runtime: "nodejs20.x",
timeout: 30,
region: "us-east-1"
},
functions: {
api: {
handler: "./src/api.handler",
events: [{
http: {
path: "/api/{proxy+}",
method: "ANY",
cors: true
}
}]
}
}
};
```
### Environment Configuration Schema
Defines the structure for environment variable management and validation.
**Key Properties:**
- `environments`: Environment-specific configurations (development, staging, production)
- `global`: Global settings for masking, encryption, and audit logging
- `templates`: Reusable templates for different integration types
**Example:**
```javascript
const environmentConfig = {
environments: {
development: {
variables: {
DATABASE_URL: {
value: "mongodb://localhost:27017/frigg-dev",
required: true,
sensitive: true,
description: "MongoDB connection string"
}
},
integrations: {
hubspot: {
required: ["HUBSPOT_CLIENT_ID", "HUBSPOT_CLIENT_SECRET"],
prefix: "HUBSPOT"
}
}
}
},
global: {
encryptionKeys: {
kmsKeyId: "12345678-1234-1234-1234-123456789abc",
algorithm: "AES-256-GCM"
}
}
};
```
### Core Models Schema
Defines the structure for core Frigg data models including User, Entity, and Credential.
**Key Properties:**
- `user`: User model with authentication, preferences, and permissions
- `credential`: Authentication credential storage with encryption
- `entity`: Data entity configuration with sync settings
**Example:**
```javascript
const coreModels = {
user: {
_id: "507f1f77bcf86cd799439011",
email: "user@example.com",
role: "user",
permissions: ["integrations:read", "integrations:write"],
preferences: {
theme: "dark",
notifications: { email: true }
}
},
credential: {
_id: "507f1f77bcf86cd799439012",
userId: "507f1f77bcf86cd799439011",
subType: "hubspot",
auth_is_valid: true,
authData: {
access_token: "encrypted_token",
token_type: "Bearer"
}
},
entity: {
_id: "507f1f77bcf86cd799439013",
credentialId: "507f1f77bcf86cd799439012",
userId: "507f1f77bcf86cd799439011",
subType: "contact",
name: "HubSpot Contacts",
status: "active"
}
};
```
## API Reference
### Validation Functions
#### `validate(schemaName, data)`
Validates data against a named schema.
**Parameters:**
- `schemaName` (string): Name of schema ('app-definition', 'integration-definition', 'api-module-definition', 'serverless-config', 'environment-config', 'core-models')
- `data` (object): Data to validate
**Returns:** `{ valid: boolean, errors: array|null, data: object }`
#### `validateAppDefinition(appDefinition)`
Validates an app definition object.
#### `validateIntegrationDefinition(integrationDefinition)`
Validates an integration definition object.
#### `validateApiModuleDefinition(apiModuleDefinition)`
Validates an API module definition object.
#### `validateServerlessConfig(serverlessConfig)`
Validates a Serverless Framework configuration object.
#### `validateEnvironmentConfig(environmentConfig)`
Validates an environment configuration object.
#### `validateCoreModels(coreModels)`
Validates core data models (User, Entity, Credential).
### Schema Access Functions
#### `getSchemas()`
Returns all available schemas as an object.
#### `getSchema(schemaName)`
Returns a specific schema by name.
### Utility Functions
#### `formatErrors(errors)`
Formats AJV validation errors for human-readable output.
## Development
### Running Schema Validation
```bash
npm run validate
```
This validates all schemas against the JSON Schema meta-schema and tests all examples.
### Testing
```bash
npm test
```
## Schema Versioning
Schemas follow semantic versioning. Breaking changes to schemas will result in major version bumps.
Current schema versions:
- App Definition: Draft-07 (JSON Schema)
- Integration Definition: Draft-07 (JSON Schema)
- API Module Definition: Draft-07 (JSON Schema)
- Serverless Configuration: Draft-07 (JSON Schema)
- Environment Configuration: Draft-07 (JSON Schema)
- Core Models: Draft-07 (JSON Schema)
## Contributing
When updating schemas:
1. Update the schema file in `schemas/`
2. Update examples in the schema
3. Run `npm run validate` to ensure validity
4. Update this README if needed
5. Update version if breaking changes
## License
MIT - see LICENSE file for details.