@reactive-contracts/compiler 0.1.1-beta → 0.1.3-beta
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.
package/dist/index.cli.js
CHANGED
|
@@ -135,8 +135,7 @@ ${gitignoreTemplate}` : gitignoreTemplate;
|
|
|
135
135
|
// src/cli/commands/compile.ts
|
|
136
136
|
import { glob } from "glob";
|
|
137
137
|
import * as path2 from "path";
|
|
138
|
-
import {
|
|
139
|
-
import { register } from "tsx/esm/api";
|
|
138
|
+
import { createJiti } from "jiti";
|
|
140
139
|
|
|
141
140
|
// src/config/index.ts
|
|
142
141
|
async function loadConfig(_configPath = "./rcontracts.config.ts") {
|
|
@@ -825,7 +824,11 @@ ${indentStr}}`;
|
|
|
825
824
|
}
|
|
826
825
|
|
|
827
826
|
// src/cli/commands/compile.ts
|
|
828
|
-
var
|
|
827
|
+
var jiti = createJiti(import.meta.url, {
|
|
828
|
+
interopDefault: true,
|
|
829
|
+
moduleCache: false
|
|
830
|
+
// Disable cache to avoid stale imports
|
|
831
|
+
});
|
|
829
832
|
async function compile() {
|
|
830
833
|
try {
|
|
831
834
|
header("Compiling Reactive Contracts");
|
|
@@ -850,8 +853,7 @@ async function compile() {
|
|
|
850
853
|
const fileName = path2.basename(file, ".contract.ts");
|
|
851
854
|
start(`Processing ${fileName}...`);
|
|
852
855
|
try {
|
|
853
|
-
const
|
|
854
|
-
const module = await import(fileUrl);
|
|
856
|
+
const module = await jiti.import(file);
|
|
855
857
|
const contractExports = Object.entries(module).filter(
|
|
856
858
|
([key, value]) => key.endsWith("Contract") && typeof value === "object" && value !== null && "_brand" in value && value._brand === "Contract"
|
|
857
859
|
);
|
|
@@ -921,7 +923,6 @@ async function compile() {
|
|
|
921
923
|
errorCount++;
|
|
922
924
|
}
|
|
923
925
|
}
|
|
924
|
-
tsxUnregister();
|
|
925
926
|
console.log("");
|
|
926
927
|
if (successCount > 0) {
|
|
927
928
|
success(`\u2713 Successfully compiled ${successCount} contract(s)`);
|
|
@@ -942,9 +943,12 @@ async function compile() {
|
|
|
942
943
|
// src/cli/commands/validate.ts
|
|
943
944
|
import { glob as glob2 } from "glob";
|
|
944
945
|
import * as path3 from "path";
|
|
945
|
-
import {
|
|
946
|
-
|
|
947
|
-
|
|
946
|
+
import { createJiti as createJiti2 } from "jiti";
|
|
947
|
+
var jiti2 = createJiti2(import.meta.url, {
|
|
948
|
+
interopDefault: true,
|
|
949
|
+
moduleCache: false
|
|
950
|
+
// Disable cache to avoid stale imports
|
|
951
|
+
});
|
|
948
952
|
async function validate() {
|
|
949
953
|
try {
|
|
950
954
|
header("Validating Reactive Contracts");
|
|
@@ -970,8 +974,7 @@ async function validate() {
|
|
|
970
974
|
const fileName = path3.basename(file, ".contract.ts");
|
|
971
975
|
start(`Validating ${fileName}...`);
|
|
972
976
|
try {
|
|
973
|
-
const
|
|
974
|
-
const module = await import(fileUrl);
|
|
977
|
+
const module = await jiti2.import(file);
|
|
975
978
|
const contractExports = Object.entries(module).filter(
|
|
976
979
|
([key, value]) => key.endsWith("Contract") && typeof value === "object" && value !== null && "_brand" in value && value._brand === "Contract"
|
|
977
980
|
);
|
|
@@ -1031,7 +1034,6 @@ async function validate() {
|
|
|
1031
1034
|
invalidCount++;
|
|
1032
1035
|
}
|
|
1033
1036
|
}
|
|
1034
|
-
tsxUnregister2();
|
|
1035
1037
|
console.log("");
|
|
1036
1038
|
console.log("Validation Summary:");
|
|
1037
1039
|
console.log(` \u2713 Valid: ${validCount}`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reactive-contracts/compiler",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3-beta",
|
|
4
4
|
"description": "Build-time compiler and validator for Reactive Contracts",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -15,18 +15,18 @@
|
|
|
15
15
|
},
|
|
16
16
|
"files": [
|
|
17
17
|
"dist",
|
|
18
|
-
"
|
|
18
|
+
"!dist/**/*.map",
|
|
19
19
|
"README.md"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"commander": "^14.0.2",
|
|
23
23
|
"fs-extra": "^11.3.3",
|
|
24
24
|
"glob": "^13.0.0",
|
|
25
|
+
"jiti": "^2.4.2",
|
|
25
26
|
"ora": "^9.0.0",
|
|
26
27
|
"picocolors": "^1.1.1",
|
|
27
|
-
"tsx": "^4.21.0",
|
|
28
28
|
"zod": "^4.3.5",
|
|
29
|
-
"@reactive-contracts/core": "0.1.
|
|
29
|
+
"@reactive-contracts/core": "0.1.3-beta"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/fs-extra": "^11.0.4",
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/index.ts","../src/validator/index.ts","../src/analyzer/index.ts","../src/generator/index.ts"],"names":["mkdir","dirname","writeFile"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CompilerConfig, ConfigDefinition } from '../types.js';\n\n/**\n * Define a Reactive Contracts compiler configuration\n */\nexport function defineConfig(config: CompilerConfig): ConfigDefinition {\n return config;\n}\n\n/**\n * Load configuration from file\n */\nexport async function loadConfig(\n _configPath: string = './rcontracts.config.ts'\n): Promise<CompilerConfig> {\n // TODO: Implement config loading\n return {\n contracts: './contracts/**/*.contract.ts',\n output: {\n frontend: './generated/frontend',\n backend: './generated/backend',\n runtime: './generated/runtime',\n },\n };\n}\n","import type {\n Contract,\n ShapeDefinition,\n TypeDefinition,\n DerivedField,\n ContractConstraints,\n ReactivityConfig,\n VersioningConfig,\n} from '@reactive-contracts/core';\nimport type { ValidationResult } from '../types.js';\n\n/**\n * Validate a contract structure\n */\nexport function validateContract(contract: Contract): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Validate basic contract structure\n if (!contract || typeof contract !== 'object') {\n errors.push('Contract must be a valid object');\n return { valid: false, errors, warnings };\n }\n\n if (contract._brand !== 'Contract') {\n errors.push('Invalid contract: missing _brand property');\n return { valid: false, errors, warnings };\n }\n\n const { definition } = contract;\n\n // Validate name\n if (!definition.name || typeof definition.name !== 'string') {\n errors.push('Contract must have a valid name (non-empty string)');\n } else if (!/^[A-Z][a-zA-Z0-9]*$/.test(definition.name)) {\n warnings.push(\n 'Contract name should be in PascalCase (e.g., UserProfile, not userProfile or user_profile)'\n );\n }\n\n // Validate intent\n if (!definition.intent || typeof definition.intent !== 'string') {\n errors.push('Contract must have a valid intent (non-empty string)');\n } else if (definition.intent.length < 10) {\n warnings.push('Intent should be descriptive (at least 10 characters)');\n }\n\n // Validate shape\n if (!definition.shape || typeof definition.shape !== 'object') {\n errors.push('Contract must have a valid shape definition');\n } else {\n validateShape(definition.shape, '', errors, warnings);\n }\n\n // Validate constraints\n if (definition.constraints) {\n validateConstraints(definition.constraints, errors, warnings);\n }\n\n // Validate reactivity\n if (definition.reactivity) {\n validateReactivity(definition.reactivity, definition.shape, errors, warnings);\n }\n\n // Validate versioning\n if (definition.versioning) {\n validateVersioning(definition.versioning, errors, warnings);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validate shape definition recursively\n */\nfunction validateShape(\n shape: ShapeDefinition,\n path: string,\n errors: string[],\n warnings: string[]\n): void {\n if (!shape || typeof shape !== 'object') {\n errors.push(`Invalid shape at ${path || 'root'}: must be an object`);\n return;\n }\n\n const keys = Object.keys(shape);\n if (keys.length === 0) {\n warnings.push(`Shape at ${path || 'root'} is empty`);\n }\n\n for (const key of keys) {\n const fieldPath = path ? `${path}.${key}` : key;\n const value = shape[key];\n\n if (!value) {\n errors.push(`Field \"${fieldPath}\" has undefined value`);\n continue;\n }\n\n // Validate field name\n if (!/^[a-z][a-zA-Z0-9]*$/.test(key)) {\n warnings.push(\n `Field name \"${fieldPath}\" should be in camelCase (e.g., firstName, not first_name)`\n );\n }\n\n // Validate field type\n validateTypeDefinition(value, fieldPath, errors, warnings);\n }\n}\n\n/**\n * Validate a type definition\n */\nfunction validateTypeDefinition(\n type: TypeDefinition,\n path: string,\n errors: string[],\n warnings: string[]\n): void {\n if (typeof type === 'string') {\n // Primitive type or URL type\n const validPrimitives = ['string', 'number', 'boolean', 'Date', 'null', 'undefined'];\n const isURL = type === 'URL' || type.startsWith('URL<');\n\n if (!validPrimitives.includes(type) && !isURL) {\n errors.push(`Invalid type at ${path}: \"${type}\" is not a valid primitive or URL type`);\n }\n\n // Validate URL optimization syntax\n if (isURL && type !== 'URL') {\n const urlMatch = type.match(/^URL<(.+)>$/);\n if (!urlMatch) {\n errors.push(`Invalid URL type at ${path}: must be \"URL\" or \"URL<options>\"`);\n }\n }\n } else if (typeof type === 'object' && type !== null) {\n // Check if it's a DerivedField\n if ('_brand' in type && type._brand === 'DerivedField') {\n validateDerivedField(\n type as DerivedField<Record<string, unknown>, unknown>,\n path,\n errors,\n warnings\n );\n } else {\n // Nested shape\n validateShape(type as ShapeDefinition, path, errors, warnings);\n }\n } else {\n errors.push(`Invalid type at ${path}: must be a string, object, or DerivedField`);\n }\n}\n\n/**\n * Validate derived field\n */\nfunction validateDerivedField(\n field: DerivedField<Record<string, unknown>, unknown>,\n path: string,\n errors: string[],\n _warnings: string[]\n): void {\n if (typeof field.derive !== 'function') {\n errors.push(`Derived field at ${path} must have a derive function`);\n }\n\n if (field.dependencies && !Array.isArray(field.dependencies)) {\n errors.push(`Derived field dependencies at ${path} must be an array`);\n }\n\n if (field.preferredLayer && !['client', 'edge', 'origin'].includes(field.preferredLayer)) {\n errors.push(`Derived field preferredLayer at ${path} must be 'client', 'edge', or 'origin'`);\n }\n\n if (field.dependencies && Array.isArray(field.dependencies)) {\n for (const dep of field.dependencies) {\n if (typeof dep !== 'string') {\n errors.push(`Derived field dependency at ${path} must be a string`);\n }\n }\n }\n}\n\n/**\n * Validate contract constraints\n */\nfunction validateConstraints(\n constraints: ContractConstraints,\n errors: string[],\n _warnings: string[]\n): void {\n // Validate latency constraint\n if (constraints.latency) {\n const { max, fallback } = constraints.latency;\n\n if (!max || typeof max !== 'string') {\n errors.push('Latency constraint must have a max value (e.g., \"100ms\")');\n } else {\n // Validate time format\n if (!/^\\d+(ms|s|m)$/.test(max)) {\n errors.push(`Invalid latency max format: \"${max}\". Use format like \"100ms\", \"1s\", or \"1m\"`);\n }\n }\n\n if (fallback && !['cachedVersion', 'degraded', 'error'].includes(fallback)) {\n errors.push('Latency fallback must be \"cachedVersion\", \"degraded\", or \"error\"');\n }\n }\n\n // Validate freshness constraint\n if (constraints.freshness) {\n const { maxAge, staleWhileRevalidate } = constraints.freshness;\n\n if (!maxAge || typeof maxAge !== 'string') {\n errors.push('Freshness constraint must have a maxAge value');\n } else if (!/^\\d+(ms|s|m|h|d)$/.test(maxAge)) {\n errors.push(\n `Invalid freshness maxAge format: \"${maxAge}\". Use format like \"5m\", \"1h\", or \"1d\"`\n );\n }\n\n if (staleWhileRevalidate && !/^\\d+(ms|s|m|h|d)$/.test(staleWhileRevalidate)) {\n errors.push(\n `Invalid staleWhileRevalidate format: \"${staleWhileRevalidate}\". Use format like \"5m\", \"1h\", or \"1d\"`\n );\n }\n }\n\n // Validate availability constraint\n if (constraints.availability) {\n const { uptime, gracefulDegradation } = constraints.availability;\n\n if (!uptime || typeof uptime !== 'string') {\n errors.push('Availability constraint must have an uptime value');\n } else if (!/^\\d+(\\.\\d+)?%$/.test(uptime)) {\n errors.push(`Invalid uptime format: \"${uptime}\". Use format like \"99.9%\"`);\n }\n\n if (gracefulDegradation !== undefined && typeof gracefulDegradation !== 'boolean') {\n errors.push('Availability gracefulDegradation must be a boolean');\n }\n }\n}\n\n/**\n * Validate reactivity configuration\n */\nfunction validateReactivity(\n reactivity: ReactivityConfig,\n shape: ShapeDefinition,\n errors: string[],\n warnings: string[]\n): void {\n const allFields = new Set<string>();\n collectFieldPaths(shape, '', allFields);\n\n // Validate realtime fields\n if (reactivity.realtime) {\n if (!Array.isArray(reactivity.realtime)) {\n errors.push('Reactivity realtime must be an array of field paths');\n } else {\n for (const field of reactivity.realtime) {\n if (typeof field !== 'string') {\n errors.push('Realtime field must be a string');\n } else if (!allFields.has(field)) {\n warnings.push(`Realtime field \"${field}\" does not exist in shape`);\n }\n }\n }\n }\n\n // Validate static fields\n if (reactivity.static) {\n if (!Array.isArray(reactivity.static)) {\n errors.push('Reactivity static must be an array of field paths');\n } else {\n for (const field of reactivity.static) {\n if (typeof field !== 'string') {\n errors.push('Static field must be a string');\n } else if (!allFields.has(field)) {\n warnings.push(`Static field \"${field}\" does not exist in shape`);\n }\n }\n }\n }\n\n // Validate polling config\n if (reactivity.polling) {\n if (!Array.isArray(reactivity.polling)) {\n errors.push('Reactivity polling must be an array');\n } else {\n for (const config of reactivity.polling) {\n if (!config.field || typeof config.field !== 'string') {\n errors.push('Polling config must have a field property');\n } else if (!allFields.has(config.field)) {\n warnings.push(`Polling field \"${config.field}\" does not exist in shape`);\n }\n\n if (!config.interval || typeof config.interval !== 'string') {\n errors.push('Polling config must have an interval property');\n } else if (!/^\\d+(ms|s|m)$/.test(config.interval)) {\n errors.push(\n `Invalid polling interval format: \"${config.interval}\". Use format like \"30s\" or \"5m\"`\n );\n }\n }\n }\n }\n\n // Validate event-driven config\n if (reactivity.eventDriven) {\n if (!Array.isArray(reactivity.eventDriven)) {\n errors.push('Reactivity eventDriven must be an array');\n } else {\n for (const config of reactivity.eventDriven) {\n if (!config.field || typeof config.field !== 'string') {\n errors.push('EventDriven config must have a field property');\n } else if (!allFields.has(config.field)) {\n warnings.push(`EventDriven field \"${config.field}\" does not exist in shape`);\n }\n\n if (!config.on || !Array.isArray(config.on)) {\n errors.push('EventDriven config must have an \"on\" array of event names');\n } else if (config.on.length === 0) {\n warnings.push(`EventDriven config for \"${config.field}\" has no events`);\n }\n }\n }\n }\n}\n\n/**\n * Validate versioning configuration\n */\nfunction validateVersioning(\n versioning: VersioningConfig,\n errors: string[],\n warnings: string[]\n): void {\n if (!versioning.version || typeof versioning.version !== 'string') {\n errors.push('Versioning must have a version string');\n } else if (!/^\\d+\\.\\d+\\.\\d+$/.test(versioning.version)) {\n warnings.push(`Version \"${versioning.version}\" should follow semver format (e.g., \"1.0.0\")`);\n }\n\n if (versioning.deprecated && !Array.isArray(versioning.deprecated)) {\n errors.push('Versioning deprecated must be an array of field paths');\n }\n\n if (versioning.migration && typeof versioning.migration !== 'function') {\n errors.push('Versioning migration must be a function');\n }\n}\n\n/**\n * Helper to collect all field paths from shape\n */\nfunction collectFieldPaths(shape: ShapeDefinition, prefix: string, result: Set<string>): void {\n for (const [key, value] of Object.entries(shape)) {\n const path = prefix ? `${prefix}.${key}` : key;\n result.add(path);\n\n if (\n typeof value === 'object' &&\n value !== null &&\n !('_brand' in value) &&\n typeof value !== 'string'\n ) {\n collectFieldPaths(value as ShapeDefinition, path, result);\n }\n }\n}\n","import type { Contract, ShapeDefinition, TypeDefinition } from '@reactive-contracts/core';\nimport type { LatencyAnalysisResult } from '../types.js';\n\n/**\n * Analyze latency constraints of a contract\n */\nexport function analyzeLatency(contract: Contract): LatencyAnalysisResult {\n const { definition } = contract;\n const suggestions: string[] = [];\n\n // If no latency constraint is specified, provide a suggestion\n if (!definition.constraints?.latency) {\n suggestions.push('Consider adding a latency constraint to ensure performance SLAs');\n return {\n status: 'ok',\n suggestions,\n };\n }\n\n const { max: maxLatency, fallback } = definition.constraints.latency;\n\n // Parse latency value\n const latencyMs = parseLatencyToMs(maxLatency);\n\n if (latencyMs === null) {\n return {\n status: 'error',\n message: `Invalid latency format: ${maxLatency}`,\n suggestions: ['Use format like \"100ms\", \"1s\", or \"1m\"'],\n };\n }\n\n // Analyze the latency requirement\n const analysis = analyzeLatencyRequirement(latencyMs);\n\n // Check if fallback strategy is appropriate\n if (!fallback) {\n suggestions.push('Consider specifying a fallback strategy (cachedVersion, degraded, or error)');\n }\n\n // Provide recommendations based on latency target\n if (latencyMs < 50) {\n suggestions.push(\n 'Very aggressive latency target (<50ms). Consider edge caching or CDN for static data.'\n );\n } else if (latencyMs < 100) {\n suggestions.push(\n 'Moderate latency target (<100ms). Ensure database queries are optimized and indexed.'\n );\n } else if (latencyMs > 1000) {\n suggestions.push(\n 'High latency tolerance (>1s). Consider if this provides good user experience.'\n );\n }\n\n // Check for derived fields that might impact latency\n if (hasComplexDerivations(definition.shape)) {\n suggestions.push(\n 'Contract contains derived fields. Consider computing these at edge or origin for better performance.'\n );\n }\n\n // Check reactivity modes that might impact latency\n if (definition.reactivity?.realtime && definition.reactivity.realtime.length > 0) {\n suggestions.push(\n 'Realtime fields require WebSocket connections. Ensure your infrastructure supports this.'\n );\n }\n\n return {\n status: analysis.status,\n estimated: analysis.estimated,\n message: analysis.message,\n suggestions,\n };\n}\n\n/**\n * Parse latency string to milliseconds\n */\nfunction parseLatencyToMs(latency: string): number | null {\n const match = latency.match(/^(\\d+)(ms|s|m)$/);\n if (!match || !match[1] || !match[2]) return null;\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n default:\n return null;\n }\n}\n\n/**\n * Analyze latency requirement and provide status\n */\nfunction analyzeLatencyRequirement(latencyMs: number): {\n status: 'ok' | 'warning' | 'error';\n estimated?: string;\n message?: string;\n} {\n // Simple heuristic-based analysis for MVP\n // In a real implementation, this would analyze the actual backend capabilities\n\n if (latencyMs < 10) {\n return {\n status: 'error',\n estimated: 'Typically 50-100ms for database queries',\n message: 'Latency target <10ms is extremely difficult to achieve consistently',\n };\n }\n\n if (latencyMs < 50) {\n return {\n status: 'warning',\n estimated: 'Requires edge caching or CDN',\n message: 'Latency target <50ms requires careful optimization',\n };\n }\n\n if (latencyMs <= 200) {\n return {\n status: 'ok',\n estimated: 'Achievable with optimized queries and caching',\n message: 'Latency target is reasonable for most applications',\n };\n }\n\n if (latencyMs <= 1000) {\n return {\n status: 'ok',\n estimated: 'Easily achievable with standard backend',\n message: 'Latency target is conservative and should be easy to meet',\n };\n }\n\n return {\n status: 'warning',\n estimated: 'Very high tolerance',\n message: 'Consider if this latency provides acceptable user experience',\n };\n}\n\n/**\n * Check if shape contains complex derived fields\n */\nfunction hasComplexDerivations(\n shape: ShapeDefinition | TypeDefinition | null | undefined\n): boolean {\n if (!shape || typeof shape !== 'object') {\n return false;\n }\n\n for (const value of Object.values(shape)) {\n if (typeof value === 'object' && value !== null) {\n if ('_brand' in value && value._brand === 'DerivedField') {\n return true;\n }\n if (hasComplexDerivations(value)) {\n return true;\n }\n }\n }\n\n return false;\n}\n","import type { Contract, ShapeDefinition, TypeDefinition } from '@reactive-contracts/core';\nimport { writeFile, mkdir } from 'fs/promises';\nimport { dirname } from 'path';\n\n/**\n * Generate TypeScript types for frontend\n */\nexport async function generateFrontendTypes(contract: Contract, outputPath: string): Promise<void> {\n const { definition } = contract;\n const typeName = definition.name;\n\n // Generate TypeScript type definitions\n const typeDefinitions = generateTypeDefinitions(definition.shape, `${typeName}Shape`);\n\n // Generate contract status types\n const content = `/**\n * Auto-generated types for ${typeName} contract\n * DO NOT EDIT - This file is generated by @reactive-contracts/compiler\n */\n\nimport type { ContractStatus } from '@reactive-contracts/core';\n\n${typeDefinitions}\n\n/**\n * Parameters for ${typeName} contract\n */\nexport interface ${typeName}Params {\n // Add your params here based on contract requirements\n [key: string]: unknown;\n}\n\n/**\n * Full result type for ${typeName} contract\n */\nexport interface ${typeName}Result {\n data: ${typeName}Shape;\n status: ContractStatus;\n metadata: {\n executionTime: number;\n cacheHit: boolean;\n derivedAt: 'client' | 'edge' | 'origin';\n };\n}\n\n/**\n * Contract intent: ${definition.intent}\n */\nexport const ${typeName}Intent = '${definition.intent}' as const;\n`;\n\n // Ensure directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write to file\n await writeFile(outputPath, content, 'utf-8');\n}\n\n/**\n * Generate resolver template for backend\n */\nexport async function generateBackendResolver(\n contract: Contract,\n outputPath: string\n): Promise<void> {\n const { definition } = contract;\n const typeName = definition.name;\n\n // Generate shape type\n const shapeType = generateTypeDefinitions(definition.shape, `${typeName}ResolverShape`);\n\n // Generate resolver template\n const content = `/**\n * Auto-generated resolver template for ${typeName} contract\n * Generated by @reactive-contracts/compiler\n *\n * Intent: ${definition.intent}\n */\n\nimport { implementContract } from '@reactive-contracts/server';\nimport type { Contract } from '@reactive-contracts/core';\nimport type { ResolverContext } from '@reactive-contracts/server';\n\n${shapeType}\n\n/**\n * Implement the ${typeName} contract resolver\n *\n * This function should return data matching the contract shape.\n * Derived fields will be computed automatically - don't include them.\n */\nexport const ${typeName}Resolver = implementContract(\n // Import your contract definition here\n {} as Contract, // Replace with your contract\n {\n async resolve(params: Record<string, unknown>, context: ResolverContext): Promise<${typeName}ResolverShape> {\n // TODO: Implement your data fetching logic here\n\n // Example:\n // const data = await db.query(...);\n // return {\n // // Map your data to match the contract shape\n // };\n\n throw new Error('${typeName}Resolver not implemented yet');\n },\n\n // Optional: Configure caching\n cache: {\n ttl: '5m',\n staleWhileRevalidate: '1h',\n tags: (params) => [\\`${typeName.toLowerCase()}:\\${params.id}\\`],\n },\n }\n);\n`;\n\n // Ensure directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write to file\n await writeFile(outputPath, content, 'utf-8');\n}\n\n/**\n * Generate runtime negotiator\n */\nexport async function generateRuntimeNegotiator(\n contract: Contract,\n outputPath: string\n): Promise<void> {\n const { definition } = contract;\n const typeName = definition.name;\n\n const content = `/**\n * Auto-generated runtime negotiator for ${typeName} contract\n * DO NOT EDIT - This file is generated by @reactive-contracts/compiler\n */\n\nimport type { Contract } from '@reactive-contracts/core';\n\n/**\n * Runtime negotiator for ${typeName}\n * Handles SLA monitoring, fallback logic, and performance tracking\n */\nexport class ${typeName}Negotiator {\n private contract: Contract;\n private metrics: {\n executionTime: number[];\n cacheHits: number;\n cacheMisses: number;\n } = {\n executionTime: [],\n cacheHits: 0,\n cacheMisses: 0,\n };\n\n constructor(contract: Contract) {\n this.contract = contract;\n }\n\n /**\n * Execute contract with SLA monitoring\n */\n async execute<TData>(\n resolver: () => Promise<TData>,\n options?: {\n useCache?: boolean;\n timeout?: number;\n }\n ): Promise<{\n data: TData;\n status: {\n latency: 'normal' | 'degraded' | 'violated';\n freshness: 'fresh' | 'stale' | 'expired';\n availability: 'available' | 'degraded' | 'unavailable';\n };\n metadata: {\n executionTime: number;\n cacheHit: boolean;\n derivedAt: 'client' | 'edge' | 'origin';\n };\n }> {\n const startTime = performance.now();\n\n try {\n // Execute resolver\n const data = await resolver();\n const executionTime = performance.now() - startTime;\n\n // Track metrics\n this.metrics.executionTime.push(executionTime);\n if (options?.useCache) {\n this.metrics.cacheHits++;\n } else {\n this.metrics.cacheMisses++;\n }\n\n // Determine latency status\n const maxLatency = this.getMaxLatency();\n const latencyStatus = this.evaluateLatency(executionTime, maxLatency);\n\n return {\n data,\n status: {\n latency: latencyStatus,\n freshness: 'fresh',\n availability: 'available',\n },\n metadata: {\n executionTime,\n cacheHit: options?.useCache ?? false,\n derivedAt: 'origin',\n },\n };\n } catch (error) {\n // Handle fallback based on contract constraints\n throw error;\n }\n }\n\n /**\n * Get metrics for monitoring\n */\n getMetrics() {\n const avgExecutionTime =\n this.metrics.executionTime.length > 0\n ? this.metrics.executionTime.reduce((a, b) => a + b, 0) / this.metrics.executionTime.length\n : 0;\n\n return {\n averageExecutionTime: avgExecutionTime,\n p95ExecutionTime: this.calculateP95(),\n cacheHitRate:\n this.metrics.cacheHits / (this.metrics.cacheHits + this.metrics.cacheMisses) || 0,\n totalExecutions: this.metrics.executionTime.length,\n };\n }\n\n private getMaxLatency(): number {\n const latency = this.contract.definition.constraints?.latency?.max;\n if (!latency) return Infinity;\n\n // Simple parsing for MVP\n const match = latency.match(/^(\\\\d+)(ms|s|m)$/);\n if (!match) return Infinity;\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 'ms': return value;\n case 's': return value * 1000;\n case 'm': return value * 60 * 1000;\n default: return Infinity;\n }\n }\n\n private evaluateLatency(\n executionTime: number,\n maxLatency: number\n ): 'normal' | 'degraded' | 'violated' {\n if (executionTime <= maxLatency) {\n return 'normal';\n } else if (executionTime <= maxLatency * 1.5) {\n return 'degraded';\n } else {\n return 'violated';\n }\n }\n\n private calculateP95(): number {\n if (this.metrics.executionTime.length === 0) return 0;\n\n const sorted = [...this.metrics.executionTime].sort((a, b) => a - b);\n const index = Math.floor(sorted.length * 0.95);\n return sorted[index];\n }\n}\n\n/**\n * Create a new negotiator instance\n */\nexport function create${typeName}Negotiator(contract: Contract): ${typeName}Negotiator {\n return new ${typeName}Negotiator(contract);\n}\n`;\n\n // Ensure directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write to file\n await writeFile(outputPath, content, 'utf-8');\n}\n\n/**\n * Generate TypeScript type definitions from shape\n */\nfunction generateTypeDefinitions(shape: ShapeDefinition, typeName: string): string {\n const fields = generateShapeFields(shape, 0);\n\n return `export interface ${typeName} {\n${fields}\n}`;\n}\n\n/**\n * Recursively generate shape fields\n */\nfunction generateShapeFields(shape: ShapeDefinition, indent: number): string {\n const indentStr = ' '.repeat(indent + 1);\n const lines: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const typeStr = generateTypeString(value, indent + 1);\n lines.push(`${indentStr}${key}: ${typeStr};`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate TypeScript type string from type definition\n */\nfunction generateTypeString(type: TypeDefinition, indent: number): string {\n if (typeof type === 'string') {\n // Primitive or URL type\n switch (type) {\n case 'string':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'Date':\n return 'Date';\n case 'null':\n return 'null';\n case 'undefined':\n return 'undefined';\n default:\n if (type === 'URL' || type.startsWith('URL<')) {\n return 'string'; // URLs are represented as strings\n }\n return 'any';\n }\n } else if (typeof type === 'object' && type !== null) {\n // Check if it's a DerivedField\n if ('_brand' in type && type._brand === 'DerivedField') {\n // For derived fields, we don't know the return type at compile time\n // In a real implementation, we'd analyze the function\n return 'any';\n } else {\n // Nested shape\n const fields = generateShapeFields(type as ShapeDefinition, indent);\n const indentStr = ' '.repeat(indent);\n return `{\\n${fields}\\n${indentStr}}`;\n }\n }\n\n return 'any';\n}\n"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/index.ts","../src/validator/index.ts","../src/analyzer/index.ts","../src/generator/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { CompilerConfig, ConfigDefinition } from '../types.js';\n\n/**\n * Define a Reactive Contracts compiler configuration\n */\nexport function defineConfig(config: CompilerConfig): ConfigDefinition {\n return config;\n}\n\n/**\n * Load configuration from file\n */\nexport async function loadConfig(\n _configPath: string = './rcontracts.config.ts'\n): Promise<CompilerConfig> {\n // TODO: Implement config loading\n return {\n contracts: './contracts/**/*.contract.ts',\n output: {\n frontend: './generated/frontend',\n backend: './generated/backend',\n runtime: './generated/runtime',\n },\n };\n}\n","import type {\n Contract,\n ShapeDefinition,\n TypeDefinition,\n DerivedField,\n ContractConstraints,\n ReactivityConfig,\n VersioningConfig,\n} from '@reactive-contracts/core';\nimport type { ValidationResult } from '../types.js';\n\n/**\n * Validate a contract structure\n */\nexport function validateContract(contract: Contract): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Validate basic contract structure\n if (!contract || typeof contract !== 'object') {\n errors.push('Contract must be a valid object');\n return { valid: false, errors, warnings };\n }\n\n if (contract._brand !== 'Contract') {\n errors.push('Invalid contract: missing _brand property');\n return { valid: false, errors, warnings };\n }\n\n const { definition } = contract;\n\n // Validate name\n if (!definition.name || typeof definition.name !== 'string') {\n errors.push('Contract must have a valid name (non-empty string)');\n } else if (!/^[A-Z][a-zA-Z0-9]*$/.test(definition.name)) {\n warnings.push(\n 'Contract name should be in PascalCase (e.g., UserProfile, not userProfile or user_profile)'\n );\n }\n\n // Validate intent\n if (!definition.intent || typeof definition.intent !== 'string') {\n errors.push('Contract must have a valid intent (non-empty string)');\n } else if (definition.intent.length < 10) {\n warnings.push('Intent should be descriptive (at least 10 characters)');\n }\n\n // Validate shape\n if (!definition.shape || typeof definition.shape !== 'object') {\n errors.push('Contract must have a valid shape definition');\n } else {\n validateShape(definition.shape, '', errors, warnings);\n }\n\n // Validate constraints\n if (definition.constraints) {\n validateConstraints(definition.constraints, errors, warnings);\n }\n\n // Validate reactivity\n if (definition.reactivity) {\n validateReactivity(definition.reactivity, definition.shape, errors, warnings);\n }\n\n // Validate versioning\n if (definition.versioning) {\n validateVersioning(definition.versioning, errors, warnings);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validate shape definition recursively\n */\nfunction validateShape(\n shape: ShapeDefinition,\n path: string,\n errors: string[],\n warnings: string[]\n): void {\n if (!shape || typeof shape !== 'object') {\n errors.push(`Invalid shape at ${path || 'root'}: must be an object`);\n return;\n }\n\n const keys = Object.keys(shape);\n if (keys.length === 0) {\n warnings.push(`Shape at ${path || 'root'} is empty`);\n }\n\n for (const key of keys) {\n const fieldPath = path ? `${path}.${key}` : key;\n const value = shape[key];\n\n if (!value) {\n errors.push(`Field \"${fieldPath}\" has undefined value`);\n continue;\n }\n\n // Validate field name\n if (!/^[a-z][a-zA-Z0-9]*$/.test(key)) {\n warnings.push(\n `Field name \"${fieldPath}\" should be in camelCase (e.g., firstName, not first_name)`\n );\n }\n\n // Validate field type\n validateTypeDefinition(value, fieldPath, errors, warnings);\n }\n}\n\n/**\n * Validate a type definition\n */\nfunction validateTypeDefinition(\n type: TypeDefinition,\n path: string,\n errors: string[],\n warnings: string[]\n): void {\n if (typeof type === 'string') {\n // Primitive type or URL type\n const validPrimitives = ['string', 'number', 'boolean', 'Date', 'null', 'undefined'];\n const isURL = type === 'URL' || type.startsWith('URL<');\n\n if (!validPrimitives.includes(type) && !isURL) {\n errors.push(`Invalid type at ${path}: \"${type}\" is not a valid primitive or URL type`);\n }\n\n // Validate URL optimization syntax\n if (isURL && type !== 'URL') {\n const urlMatch = type.match(/^URL<(.+)>$/);\n if (!urlMatch) {\n errors.push(`Invalid URL type at ${path}: must be \"URL\" or \"URL<options>\"`);\n }\n }\n } else if (typeof type === 'object' && type !== null) {\n // Check if it's a DerivedField\n if ('_brand' in type && type._brand === 'DerivedField') {\n validateDerivedField(\n type as DerivedField<Record<string, unknown>, unknown>,\n path,\n errors,\n warnings\n );\n } else {\n // Nested shape\n validateShape(type as ShapeDefinition, path, errors, warnings);\n }\n } else {\n errors.push(`Invalid type at ${path}: must be a string, object, or DerivedField`);\n }\n}\n\n/**\n * Validate derived field\n */\nfunction validateDerivedField(\n field: DerivedField<Record<string, unknown>, unknown>,\n path: string,\n errors: string[],\n _warnings: string[]\n): void {\n if (typeof field.derive !== 'function') {\n errors.push(`Derived field at ${path} must have a derive function`);\n }\n\n if (field.dependencies && !Array.isArray(field.dependencies)) {\n errors.push(`Derived field dependencies at ${path} must be an array`);\n }\n\n if (field.preferredLayer && !['client', 'edge', 'origin'].includes(field.preferredLayer)) {\n errors.push(`Derived field preferredLayer at ${path} must be 'client', 'edge', or 'origin'`);\n }\n\n if (field.dependencies && Array.isArray(field.dependencies)) {\n for (const dep of field.dependencies) {\n if (typeof dep !== 'string') {\n errors.push(`Derived field dependency at ${path} must be a string`);\n }\n }\n }\n}\n\n/**\n * Validate contract constraints\n */\nfunction validateConstraints(\n constraints: ContractConstraints,\n errors: string[],\n _warnings: string[]\n): void {\n // Validate latency constraint\n if (constraints.latency) {\n const { max, fallback } = constraints.latency;\n\n if (!max || typeof max !== 'string') {\n errors.push('Latency constraint must have a max value (e.g., \"100ms\")');\n } else {\n // Validate time format\n if (!/^\\d+(ms|s|m)$/.test(max)) {\n errors.push(`Invalid latency max format: \"${max}\". Use format like \"100ms\", \"1s\", or \"1m\"`);\n }\n }\n\n if (fallback && !['cachedVersion', 'degraded', 'error'].includes(fallback)) {\n errors.push('Latency fallback must be \"cachedVersion\", \"degraded\", or \"error\"');\n }\n }\n\n // Validate freshness constraint\n if (constraints.freshness) {\n const { maxAge, staleWhileRevalidate } = constraints.freshness;\n\n if (!maxAge || typeof maxAge !== 'string') {\n errors.push('Freshness constraint must have a maxAge value');\n } else if (!/^\\d+(ms|s|m|h|d)$/.test(maxAge)) {\n errors.push(\n `Invalid freshness maxAge format: \"${maxAge}\". Use format like \"5m\", \"1h\", or \"1d\"`\n );\n }\n\n if (staleWhileRevalidate && !/^\\d+(ms|s|m|h|d)$/.test(staleWhileRevalidate)) {\n errors.push(\n `Invalid staleWhileRevalidate format: \"${staleWhileRevalidate}\". Use format like \"5m\", \"1h\", or \"1d\"`\n );\n }\n }\n\n // Validate availability constraint\n if (constraints.availability) {\n const { uptime, gracefulDegradation } = constraints.availability;\n\n if (!uptime || typeof uptime !== 'string') {\n errors.push('Availability constraint must have an uptime value');\n } else if (!/^\\d+(\\.\\d+)?%$/.test(uptime)) {\n errors.push(`Invalid uptime format: \"${uptime}\". Use format like \"99.9%\"`);\n }\n\n if (gracefulDegradation !== undefined && typeof gracefulDegradation !== 'boolean') {\n errors.push('Availability gracefulDegradation must be a boolean');\n }\n }\n}\n\n/**\n * Validate reactivity configuration\n */\nfunction validateReactivity(\n reactivity: ReactivityConfig,\n shape: ShapeDefinition,\n errors: string[],\n warnings: string[]\n): void {\n const allFields = new Set<string>();\n collectFieldPaths(shape, '', allFields);\n\n // Validate realtime fields\n if (reactivity.realtime) {\n if (!Array.isArray(reactivity.realtime)) {\n errors.push('Reactivity realtime must be an array of field paths');\n } else {\n for (const field of reactivity.realtime) {\n if (typeof field !== 'string') {\n errors.push('Realtime field must be a string');\n } else if (!allFields.has(field)) {\n warnings.push(`Realtime field \"${field}\" does not exist in shape`);\n }\n }\n }\n }\n\n // Validate static fields\n if (reactivity.static) {\n if (!Array.isArray(reactivity.static)) {\n errors.push('Reactivity static must be an array of field paths');\n } else {\n for (const field of reactivity.static) {\n if (typeof field !== 'string') {\n errors.push('Static field must be a string');\n } else if (!allFields.has(field)) {\n warnings.push(`Static field \"${field}\" does not exist in shape`);\n }\n }\n }\n }\n\n // Validate polling config\n if (reactivity.polling) {\n if (!Array.isArray(reactivity.polling)) {\n errors.push('Reactivity polling must be an array');\n } else {\n for (const config of reactivity.polling) {\n if (!config.field || typeof config.field !== 'string') {\n errors.push('Polling config must have a field property');\n } else if (!allFields.has(config.field)) {\n warnings.push(`Polling field \"${config.field}\" does not exist in shape`);\n }\n\n if (!config.interval || typeof config.interval !== 'string') {\n errors.push('Polling config must have an interval property');\n } else if (!/^\\d+(ms|s|m)$/.test(config.interval)) {\n errors.push(\n `Invalid polling interval format: \"${config.interval}\". Use format like \"30s\" or \"5m\"`\n );\n }\n }\n }\n }\n\n // Validate event-driven config\n if (reactivity.eventDriven) {\n if (!Array.isArray(reactivity.eventDriven)) {\n errors.push('Reactivity eventDriven must be an array');\n } else {\n for (const config of reactivity.eventDriven) {\n if (!config.field || typeof config.field !== 'string') {\n errors.push('EventDriven config must have a field property');\n } else if (!allFields.has(config.field)) {\n warnings.push(`EventDriven field \"${config.field}\" does not exist in shape`);\n }\n\n if (!config.on || !Array.isArray(config.on)) {\n errors.push('EventDriven config must have an \"on\" array of event names');\n } else if (config.on.length === 0) {\n warnings.push(`EventDriven config for \"${config.field}\" has no events`);\n }\n }\n }\n }\n}\n\n/**\n * Validate versioning configuration\n */\nfunction validateVersioning(\n versioning: VersioningConfig,\n errors: string[],\n warnings: string[]\n): void {\n if (!versioning.version || typeof versioning.version !== 'string') {\n errors.push('Versioning must have a version string');\n } else if (!/^\\d+\\.\\d+\\.\\d+$/.test(versioning.version)) {\n warnings.push(`Version \"${versioning.version}\" should follow semver format (e.g., \"1.0.0\")`);\n }\n\n if (versioning.deprecated && !Array.isArray(versioning.deprecated)) {\n errors.push('Versioning deprecated must be an array of field paths');\n }\n\n if (versioning.migration && typeof versioning.migration !== 'function') {\n errors.push('Versioning migration must be a function');\n }\n}\n\n/**\n * Helper to collect all field paths from shape\n */\nfunction collectFieldPaths(shape: ShapeDefinition, prefix: string, result: Set<string>): void {\n for (const [key, value] of Object.entries(shape)) {\n const path = prefix ? `${prefix}.${key}` : key;\n result.add(path);\n\n if (\n typeof value === 'object' &&\n value !== null &&\n !('_brand' in value) &&\n typeof value !== 'string'\n ) {\n collectFieldPaths(value as ShapeDefinition, path, result);\n }\n }\n}\n","import type { Contract, ShapeDefinition, TypeDefinition } from '@reactive-contracts/core';\nimport type { LatencyAnalysisResult } from '../types.js';\n\n/**\n * Analyze latency constraints of a contract\n */\nexport function analyzeLatency(contract: Contract): LatencyAnalysisResult {\n const { definition } = contract;\n const suggestions: string[] = [];\n\n // If no latency constraint is specified, provide a suggestion\n if (!definition.constraints?.latency) {\n suggestions.push('Consider adding a latency constraint to ensure performance SLAs');\n return {\n status: 'ok',\n suggestions,\n };\n }\n\n const { max: maxLatency, fallback } = definition.constraints.latency;\n\n // Parse latency value\n const latencyMs = parseLatencyToMs(maxLatency);\n\n if (latencyMs === null) {\n return {\n status: 'error',\n message: `Invalid latency format: ${maxLatency}`,\n suggestions: ['Use format like \"100ms\", \"1s\", or \"1m\"'],\n };\n }\n\n // Analyze the latency requirement\n const analysis = analyzeLatencyRequirement(latencyMs);\n\n // Check if fallback strategy is appropriate\n if (!fallback) {\n suggestions.push('Consider specifying a fallback strategy (cachedVersion, degraded, or error)');\n }\n\n // Provide recommendations based on latency target\n if (latencyMs < 50) {\n suggestions.push(\n 'Very aggressive latency target (<50ms). Consider edge caching or CDN for static data.'\n );\n } else if (latencyMs < 100) {\n suggestions.push(\n 'Moderate latency target (<100ms). Ensure database queries are optimized and indexed.'\n );\n } else if (latencyMs > 1000) {\n suggestions.push(\n 'High latency tolerance (>1s). Consider if this provides good user experience.'\n );\n }\n\n // Check for derived fields that might impact latency\n if (hasComplexDerivations(definition.shape)) {\n suggestions.push(\n 'Contract contains derived fields. Consider computing these at edge or origin for better performance.'\n );\n }\n\n // Check reactivity modes that might impact latency\n if (definition.reactivity?.realtime && definition.reactivity.realtime.length > 0) {\n suggestions.push(\n 'Realtime fields require WebSocket connections. Ensure your infrastructure supports this.'\n );\n }\n\n return {\n status: analysis.status,\n estimated: analysis.estimated,\n message: analysis.message,\n suggestions,\n };\n}\n\n/**\n * Parse latency string to milliseconds\n */\nfunction parseLatencyToMs(latency: string): number | null {\n const match = latency.match(/^(\\d+)(ms|s|m)$/);\n if (!match || !match[1] || !match[2]) return null;\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n default:\n return null;\n }\n}\n\n/**\n * Analyze latency requirement and provide status\n */\nfunction analyzeLatencyRequirement(latencyMs: number): {\n status: 'ok' | 'warning' | 'error';\n estimated?: string;\n message?: string;\n} {\n // Simple heuristic-based analysis for MVP\n // In a real implementation, this would analyze the actual backend capabilities\n\n if (latencyMs < 10) {\n return {\n status: 'error',\n estimated: 'Typically 50-100ms for database queries',\n message: 'Latency target <10ms is extremely difficult to achieve consistently',\n };\n }\n\n if (latencyMs < 50) {\n return {\n status: 'warning',\n estimated: 'Requires edge caching or CDN',\n message: 'Latency target <50ms requires careful optimization',\n };\n }\n\n if (latencyMs <= 200) {\n return {\n status: 'ok',\n estimated: 'Achievable with optimized queries and caching',\n message: 'Latency target is reasonable for most applications',\n };\n }\n\n if (latencyMs <= 1000) {\n return {\n status: 'ok',\n estimated: 'Easily achievable with standard backend',\n message: 'Latency target is conservative and should be easy to meet',\n };\n }\n\n return {\n status: 'warning',\n estimated: 'Very high tolerance',\n message: 'Consider if this latency provides acceptable user experience',\n };\n}\n\n/**\n * Check if shape contains complex derived fields\n */\nfunction hasComplexDerivations(\n shape: ShapeDefinition | TypeDefinition | null | undefined\n): boolean {\n if (!shape || typeof shape !== 'object') {\n return false;\n }\n\n for (const value of Object.values(shape)) {\n if (typeof value === 'object' && value !== null) {\n if ('_brand' in value && value._brand === 'DerivedField') {\n return true;\n }\n if (hasComplexDerivations(value)) {\n return true;\n }\n }\n }\n\n return false;\n}\n","import type { Contract, ShapeDefinition, TypeDefinition } from '@reactive-contracts/core';\nimport { writeFile, mkdir } from 'fs/promises';\nimport { dirname } from 'path';\n\n/**\n * Generate TypeScript types for frontend\n */\nexport async function generateFrontendTypes(contract: Contract, outputPath: string): Promise<void> {\n const { definition } = contract;\n const typeName = definition.name;\n\n // Generate TypeScript type definitions\n const typeDefinitions = generateTypeDefinitions(definition.shape, `${typeName}Shape`);\n\n // Generate contract status types\n const content = `/**\n * Auto-generated types for ${typeName} contract\n * DO NOT EDIT - This file is generated by @reactive-contracts/compiler\n */\n\nimport type { ContractStatus } from '@reactive-contracts/core';\n\n${typeDefinitions}\n\n/**\n * Parameters for ${typeName} contract\n */\nexport interface ${typeName}Params {\n // Add your params here based on contract requirements\n [key: string]: unknown;\n}\n\n/**\n * Full result type for ${typeName} contract\n */\nexport interface ${typeName}Result {\n data: ${typeName}Shape;\n status: ContractStatus;\n metadata: {\n executionTime: number;\n cacheHit: boolean;\n derivedAt: 'client' | 'edge' | 'origin';\n };\n}\n\n/**\n * Contract intent: ${definition.intent}\n */\nexport const ${typeName}Intent = '${definition.intent}' as const;\n`;\n\n // Ensure directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write to file\n await writeFile(outputPath, content, 'utf-8');\n}\n\n/**\n * Generate resolver template for backend\n */\nexport async function generateBackendResolver(\n contract: Contract,\n outputPath: string\n): Promise<void> {\n const { definition } = contract;\n const typeName = definition.name;\n\n // Generate shape type\n const shapeType = generateTypeDefinitions(definition.shape, `${typeName}ResolverShape`);\n\n // Generate resolver template\n const content = `/**\n * Auto-generated resolver template for ${typeName} contract\n * Generated by @reactive-contracts/compiler\n *\n * Intent: ${definition.intent}\n */\n\nimport { implementContract } from '@reactive-contracts/server';\nimport type { Contract } from '@reactive-contracts/core';\nimport type { ResolverContext } from '@reactive-contracts/server';\n\n${shapeType}\n\n/**\n * Implement the ${typeName} contract resolver\n *\n * This function should return data matching the contract shape.\n * Derived fields will be computed automatically - don't include them.\n */\nexport const ${typeName}Resolver = implementContract(\n // Import your contract definition here\n {} as Contract, // Replace with your contract\n {\n async resolve(params: Record<string, unknown>, context: ResolverContext): Promise<${typeName}ResolverShape> {\n // TODO: Implement your data fetching logic here\n\n // Example:\n // const data = await db.query(...);\n // return {\n // // Map your data to match the contract shape\n // };\n\n throw new Error('${typeName}Resolver not implemented yet');\n },\n\n // Optional: Configure caching\n cache: {\n ttl: '5m',\n staleWhileRevalidate: '1h',\n tags: (params) => [\\`${typeName.toLowerCase()}:\\${params.id}\\`],\n },\n }\n);\n`;\n\n // Ensure directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write to file\n await writeFile(outputPath, content, 'utf-8');\n}\n\n/**\n * Generate runtime negotiator\n */\nexport async function generateRuntimeNegotiator(\n contract: Contract,\n outputPath: string\n): Promise<void> {\n const { definition } = contract;\n const typeName = definition.name;\n\n const content = `/**\n * Auto-generated runtime negotiator for ${typeName} contract\n * DO NOT EDIT - This file is generated by @reactive-contracts/compiler\n */\n\nimport type { Contract } from '@reactive-contracts/core';\n\n/**\n * Runtime negotiator for ${typeName}\n * Handles SLA monitoring, fallback logic, and performance tracking\n */\nexport class ${typeName}Negotiator {\n private contract: Contract;\n private metrics: {\n executionTime: number[];\n cacheHits: number;\n cacheMisses: number;\n } = {\n executionTime: [],\n cacheHits: 0,\n cacheMisses: 0,\n };\n\n constructor(contract: Contract) {\n this.contract = contract;\n }\n\n /**\n * Execute contract with SLA monitoring\n */\n async execute<TData>(\n resolver: () => Promise<TData>,\n options?: {\n useCache?: boolean;\n timeout?: number;\n }\n ): Promise<{\n data: TData;\n status: {\n latency: 'normal' | 'degraded' | 'violated';\n freshness: 'fresh' | 'stale' | 'expired';\n availability: 'available' | 'degraded' | 'unavailable';\n };\n metadata: {\n executionTime: number;\n cacheHit: boolean;\n derivedAt: 'client' | 'edge' | 'origin';\n };\n }> {\n const startTime = performance.now();\n\n try {\n // Execute resolver\n const data = await resolver();\n const executionTime = performance.now() - startTime;\n\n // Track metrics\n this.metrics.executionTime.push(executionTime);\n if (options?.useCache) {\n this.metrics.cacheHits++;\n } else {\n this.metrics.cacheMisses++;\n }\n\n // Determine latency status\n const maxLatency = this.getMaxLatency();\n const latencyStatus = this.evaluateLatency(executionTime, maxLatency);\n\n return {\n data,\n status: {\n latency: latencyStatus,\n freshness: 'fresh',\n availability: 'available',\n },\n metadata: {\n executionTime,\n cacheHit: options?.useCache ?? false,\n derivedAt: 'origin',\n },\n };\n } catch (error) {\n // Handle fallback based on contract constraints\n throw error;\n }\n }\n\n /**\n * Get metrics for monitoring\n */\n getMetrics() {\n const avgExecutionTime =\n this.metrics.executionTime.length > 0\n ? this.metrics.executionTime.reduce((a, b) => a + b, 0) / this.metrics.executionTime.length\n : 0;\n\n return {\n averageExecutionTime: avgExecutionTime,\n p95ExecutionTime: this.calculateP95(),\n cacheHitRate:\n this.metrics.cacheHits / (this.metrics.cacheHits + this.metrics.cacheMisses) || 0,\n totalExecutions: this.metrics.executionTime.length,\n };\n }\n\n private getMaxLatency(): number {\n const latency = this.contract.definition.constraints?.latency?.max;\n if (!latency) return Infinity;\n\n // Simple parsing for MVP\n const match = latency.match(/^(\\\\d+)(ms|s|m)$/);\n if (!match) return Infinity;\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 'ms': return value;\n case 's': return value * 1000;\n case 'm': return value * 60 * 1000;\n default: return Infinity;\n }\n }\n\n private evaluateLatency(\n executionTime: number,\n maxLatency: number\n ): 'normal' | 'degraded' | 'violated' {\n if (executionTime <= maxLatency) {\n return 'normal';\n } else if (executionTime <= maxLatency * 1.5) {\n return 'degraded';\n } else {\n return 'violated';\n }\n }\n\n private calculateP95(): number {\n if (this.metrics.executionTime.length === 0) return 0;\n\n const sorted = [...this.metrics.executionTime].sort((a, b) => a - b);\n const index = Math.floor(sorted.length * 0.95);\n return sorted[index];\n }\n}\n\n/**\n * Create a new negotiator instance\n */\nexport function create${typeName}Negotiator(contract: Contract): ${typeName}Negotiator {\n return new ${typeName}Negotiator(contract);\n}\n`;\n\n // Ensure directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write to file\n await writeFile(outputPath, content, 'utf-8');\n}\n\n/**\n * Generate TypeScript type definitions from shape\n */\nfunction generateTypeDefinitions(shape: ShapeDefinition, typeName: string): string {\n const fields = generateShapeFields(shape, 0);\n\n return `export interface ${typeName} {\n${fields}\n}`;\n}\n\n/**\n * Recursively generate shape fields\n */\nfunction generateShapeFields(shape: ShapeDefinition, indent: number): string {\n const indentStr = ' '.repeat(indent + 1);\n const lines: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const typeStr = generateTypeString(value, indent + 1);\n lines.push(`${indentStr}${key}: ${typeStr};`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate TypeScript type string from type definition\n */\nfunction generateTypeString(type: TypeDefinition, indent: number): string {\n if (typeof type === 'string') {\n // Primitive or URL type\n switch (type) {\n case 'string':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'Date':\n return 'Date';\n case 'null':\n return 'null';\n case 'undefined':\n return 'undefined';\n default:\n if (type === 'URL' || type.startsWith('URL<')) {\n return 'string'; // URLs are represented as strings\n }\n return 'any';\n }\n } else if (typeof type === 'object' && type !== null) {\n // Check if it's a DerivedField\n if ('_brand' in type && type._brand === 'DerivedField') {\n // For derived fields, we don't know the return type at compile time\n // In a real implementation, we'd analyze the function\n return 'any';\n } else {\n // Nested shape\n const fields = generateShapeFields(type as ShapeDefinition, indent);\n const indentStr = ' '.repeat(indent);\n return `{\\n${fields}\\n${indentStr}}`;\n }\n }\n\n return 'any';\n}\n"]}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# Generated files
|
|
2
|
-
generated/
|
|
3
|
-
|
|
4
|
-
# Dependencies
|
|
5
|
-
node_modules/
|
|
6
|
-
|
|
7
|
-
# Build outputs
|
|
8
|
-
dist/
|
|
9
|
-
build/
|
|
10
|
-
*.tsbuildinfo
|
|
11
|
-
|
|
12
|
-
# Environment
|
|
13
|
-
.env
|
|
14
|
-
.env.local
|
|
15
|
-
|
|
16
|
-
# IDE
|
|
17
|
-
.vscode/
|
|
18
|
-
.idea/
|
|
19
|
-
*.swp
|
|
20
|
-
*.swo
|
|
21
|
-
|
|
22
|
-
# OS
|
|
23
|
-
.DS_Store
|
|
24
|
-
Thumbs.db
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from '@reactive-contracts/compiler';
|
|
2
|
-
|
|
3
|
-
export default defineConfig({
|
|
4
|
-
// Pattern to find contract files
|
|
5
|
-
contracts: './contracts/**/*.contract.ts',
|
|
6
|
-
|
|
7
|
-
// Where to generate code
|
|
8
|
-
output: {
|
|
9
|
-
frontend: './generated/frontend',
|
|
10
|
-
backend: './generated/backend',
|
|
11
|
-
runtime: './generated/runtime',
|
|
12
|
-
},
|
|
13
|
-
|
|
14
|
-
// Validation rules
|
|
15
|
-
validation: {
|
|
16
|
-
strictLatency: false, // Alpha: warn only, don't fail
|
|
17
|
-
requireIntent: true, // All contracts should have an intent
|
|
18
|
-
maxComplexity: 10, // Limit derivation complexity
|
|
19
|
-
},
|
|
20
|
-
|
|
21
|
-
// Optimization flags (alpha: disabled)
|
|
22
|
-
optimization: {
|
|
23
|
-
bundleSplitting: false,
|
|
24
|
-
treeShaking: false,
|
|
25
|
-
precompute: [],
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
// External integrations (not yet implemented)
|
|
29
|
-
integrations: {
|
|
30
|
-
// prisma: './prisma/schema.prisma',
|
|
31
|
-
// graphql: './schema.graphql',
|
|
32
|
-
},
|
|
33
|
-
});
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { contract, derive, max, daysAgo } from '@reactive-contracts/core';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Sample Contract
|
|
5
|
-
*
|
|
6
|
-
* This is an example contract to help you get started.
|
|
7
|
-
* You can modify or delete this file.
|
|
8
|
-
*/
|
|
9
|
-
export const SampleContract = contract({
|
|
10
|
-
name: 'Sample',
|
|
11
|
-
intent: 'Demonstrate basic contract structure',
|
|
12
|
-
|
|
13
|
-
shape: {
|
|
14
|
-
data: {
|
|
15
|
-
id: 'string',
|
|
16
|
-
name: 'string',
|
|
17
|
-
createdAt: 'Date',
|
|
18
|
-
},
|
|
19
|
-
metadata: {
|
|
20
|
-
count: 'number',
|
|
21
|
-
status: derive(
|
|
22
|
-
(ctx: { data: { createdAt: Date } }) =>
|
|
23
|
-
ctx.data.createdAt > daysAgo(30) ? 'recent' : 'old',
|
|
24
|
-
{
|
|
25
|
-
dependencies: ['data.createdAt'],
|
|
26
|
-
preferredLayer: 'client',
|
|
27
|
-
}
|
|
28
|
-
),
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
|
|
32
|
-
constraints: {
|
|
33
|
-
latency: max('100ms', { fallback: 'cachedVersion' }),
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
reactivity: {
|
|
37
|
-
static: ['data.id', 'data.name', 'data.createdAt'],
|
|
38
|
-
polling: [{ field: 'metadata.count', interval: '30s' }],
|
|
39
|
-
},
|
|
40
|
-
});
|