ruch
Version:
Revolutionary React TypeScript CLI with hexagonal architecture & AI-powered development assistance. Create maintainable, scalable applications with domain-driven design and integrated AI tooling.
191 lines (165 loc) • 5.79 kB
JavaScript
"use strict";
/**
* Templates for generating React service context
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.getServiceContextTestTemplate = exports.getServiceContextTemplate = exports.getEmptyServiceContextTemplate = void 0;
/**
* Generate empty service context template
*/
const getEmptyServiceContextTemplate = () => {
return `import React, { createContext, useContext } from 'react';
// Configuration de base
const API_BASE_URL = process.env.REACT_APP_API_BASE_URL || '/api';
// Type pour les services
interface Services {
// Services will be added here when domains are created
}
// Services par défaut
const defaultServices: Services = {
// Default services will be initialized here
};
// Création du contexte
const ServiceContext = createContext<Services>(defaultServices);
// Provider pour injection de dépendances
export const ServiceProvider: React.FC<{
services?: Partial<Services>;
children: React.ReactNode;
}> = ({ services, children }) => {
const value = { ...defaultServices, ...services };
return (
<ServiceContext.Provider value={value}>
{children}
</ServiceContext.Provider>
);
};
// Hook pour utiliser les services
export const useServices = () => useContext(ServiceContext);
`;
};
exports.getEmptyServiceContextTemplate = getEmptyServiceContextTemplate;
/**
* Generate service context template with domains
*/
const getServiceContextTemplate = (domains) => {
const imports = domains
.map(domain => `import { ${domain.capitalizedName}Service } from '../domains/${domain.name}/services/${domain.capitalizedName}Service';\n` +
`import { ${domain.capitalizedName}Adapter } from '../domains/${domain.name}/adapters/${domain.capitalizedName}Adapter';`)
.join('\n');
const serviceTypes = domains
.map(domain => ` ${domain.name}Service: ${domain.capitalizedName}Service;`)
.join('\n');
const adapterCreations = domains
.map(domain => `const ${domain.name}Repository = new ${domain.capitalizedName}Adapter();`)
.join('\n');
const serviceCreations = domains
.map(domain => `const ${domain.name}Service = new ${domain.capitalizedName}Service(${domain.name}Repository);`)
.join('\n');
const defaultServiceProps = domains
.map(domain => ` ${domain.name}Service,`)
.join('\n');
return `import React, { createContext, useContext } from 'react';
// Import des services et adaptateurs
${imports}
// Création des adaptateurs
${adapterCreations}
// Création des services avec leurs dépendances
${serviceCreations}
// Type pour les services
interface Services {
${serviceTypes}
}
// Services par défaut
const defaultServices: Services = {
${defaultServiceProps}
};
// Création du contexte
const ServiceContext = createContext<Services>(defaultServices);
// Provider pour injection de dépendances
export const ServiceProvider: React.FC<{
services?: Partial<Services>;
children: React.ReactNode;
}> = ({ services, children }) => {
const value = { ...defaultServices, ...services };
return (
<ServiceContext.Provider value={value}>
{children}
</ServiceContext.Provider>
);
};
// Hook pour utiliser les services
export const useServices = () => useContext(ServiceContext);
`;
};
exports.getServiceContextTemplate = getServiceContextTemplate;
/**
* Generate test template for service context
*/
const getServiceContextTestTemplate = (domains) => {
const mockServices = domains
.map(domain => ` ${domain.name}Service: {} as ${domain.capitalizedName}Service,`)
.join('\n');
const serviceImports = domains
.map(domain => `import { ${domain.capitalizedName}Service } from '../domains/${domain.name}/services/${domain.capitalizedName}Service';`)
.join('\n');
return `import React from 'react';
import { render, screen } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';
import { ServiceProvider, useServices } from './ServiceContext';
${serviceImports}
// Mock services
const mockServices = {
${mockServices}
};
// Test component to access services
const TestComponent: React.FC = () => {
const services = useServices();
return (
<div>
<div data-testid="services-count">{Object.keys(services).length}</div>
{Object.keys(services).map(key => (
<div key={key} data-testid={\`service-\${key}\`}>
{key}
</div>
))}
</div>
);
};
describe('ServiceContext', () => {
it('should provide default services', () => {
render(
<ServiceProvider>
<TestComponent />
</ServiceProvider>
);
expect(screen.getByTestId('services-count')).toHaveTextContent('${domains.length}');
${domains.map(domain => ` expect(screen.getByTestId('service-${domain.name}Service')).toBeInTheDocument();`).join('\n')}
});
it('should allow service override', () => {
render(
<ServiceProvider services={mockServices}>
<TestComponent />
</ServiceProvider>
);
expect(screen.getByTestId('services-count')).toHaveTextContent('${domains.length}');
});
it('should provide services through useServices hook', () => {
let capturedServices: any;
const TestHook: React.FC = () => {
capturedServices = useServices();
return null;
};
render(
<ServiceProvider>
<TestHook />
</ServiceProvider>
);
expect(capturedServices).toBeDefined();
expect(Object.keys(capturedServices)).toHaveLength(${domains.length});
${domains.map(domain => ` expect(capturedServices.${domain.name}Service).toBeDefined();`).join('\n')}
});
});
`;
};
exports.getServiceContextTestTemplate = getServiceContextTestTemplate;
//# sourceMappingURL=context.js.map