initrajs
Version:
⚡ InitraJS - JavaScript CLI Toolkit | Lightning-fast scaffolding for React, Next.js, Node.js with TypeScript | The future of JavaScript development | 10x faster than create-react-app | Ultimate developer productivity tool
255 lines (224 loc) • 7.26 kB
JavaScript
// src/templates/page-templates.ts
// React Page Templates (for regular React apps)
export const reactPageTemplate = (options) => {
const { name, typescript, includeCss } = options;
const cssImport = includeCss ? `import './${name}Page.scss';` : '';
const cssClass = includeCss ? ` className="${name.toLowerCase()}-page"` : '';
if (typescript) {
return `import React from 'react';
${cssImport}
interface ${name}PageProps {
// Add your props here
}
const ${name}Page: React.FC<${name}PageProps> = () => {
return (
<div${cssClass}>
<div className="container">
<header className="page-header">
<h1>${name} Page</h1>
</header>
<main className="page-content">
<section className="hero-section">
<h2>Welcome to ${name}</h2>
<p>This is your ${name.toLowerCase()} page content.</p>
</section>
<section className="content-section">
{/* Add your content here */}
</section>
</main>
</div>
</div>
);
};
export default ${name}Page;`;
}
else {
return `import React from 'react';
${cssImport}
const ${name}Page = () => {
return (
<div${cssClass}>
<div className="container">
<header className="page-header">
<h1>${name} Page</h1>
</header>
<main className="page-content">
<section className="hero-section">
<h2>Welcome to ${name}</h2>
<p>This is your ${name.toLowerCase()} page content.</p>
</section>
<section className="content-section">
{/* Add your content here */}
</section>
</main>
</div>
</div>
);
};
export default ${name}Page;`;
}
};
// Next.js Page Templates
export const nextPageTemplate = (options) => {
const { name, typescript, includeCss } = options;
const cssImport = includeCss ? `import './${name.toLowerCase()}.scss';` : '';
const cssClass = includeCss ? ` className="${name.toLowerCase()}-page"` : '';
if (typescript) {
return `import { Metadata } from 'next';
${cssImport}
export const metadata: Metadata = {
title: '${name} | Your App',
description: '${name} page description',
};
interface ${name}PageProps {
params: { slug: string };
searchParams: { [key: string]: string | string[] | undefined };
}
export default function ${name}Page({ params, searchParams }: ${name}PageProps) {
return (
<div${cssClass}>
<div className="container">
<header className="page-header">
<h1>${name} Page</h1>
</header>
<main className="page-content">
<section className="hero-section">
<h2>Welcome to ${name}</h2>
<p>This is your ${name.toLowerCase()} page content.</p>
</section>
<section className="content-section">
{/* Add your content here */}
</section>
</main>
</div>
</div>
);
}`;
}
else {
return `${cssImport}
export const metadata = {
title: '${name} | Your App',
description: '${name} page description',
};
export default function ${name}Page({ params, searchParams }) {
return (
<div${cssClass}>
<div className="container">
<header className="page-header">
<h1>${name} Page</h1>
</header>
<main className="page-content">
<section className="hero-section">
<h2>Welcome to ${name}</h2>
<p>This is your ${name.toLowerCase()} page content.</p>
</section>
<section className="content-section">
{/* Add your content here */}
</section>
</main>
</div>
</div>
);
}`;
}
};
// Next.js Layout Template
export const nextLayoutTemplate = (options) => {
const { name, typescript } = options;
if (typescript) {
return `import type { Metadata } from 'next';
import { Inter } from 'next/font/google';
import './globals.css';
const inter = Inter({ subsets: ['latin'] });
export const metadata: Metadata = {
title: '${name} App',
description: 'Generated by InitraJS',
};
interface RootLayoutProps {
children: React.ReactNode;
}
export default function RootLayout({ children }: RootLayoutProps) {
return (
<html lang="en">
<body className={inter.className}>
<div className="app-wrapper">
<nav className="main-nav">
{/* Navigation content */}
</nav>
<main className="main-content">
{children}
</main>
<footer className="main-footer">
{/* Footer content */}
</footer>
</div>
</body>
</html>
);
}`;
}
else {
return `import { Inter } from 'next/font/google';
import './globals.css';
const inter = Inter({ subsets: ['latin'] });
export const metadata = {
title: '${name} App',
description: 'Generated by InitraJS',
};
export default function RootLayout({ children }) {
return (
<html lang="en">
<body className={inter.className}>
<div className="app-wrapper">
<nav className="main-nav">
{/* Navigation content */}
</nav>
<main className="main-content">
{children}
</main>
<footer className="main-footer">
{/* Footer content */}
</footer>
</div>
</body>
</html>
);
}`;
}
};
// Simplified Page CSS Template - only main class selector
export const pageScssTemplate = (name) => {
return `.${name.toLowerCase()}-page {
}`;
};
// Page Test Template
export const pageTestTemplate = (name, isTypeScript, isNext) => {
const importExt = isTypeScript ? '' : '.js';
const componentName = isNext ? `${name}Page` : `${name}Page`;
return `import { render, screen } from '@testing-library/react';
import '@testing-library/jest-dom';
${isNext ? `import { jest } from '@jest/globals';` : ''}
import ${componentName} from './${isNext ? 'page' : `${name}Page`}${importExt}';
${isNext ? `// Mock Next.js router
jest.mock('next/navigation', () => ({
useRouter: () => ({
push: jest.fn(),
pathname: '/',
}),
}));` : ''}
describe('${componentName}', () => {
it('renders the page title', () => {
${isNext ? `render(<${componentName} params={{}} searchParams={{}} />);` : `render(<${componentName} />);`}
expect(screen.getByText('${name} Page')).toBeInTheDocument();
});
it('renders the welcome message', () => {
${isNext ? `render(<${componentName} params={{}} searchParams={{}} />);` : `render(<${componentName} />);`}
expect(screen.getByText('Welcome to ${name}')).toBeInTheDocument();
});
it('has correct CSS class', () => {
const { container } = ${isNext ? `render(<${componentName} params={{}} searchParams={{}} />);` : `render(<${componentName} />);`}
expect(container.firstChild).toHaveClass('${name.toLowerCase()}-page');
})
};`;
};