@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 { pathToFileURL } from "url";
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 tsxUnregister = register();
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 fileUrl = pathToFileURL(file).href;
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 { pathToFileURL as pathToFileURL2 } from "url";
946
- import { register as register2 } from "tsx/esm/api";
947
- var tsxUnregister2 = register2();
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 fileUrl = pathToFileURL2(file).href;
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.1-beta",
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
- "templates",
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.1-beta"
29
+ "@reactive-contracts/core": "0.1.3-beta"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/fs-extra": "^11.0.4",
@@ -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
- });