From fe4fa55c7f4896b00ae723d95013d9b7e7efd643 Mon Sep 17 00:00:00 2001
From: Prasanth A R <73158535+ptech12@users.noreply.github.com>
Date: Sat, 6 Jan 2024 18:56:18 +0530
Subject: [PATCH] Adding Support for Javascript
---
index.js | 18 +-
scripts/create-next-app-no-typescript.js | 32 +++
{template => template-js}/LICENSE | 0
{template => template-js}/README.md | 0
template-js/components/MUIThemeProvider.js | 28 +++
template-js/components/RadixThemeProvider.js | 8 +
template-js/components/chakraUIProvider.js | 15 ++
{template => template-js}/config/gitignore | 0
{template => template-js}/config/globals.d.ts | 0
.../config/jest.config.mjs | 0
.../config/next-pwa-with-markdown.config.js | 0
.../config/next-pwa.config.js | 0
.../config/prettierignore | 0
.../config/prettierrc.json | 0
.../config/stylelintrc.json | 0
{template => template-js}/css/globals-mui.css | 0
.../css/globals-no-chakraui.css | 0
.../css/globals-radix.css | 0
{template => template-js}/css/globals.css | 0
.../image/android-chrome-192x192.png | Bin
.../image/android-chrome-512x512.png | Bin
.../image/apple-touch-icon.png | Bin
.../image/favicon-16x16.png | Bin
.../image/favicon-32x32.png | Bin
{template => template-js}/image/favicon.ico | Bin
template-js/layout/rootLayout-mui.js | 83 ++++++
template-js/layout/rootLayout-no-chakraui.js | 77 ++++++
template-js/layout/rootLayout-radix.js | 81 ++++++
template-js/layout/rootLayout.js | 80 ++++++
.../next-auth/[...nextauth].js | 0
.../page/rootPage-mui.js | 0
.../page/rootPage-no-chakraui.js | 0
.../page/rootPage-radix.js | 0
.../page/rootPage.js | 0
{template => template-js}/pwa/manifest.json | 0
template-ts/LICENSE | 21 ++
template-ts/README.md | 122 +++++++++
.../components/MUIThemeProvider.tsx | 0
.../components/RadixThemeProvider.tsx | 0
.../components/chakraUIProvider.tsx | 0
template-ts/config/gitignore | 42 ++++
template-ts/config/globals.d.ts | 1 +
template-ts/config/jest.config.mjs | 18 ++
.../config/next-pwa-with-markdown.config.js | 37 +++
template-ts/config/next-pwa.config.js | 30 +++
template-ts/config/prettierignore | 25 ++
template-ts/config/prettierrc.json | 9 +
template-ts/config/stylelintrc.json | 17 ++
template-ts/css/globals-mui.css | 38 +++
template-ts/css/globals-no-chakraui.css | 35 +++
template-ts/css/globals-radix.css | 11 +
template-ts/css/globals.css | 27 ++
template-ts/image/android-chrome-192x192.png | Bin 0 -> 11902 bytes
template-ts/image/android-chrome-512x512.png | Bin 0 -> 39285 bytes
template-ts/image/apple-touch-icon.png | Bin 0 -> 10551 bytes
template-ts/image/favicon-16x16.png | Bin 0 -> 657 bytes
template-ts/image/favicon-32x32.png | Bin 0 -> 1302 bytes
template-ts/image/favicon.ico | Bin 0 -> 15406 bytes
.../layout/rootLayout-mui.tsx | 0
.../layout/rootLayout-no-chakraui.tsx | 0
.../layout/rootLayout-radix.tsx | 0
.../layout/rootLayout.tsx | 0
template-ts/next-auth/[...nextauth].js | 10 +
template-ts/page/rootPage-mui.tsx | 237 ++++++++++++++++++
template-ts/page/rootPage-no-chakraui.tsx | 143 +++++++++++
template-ts/page/rootPage-radix.tsx | 157 ++++++++++++
template-ts/page/rootPage.tsx | 181 +++++++++++++
template-ts/pwa/manifest.json | 33 +++
68 files changed, 1615 insertions(+), 1 deletion(-)
create mode 100644 scripts/create-next-app-no-typescript.js
rename {template => template-js}/LICENSE (100%)
rename {template => template-js}/README.md (100%)
create mode 100644 template-js/components/MUIThemeProvider.js
create mode 100644 template-js/components/RadixThemeProvider.js
create mode 100644 template-js/components/chakraUIProvider.js
rename {template => template-js}/config/gitignore (100%)
rename {template => template-js}/config/globals.d.ts (100%)
rename {template => template-js}/config/jest.config.mjs (100%)
rename {template => template-js}/config/next-pwa-with-markdown.config.js (100%)
rename {template => template-js}/config/next-pwa.config.js (100%)
rename {template => template-js}/config/prettierignore (100%)
rename {template => template-js}/config/prettierrc.json (100%)
rename {template => template-js}/config/stylelintrc.json (100%)
rename {template => template-js}/css/globals-mui.css (100%)
rename {template => template-js}/css/globals-no-chakraui.css (100%)
rename {template => template-js}/css/globals-radix.css (100%)
rename {template => template-js}/css/globals.css (100%)
rename {template => template-js}/image/android-chrome-192x192.png (100%)
rename {template => template-js}/image/android-chrome-512x512.png (100%)
rename {template => template-js}/image/apple-touch-icon.png (100%)
rename {template => template-js}/image/favicon-16x16.png (100%)
rename {template => template-js}/image/favicon-32x32.png (100%)
rename {template => template-js}/image/favicon.ico (100%)
create mode 100644 template-js/layout/rootLayout-mui.js
create mode 100644 template-js/layout/rootLayout-no-chakraui.js
create mode 100644 template-js/layout/rootLayout-radix.js
create mode 100644 template-js/layout/rootLayout.js
rename {template => template-js}/next-auth/[...nextauth].js (100%)
rename template/page/rootPage-mui.tsx => template-js/page/rootPage-mui.js (100%)
rename template/page/rootPage-no-chakraui.tsx => template-js/page/rootPage-no-chakraui.js (100%)
rename template/page/rootPage-radix.tsx => template-js/page/rootPage-radix.js (100%)
rename template/page/rootPage.tsx => template-js/page/rootPage.js (100%)
rename {template => template-js}/pwa/manifest.json (100%)
create mode 100644 template-ts/LICENSE
create mode 100644 template-ts/README.md
rename {template => template-ts}/components/MUIThemeProvider.tsx (100%)
rename {template => template-ts}/components/RadixThemeProvider.tsx (100%)
rename {template => template-ts}/components/chakraUIProvider.tsx (100%)
create mode 100644 template-ts/config/gitignore
create mode 100644 template-ts/config/globals.d.ts
create mode 100644 template-ts/config/jest.config.mjs
create mode 100644 template-ts/config/next-pwa-with-markdown.config.js
create mode 100644 template-ts/config/next-pwa.config.js
create mode 100644 template-ts/config/prettierignore
create mode 100644 template-ts/config/prettierrc.json
create mode 100644 template-ts/config/stylelintrc.json
create mode 100644 template-ts/css/globals-mui.css
create mode 100644 template-ts/css/globals-no-chakraui.css
create mode 100644 template-ts/css/globals-radix.css
create mode 100644 template-ts/css/globals.css
create mode 100644 template-ts/image/android-chrome-192x192.png
create mode 100644 template-ts/image/android-chrome-512x512.png
create mode 100644 template-ts/image/apple-touch-icon.png
create mode 100644 template-ts/image/favicon-16x16.png
create mode 100644 template-ts/image/favicon-32x32.png
create mode 100644 template-ts/image/favicon.ico
rename {template => template-ts}/layout/rootLayout-mui.tsx (100%)
rename {template => template-ts}/layout/rootLayout-no-chakraui.tsx (100%)
rename {template => template-ts}/layout/rootLayout-radix.tsx (100%)
rename {template => template-ts}/layout/rootLayout.tsx (100%)
create mode 100644 template-ts/next-auth/[...nextauth].js
create mode 100644 template-ts/page/rootPage-mui.tsx
create mode 100644 template-ts/page/rootPage-no-chakraui.tsx
create mode 100644 template-ts/page/rootPage-radix.tsx
create mode 100644 template-ts/page/rootPage.tsx
create mode 100644 template-ts/pwa/manifest.json
diff --git a/index.js b/index.js
index ac826c9..58f8ffc 100644
--- a/index.js
+++ b/index.js
@@ -5,6 +5,7 @@ import inquirer from "inquirer";
import chalk from "chalk";
import K from "./constants.js";
import createNextApp from "./scripts/create-next-app.js";
+import createNextAppJs from "./scripts/create-next-app-no-typescript.js";
import ora from "ora";
import { fileURLToPath } from "url";
import { dirname } from "path";
@@ -88,6 +89,15 @@ try {
},
]);
+ const { projectType } = await prompt( [
+ {
+ name: "projectType",
+ message: "What would you like to use?",
+ type: "list",
+ choices: [K.ts, K.js],
+
+ }
+ ]);
const { uiLibrary } = await prompt([
{
name: "uiLibrary",
@@ -158,7 +168,13 @@ try {
}
const projectDir = path.resolve(currentDir, projectName);
const templateDir = path.resolve(__dirname, "template");
- createNextApp(projectName, templateDir);
+
+ if (projectType.includes(K.ts)){
+ createNextApp(projectName, templateDir);
+ }else{
+ createNextAppJs(projectName, templateDir)
+
+ }
if (uiLibrary.includes(K.chakraui)) {
spinner.start(
diff --git a/scripts/create-next-app-no-typescript.js b/scripts/create-next-app-no-typescript.js
new file mode 100644
index 0000000..e911cd2
--- /dev/null
+++ b/scripts/create-next-app-no-typescript.js
@@ -0,0 +1,32 @@
+import fs from "fs";
+import path from "path";
+import spawn from "cross-spawn";
+
+const createNextAppJs = (name, templateDir) => {
+ const rootDir = process.cwd();
+ const projectDir = path.resolve(rootDir, name);
+ const options = [
+ "create-next-app@latest",
+ name,
+ "--app",
+ "--tailwind",
+ "--eslint",
+ ];
+ spawn.sync("npx", options, {
+ stdio: "inherit",
+ });
+ fs.cpSync(
+ path.join(templateDir, "config", "next-pwa.config.js"),
+ path.join(projectDir, "next.config.js")
+ );
+ fs.cpSync(
+ path.join(templateDir, "config", "gitignore"),
+ path.join(projectDir, ".gitignore")
+ );
+ fs.cpSync(
+ path.join(templateDir, "README.md"),
+ path.join(projectDir, "README.md")
+ );
+};
+
+export default createNextAppJs;
diff --git a/template/LICENSE b/template-js/LICENSE
similarity index 100%
rename from template/LICENSE
rename to template-js/LICENSE
diff --git a/template/README.md b/template-js/README.md
similarity index 100%
rename from template/README.md
rename to template-js/README.md
diff --git a/template-js/components/MUIThemeProvider.js b/template-js/components/MUIThemeProvider.js
new file mode 100644
index 0000000..2de6c0f
--- /dev/null
+++ b/template-js/components/MUIThemeProvider.js
@@ -0,0 +1,28 @@
+"use client";
+
+import { createTheme } from "@mui/material/styles";
+import { ThemeProvider, CssBaseline } from "@mui/material";
+
+export const lightTheme = createTheme({
+ palette: {
+ mode: "light",
+ primary: {
+ main: "#5361fc",
+ },
+ secondary: {
+ main: "#32c13b",
+ },
+ info: {
+ main: "#fcb42f",
+ },
+ },
+});
+
+export function MUIThemeProvider({ children }) {
+ return (
+
+
+ {children}
+
+ );
+}
diff --git a/template-js/components/RadixThemeProvider.js b/template-js/components/RadixThemeProvider.js
new file mode 100644
index 0000000..a2a20e9
--- /dev/null
+++ b/template-js/components/RadixThemeProvider.js
@@ -0,0 +1,8 @@
+"use client";
+
+import "@radix-ui/themes/styles.css";
+import { Theme } from "@radix-ui/themes";
+
+export function RadixThemeProvider({ children }) {
+ return {children};
+}
diff --git a/template-js/components/chakraUIProvider.js b/template-js/components/chakraUIProvider.js
new file mode 100644
index 0000000..e478bb4
--- /dev/null
+++ b/template-js/components/chakraUIProvider.js
@@ -0,0 +1,15 @@
+// app/providers.tsx
+'use client';
+
+// import { CacheProvider } from '@chakra-ui/next-js';
+import { CacheProvider } from '@chakra-ui-next-js';
+import { ChakraProvider } from '@chakra-ui/react';
+
+export function ChakraUIProvider({ children }) {
+ return (
+
+ {children}
+
+
+ );
+}
diff --git a/template/config/gitignore b/template-js/config/gitignore
similarity index 100%
rename from template/config/gitignore
rename to template-js/config/gitignore
diff --git a/template/config/globals.d.ts b/template-js/config/globals.d.ts
similarity index 100%
rename from template/config/globals.d.ts
rename to template-js/config/globals.d.ts
diff --git a/template/config/jest.config.mjs b/template-js/config/jest.config.mjs
similarity index 100%
rename from template/config/jest.config.mjs
rename to template-js/config/jest.config.mjs
diff --git a/template/config/next-pwa-with-markdown.config.js b/template-js/config/next-pwa-with-markdown.config.js
similarity index 100%
rename from template/config/next-pwa-with-markdown.config.js
rename to template-js/config/next-pwa-with-markdown.config.js
diff --git a/template/config/next-pwa.config.js b/template-js/config/next-pwa.config.js
similarity index 100%
rename from template/config/next-pwa.config.js
rename to template-js/config/next-pwa.config.js
diff --git a/template/config/prettierignore b/template-js/config/prettierignore
similarity index 100%
rename from template/config/prettierignore
rename to template-js/config/prettierignore
diff --git a/template/config/prettierrc.json b/template-js/config/prettierrc.json
similarity index 100%
rename from template/config/prettierrc.json
rename to template-js/config/prettierrc.json
diff --git a/template/config/stylelintrc.json b/template-js/config/stylelintrc.json
similarity index 100%
rename from template/config/stylelintrc.json
rename to template-js/config/stylelintrc.json
diff --git a/template/css/globals-mui.css b/template-js/css/globals-mui.css
similarity index 100%
rename from template/css/globals-mui.css
rename to template-js/css/globals-mui.css
diff --git a/template/css/globals-no-chakraui.css b/template-js/css/globals-no-chakraui.css
similarity index 100%
rename from template/css/globals-no-chakraui.css
rename to template-js/css/globals-no-chakraui.css
diff --git a/template/css/globals-radix.css b/template-js/css/globals-radix.css
similarity index 100%
rename from template/css/globals-radix.css
rename to template-js/css/globals-radix.css
diff --git a/template/css/globals.css b/template-js/css/globals.css
similarity index 100%
rename from template/css/globals.css
rename to template-js/css/globals.css
diff --git a/template/image/android-chrome-192x192.png b/template-js/image/android-chrome-192x192.png
similarity index 100%
rename from template/image/android-chrome-192x192.png
rename to template-js/image/android-chrome-192x192.png
diff --git a/template/image/android-chrome-512x512.png b/template-js/image/android-chrome-512x512.png
similarity index 100%
rename from template/image/android-chrome-512x512.png
rename to template-js/image/android-chrome-512x512.png
diff --git a/template/image/apple-touch-icon.png b/template-js/image/apple-touch-icon.png
similarity index 100%
rename from template/image/apple-touch-icon.png
rename to template-js/image/apple-touch-icon.png
diff --git a/template/image/favicon-16x16.png b/template-js/image/favicon-16x16.png
similarity index 100%
rename from template/image/favicon-16x16.png
rename to template-js/image/favicon-16x16.png
diff --git a/template/image/favicon-32x32.png b/template-js/image/favicon-32x32.png
similarity index 100%
rename from template/image/favicon-32x32.png
rename to template-js/image/favicon-32x32.png
diff --git a/template/image/favicon.ico b/template-js/image/favicon.ico
similarity index 100%
rename from template/image/favicon.ico
rename to template-js/image/favicon.ico
diff --git a/template-js/layout/rootLayout-mui.js b/template-js/layout/rootLayout-mui.js
new file mode 100644
index 0000000..20bbb12
--- /dev/null
+++ b/template-js/layout/rootLayout-mui.js
@@ -0,0 +1,83 @@
+
+// import { Metadata } from "next" COMMENT: Does it require?
+import "./globals.css";
+import { MUIThemeProvider } from "./MUIThemeProvider";
+
+// Metadata for SEO
+export const metadata = {
+ title: "NextJS Easy Template",
+ description: "NextJS | TailwindCSS | Material UI easy template by Li Yuxuan",
+ manifest: "/manifest.json",
+ appleWebApp: {
+ title: "NextJS Easy Template",
+ statusBarStyle: "black-translucent",
+ },
+ icons: {
+ icon: "/favicon.ico",
+ apple: [
+ {
+ url: "/android-chrome-192x192.png",
+ sizes: "192x192",
+ type: "image/png",
+ },
+ {
+ url: "/android-chrome512x512.png",
+ sizes: "512x512",
+ type: "image/png",
+ },
+ ],
+ other: {
+ rel: "apple-touch-icon",
+ url: "/apple-touch-icon.png",
+ },
+ },
+ applicationName: "NextJS Easy Template",
+ keywords: ["template"],
+ authors: [{ name: "Li Yuxuan", url: "https://xmliszt.github.io/" }],
+ creator: "Li Yuxuan",
+ alternates: {
+ canonical: "http://localhost:3000",
+ },
+ category: "technology",
+ openGraph: {
+ title: "NextJS Easy Template",
+ description:
+ "NextJS | TailwindCSS | Material UI easy template by Li Yuxuan",
+ url: "http://localhost:3000",
+ siteName: "Taboo AI",
+ images: [
+ {
+ url: "https://i.imgur.com/IIP6UzK.jpeg",
+ width: 800,
+ height: 600,
+ alt: "NextJS Easy Template",
+ },
+ ],
+ locale: "en_US",
+ type: "website",
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: "NextJS Easy Template",
+ description:
+ "NextJS | TailwindCSS | Material UI easy template by Li Yuxuan",
+ siteId: "1704579643",
+ creator: "@xmliszt",
+ creatorId: "1704579643",
+ images: ["https://i.imgur.com/IIP6UzK.jpeg"],
+ },
+ viewport: {
+ width: "device-width",
+ initialScale: 1,
+ },
+};
+
+export default function RootLayout({ children }) {
+ return (
+
+
+ {children}
+
+
+ );
+}
diff --git a/template-js/layout/rootLayout-no-chakraui.js b/template-js/layout/rootLayout-no-chakraui.js
new file mode 100644
index 0000000..5d33825
--- /dev/null
+++ b/template-js/layout/rootLayout-no-chakraui.js
@@ -0,0 +1,77 @@
+import { Metadata } from "next";
+import "./globals.css";
+
+// Metadata for SEO
+export const metadata = {
+ title: "NextJS Easy Template",
+ description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan",
+ manifest: "/manifest.json",
+ appleWebApp: {
+ title: "NextJS Easy Template",
+ statusBarStyle: "black-translucent",
+ },
+ icons: {
+ icon: "/favicon.ico",
+ apple: [
+ {
+ url: "/android-chrome-192x192.png",
+ sizes: "192x192",
+ type: "image/png",
+ },
+ {
+ url: "/android-chrome512x512.png",
+ sizes: "512x512",
+ type: "image/png",
+ },
+ ],
+ other: {
+ rel: "apple-touch-icon",
+ url: "/apple-touch-icon.png",
+ },
+ },
+ applicationName: "NextJS Easy Template",
+ keywords: ["template"],
+ authors: [{ name: "Li Yuxuan", url: "https://xmliszt.github.io/" }],
+ creator: "Li Yuxuan",
+ alternates: {
+ canonical: "http://localhost:3000",
+ },
+ category: "technology",
+ openGraph: {
+ title: "NextJS Easy Template",
+ description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan",
+ url: "http://localhost:3000",
+ siteName: "Taboo AI",
+ images: [
+ {
+ url: "https://i.imgur.com/IIP6UzK.jpeg",
+ width: 800,
+ height: 600,
+ alt: "NextJS Easy Template",
+ },
+ ],
+ locale: "en_US",
+ type: "website",
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: "NextJS Easy Template",
+ description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan",
+ siteId: "1704579643",
+ creator: "@xmliszt",
+ creatorId: "1704579643",
+ images: ["https://i.imgur.com/IIP6UzK.jpeg"],
+ },
+ viewport: {
+ width: "device-width",
+ initialScale: 1,
+ },
+};
+
+export default function RootLayout({ children }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/template-js/layout/rootLayout-radix.js b/template-js/layout/rootLayout-radix.js
new file mode 100644
index 0000000..e862fb5
--- /dev/null
+++ b/template-js/layout/rootLayout-radix.js
@@ -0,0 +1,81 @@
+// import { Metadata } from "next";
+// import React from "react";
+import "./globals.css";
+import { RadixThemeProvider } from "./RadixThemeProvider";
+
+// Metadata for SEO
+export const metadata = {
+ title: "NextJS Easy Template",
+ description: "NextJS | TailwindCSS | RadixUI easy template by Li Yuxuan",
+ manifest: "/manifest.json",
+ appleWebApp: {
+ title: "NextJS Easy Template",
+ statusBarStyle: "black-translucent",
+ },
+ icons: {
+ icon: "/favicon.ico",
+ apple: [
+ {
+ url: "/android-chrome-192x192.png",
+ sizes: "192x192",
+ type: "image/png",
+ },
+ {
+ url: "/android-chrome512x512.png",
+ sizes: "512x512",
+ type: "image/png",
+ },
+ ],
+ other: {
+ rel: "apple-touch-icon",
+ url: "/apple-touch-icon.png",
+ },
+ },
+ applicationName: "NextJS Easy Template",
+ keywords: ["template"],
+ authors: [{ name: "Li Yuxuan", url: "https://xmliszt.github.io/" }],
+ creator: "Li Yuxuan",
+ alternates: {
+ canonical: "http://localhost:3000",
+ },
+ category: "technology",
+ openGraph: {
+ title: "NextJS Easy Template",
+ description: "NextJS | TailwindCSS | RadixUI easy template by Li Yuxuan",
+ url: "http://localhost:3000",
+ siteName: "Taboo AI",
+ images: [
+ {
+ url: "https://i.imgur.com/IIP6UzK.jpeg",
+ width: 800,
+ height: 600,
+ alt: "NextJS Easy Template",
+ },
+ ],
+ locale: "en_US",
+ type: "website",
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: "NextJS Easy Template",
+ description: "NextJS | TailwindCSS | RadixUI easy template by Li Yuxuan",
+ siteId: "1704579643",
+ creator: "@xmliszt",
+ creatorId: "1704579643",
+ images: ["https://i.imgur.com/IIP6UzK.jpeg"],
+ },
+ viewport: {
+ width: "device-width",
+ initialScale: 1,
+ },
+};
+
+export default function RootLayout({ children }) {
+ return (
+
+
+ {children}
+
+
+ );
+}
diff --git a/template-js/layout/rootLayout.js b/template-js/layout/rootLayout.js
new file mode 100644
index 0000000..101a91b
--- /dev/null
+++ b/template-js/layout/rootLayout.js
@@ -0,0 +1,80 @@
+import { Metadata } from "next";
+import { ChakraUIProvider } from "./chakraUIProvider";
+import "./globals.css";
+
+// Metdata for SEO
+export const metadata = {
+ title: "NextJS Easy Template",
+ description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan",
+ manifest: "/manifest.json",
+ appleWebApp: {
+ title: "NextJS Easy Template",
+ statusBarStyle: "black-translucent",
+ },
+ icons: {
+ icon: "/favicon.ico",
+ apple: [
+ {
+ url: "/android-chrome-192x192.png",
+ sizes: "192x192",
+ type: "image/png",
+ },
+ {
+ url: "/android-chrome512x512.png",
+ sizes: "512x512",
+ type: "image/png",
+ },
+ ],
+ other: {
+ rel: "apple-touch-icon",
+ url: "/apple-touch-icon.png",
+ },
+ },
+ applicationName: "NextJS Easy Template",
+ keywords: ["template"],
+ authors: [{ name: "Li Yuxuan", url: "https://xmliszt.github.io/" }],
+ creator: "Li Yuxuan",
+ alternates: {
+ canonical: "http://localhost:3000",
+ },
+ category: "technology",
+ openGraph: {
+ title: "NextJS Easy Template",
+ description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan",
+ url: "http://localhost:3000",
+ siteName: "Taboo AI",
+ images: [
+ {
+ url: "https://i.imgur.com/IIP6UzK.jpeg",
+ width: 800,
+ height: 600,
+ alt: "NextJS Easy Template",
+ },
+ ],
+ locale: "en_US",
+ type: "website",
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: "NextJS Easy Template",
+ description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan",
+ siteId: "1704579643",
+ creator: "@xmliszt",
+ creatorId: "1704579643",
+ images: ["https://i.imgur.com/IIP6UzK.jpeg"],
+ },
+ viewport: {
+ width: "device-width",
+ initialScale: 1,
+ },
+};
+
+export default function RootLayout({ children }) {
+ return (
+
+
+ {children}
+
+
+ );
+}
diff --git a/template/next-auth/[...nextauth].js b/template-js/next-auth/[...nextauth].js
similarity index 100%
rename from template/next-auth/[...nextauth].js
rename to template-js/next-auth/[...nextauth].js
diff --git a/template/page/rootPage-mui.tsx b/template-js/page/rootPage-mui.js
similarity index 100%
rename from template/page/rootPage-mui.tsx
rename to template-js/page/rootPage-mui.js
diff --git a/template/page/rootPage-no-chakraui.tsx b/template-js/page/rootPage-no-chakraui.js
similarity index 100%
rename from template/page/rootPage-no-chakraui.tsx
rename to template-js/page/rootPage-no-chakraui.js
diff --git a/template/page/rootPage-radix.tsx b/template-js/page/rootPage-radix.js
similarity index 100%
rename from template/page/rootPage-radix.tsx
rename to template-js/page/rootPage-radix.js
diff --git a/template/page/rootPage.tsx b/template-js/page/rootPage.js
similarity index 100%
rename from template/page/rootPage.tsx
rename to template-js/page/rootPage.js
diff --git a/template/pwa/manifest.json b/template-js/pwa/manifest.json
similarity index 100%
rename from template/pwa/manifest.json
rename to template-js/pwa/manifest.json
diff --git a/template-ts/LICENSE b/template-ts/LICENSE
new file mode 100644
index 0000000..2945eb5
--- /dev/null
+++ b/template-ts/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Li Yuxuan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/template-ts/README.md b/template-ts/README.md
new file mode 100644
index 0000000..48f16bd
--- /dev/null
+++ b/template-ts/README.md
@@ -0,0 +1,122 @@
+# Hello 👋 I'm A Next13 TypeScript Template!
+
+boostrapped with `TailwindCSS` and `ESLint`, configured with `PWA` and `SEO`, created by [Li Yuxuan](https://xmliszt.github.io)
+
+**NPM Package: https://www.npmjs.com/package/create-easy-next13-template-ts**
+
+## Run the Sample App
+
+```bash
+npm run dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+
+You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
+
+## Create a build
+
+```bash
+npm run build
+```
+
+## Linting
+
+```bash
+npm run lint
+```
+
+## (If you install Jest)
+
+To test
+
+```bash
+npm run test
+```
+
+## (If you install Cypress)
+
+To test
+
+```bash
+npm run cypress
+```
+
+## (If you install Playwright)
+
+To test
+
+```bash
+npm run test:e2e
+```
+
+## Deploy on Vercel
+
+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
+
+Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
+
+## Template Introduction
+
+A few things to take notes before you start:
+
+- This is a TypeScript template. JavaScript is currently not supported.
+- The template will install the latest **NextJS** version (Next13), with the "App Router" mode enabled. If you are more familiar with the traditional "Pages Router", feel free to change the example application. (For more details about "App Router" vs "Pages Router", visit [NextJS Documentation](https://nextjs.org/docs) to find out more!)
+- The template will also by default include the followings. Feel free to modify or remove any of them if you don't want to include them in your project. **Instructions on how to remove them are documented at the end of this README.**
+ - Install TailwindCSS
+ - Install ESLint
+ - Set up PWA
+ - Set up SEO
+
+## How to use
+
+- simply run `npx create-easy-next13-template-ts@latest` and follow on screen instructions!
+
+```bash
+npx create-easy-next13-template-ts@latest
+```
+
+## Features
+
+- A TypeScript Next 13 (App Router) template with
+ [TailwindCSS](https://tailwindcss.com) and [ESLint](https://eslint.org) supported by default.
+- Optional UI library [Chakra UI](https://chakra-ui.com), [Material UI](https://mui.com) to be installed.
+- [Progressive Web App (PWA)](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps) enabled (with next-pwa)
+- [Search Engine Optimization (SEO)](https://support.google.com/webmasters/answer/7451184?hl=en/) is included (with [NextJS Metadata](https://nextjs.org/docs/app/building-your-application/optimizing/metadata))
+- Optional third-party libraries such as: [React Icons](https://react-icons.github.io/react-icons/), [NextAuth.js](https://next-auth.js.org), [Lodash](https://lodash.com), [Moment.js](https://momentjs.com) to be installed.
+- Optional Testing frameworks to be installed: [Jest](https://jestjs.io), [Cypress](https://www.cypress.io), [Playwright](https://playwright.dev)
+- Optional markdown files support, with [React-Markdown](https://github.com/remarkjs/react-markdown)
+- Optional linter(s) and formatter(s) to be installed: [Stylelint](https://github.com/remarkjs/react-markdown), [Prettier](https://prettier.io)
+- [Husky](https://typicode.github.io/husky/) can be installed for adding git hooks to your project
+- MIT License
+
+## Remove Search Engine Optimization (SEO)
+
+The project is automatically configured with sample SEO approach. You can find the details in `app/layout.tsx`, where you see the `export const metadata: Metadata = {...}` is being defined. If you wish to remove SEO, simply remove the entire metdata block. For more information about metdata in Next13, check out: https://nextjs.org/docs/app/building-your-application/optimizing/metadata
+
+## Remove Progressive Web App (PWA)
+
+The project is by default boostrapped with PWA using `next-pwa`. If you wish to remove PWA, you can follow the below steps:
+
+1. Go to `next.config.js` in root directory, remove anything related to PWA, namely `withPWA` and change `module.exports = withPWA(nextConfig);` into `module.exports = nextConfig;`
+2. Go to `public/` and remove `manifest.json`
+3. Go to `app/layout.tsx`, (assuming you have SEO enabled), in the `metadata` block, remove `manifest`, `appleWebApp` fields.
+
+## Remove ESLint
+
+The project is by default installed with ESLint. If you wish to remove it, simply remove the `.eslintrc.json` in root directory. You can also remove the `lint` field in the `scripts` field in `package.json`.
+
+## Remove TailwindCSS
+
+The project is by default installed with TailwindCSS integration with Next13. If you wish to remove it, follow the below steps:
+
+1. At root directory, remove `postcss.config.js` and `tailwind.config.js`
+2. In `app/globals.css`, remove the `@tailwind` lines at the top, and any lines that start with `@apply`
+
+> Note: once you remove tailwindCSS, all the tailwindCSS syntax in `className` will not work anymore! You have to remove them or create your own CSS classes.
+
+---
+
+Feel free to remove / modify any pre-installed packages to suit your own needs!
+
+😈 Happy Hacking!
diff --git a/template/components/MUIThemeProvider.tsx b/template-ts/components/MUIThemeProvider.tsx
similarity index 100%
rename from template/components/MUIThemeProvider.tsx
rename to template-ts/components/MUIThemeProvider.tsx
diff --git a/template/components/RadixThemeProvider.tsx b/template-ts/components/RadixThemeProvider.tsx
similarity index 100%
rename from template/components/RadixThemeProvider.tsx
rename to template-ts/components/RadixThemeProvider.tsx
diff --git a/template/components/chakraUIProvider.tsx b/template-ts/components/chakraUIProvider.tsx
similarity index 100%
rename from template/components/chakraUIProvider.tsx
rename to template-ts/components/chakraUIProvider.tsx
diff --git a/template-ts/config/gitignore b/template-ts/config/gitignore
new file mode 100644
index 0000000..81d8100
--- /dev/null
+++ b/template-ts/config/gitignore
@@ -0,0 +1,42 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+# Auto Generated PWA files
+**/public/sw.js
+**/public/workbox-*.js
+**/public/worker-*.js
+**/public/sw.js.map
+**/public/workbox-*.js.map
+**/public/worker-*.js.map
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/template-ts/config/globals.d.ts b/template-ts/config/globals.d.ts
new file mode 100644
index 0000000..5c1c18f
--- /dev/null
+++ b/template-ts/config/globals.d.ts
@@ -0,0 +1 @@
+declare module '*.md';
diff --git a/template-ts/config/jest.config.mjs b/template-ts/config/jest.config.mjs
new file mode 100644
index 0000000..ffee258
--- /dev/null
+++ b/template-ts/config/jest.config.mjs
@@ -0,0 +1,18 @@
+import nextJest from 'next/jest.js';
+
+const createJestConfig = nextJest({
+ // Provide the path to your Next.js app to load next.config.js and .env files in your test environment
+ dir: './',
+});
+
+// Add any custom config to be passed to Jest
+/** @type {import('jest').Config} */
+const config = {
+ // Add more setup options before each test is run
+ // setupFilesAfterEnv: ['/jest.setup.js'],
+
+ testEnvironment: 'jest-environment-jsdom',
+};
+
+// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async
+export default createJestConfig(config);
diff --git a/template-ts/config/next-pwa-with-markdown.config.js b/template-ts/config/next-pwa-with-markdown.config.js
new file mode 100644
index 0000000..2f445f7
--- /dev/null
+++ b/template-ts/config/next-pwa-with-markdown.config.js
@@ -0,0 +1,37 @@
+/** @type {import('next').NextConfig} */
+
+const appSecurityHeaders = [
+ { key: 'X-XSS-Protection', value: '1; mode=block' },
+ {
+ key: 'X-Frame-Options',
+ value: 'SAMEORIGIN',
+ },
+];
+
+const withPWA = require('next-pwa')({
+ dest: 'public',
+ register: true,
+ skipWaiting: true,
+});
+
+const nextConfig = {
+ reactStrictMode: true,
+ webpack: (config) => {
+ config.module.rules.push({
+ test: /\.md$/,
+ use: 'raw-loader',
+ });
+ return config;
+ },
+ async headers() {
+ return [
+ {
+ // Apply these headers to all routes in your application.
+ source: '/:path*',
+ headers: appSecurityHeaders,
+ },
+ ];
+ },
+};
+
+module.exports = withPWA(nextConfig);
diff --git a/template-ts/config/next-pwa.config.js b/template-ts/config/next-pwa.config.js
new file mode 100644
index 0000000..fd9e3d5
--- /dev/null
+++ b/template-ts/config/next-pwa.config.js
@@ -0,0 +1,30 @@
+/** @type {import('next').NextConfig} */
+
+const appSecurityHeaders = [
+ { key: 'X-XSS-Protection', value: '1; mode=block' },
+ {
+ key: 'X-Frame-Options',
+ value: 'SAMEORIGIN',
+ },
+];
+
+const withPWA = require('next-pwa')({
+ dest: 'public',
+ register: true,
+ skipWaiting: true,
+});
+
+const nextConfig = {
+ reactStrictMode: true,
+ async headers() {
+ return [
+ {
+ // Apply these headers to all routes in your application.
+ source: '/:path*',
+ headers: appSecurityHeaders,
+ },
+ ];
+ },
+};
+
+module.exports = withPWA(nextConfig);
diff --git a/template-ts/config/prettierignore b/template-ts/config/prettierignore
new file mode 100644
index 0000000..4a7a0b5
--- /dev/null
+++ b/template-ts/config/prettierignore
@@ -0,0 +1,25 @@
+**/build
+**/coverage
+
+*.html
+**/.git
+**/node_modules
+
+**/package-lock.json
+
+**/.husky/**
+**/.prettierignore
+
+**/playwright-report/**
+**/public/**
+**/test-results/**
+
+**/.gitignore
+**/.github/**
+**/.vscode/**
+**/.swc/**
+**/.next/**
+**/.vercel/**
+
+**/LICENSE
+**/*.png
diff --git a/template-ts/config/prettierrc.json b/template-ts/config/prettierrc.json
new file mode 100644
index 0000000..81c7f73
--- /dev/null
+++ b/template-ts/config/prettierrc.json
@@ -0,0 +1,9 @@
+{
+ "tabWidth": 2,
+ "semi": true,
+ "singleQuote": true,
+ "jsxSingleQuote": true,
+ "trailingComma": "es5",
+ "bracketSpacing": true,
+ "arrowParens": "always"
+}
diff --git a/template-ts/config/stylelintrc.json b/template-ts/config/stylelintrc.json
new file mode 100644
index 0000000..b546a10
--- /dev/null
+++ b/template-ts/config/stylelintrc.json
@@ -0,0 +1,17 @@
+{
+ "extends": ["stylelint-config-standard"],
+ "rules": {
+ "at-rule-no-unknown": [
+ true,
+ {
+ "ignoreAtRules": [
+ "tailwind",
+ "apply",
+ "variants",
+ "responsive",
+ "screen"
+ ]
+ }
+ ]
+ }
+}
diff --git a/template-ts/css/globals-mui.css b/template-ts/css/globals-mui.css
new file mode 100644
index 0000000..377771a
--- /dev/null
+++ b/template-ts/css/globals-mui.css
@@ -0,0 +1,38 @@
+@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap");
+@import url("https://fonts.googleapis.com/icon?family=Material+Icons");
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+:root {
+ --foreground-rgb: 0, 0, 0;
+ --background-start-rgb: 200, 200, 255;
+ --background-end-rgb: 255, 255, 255;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --foreground-rgb: 255, 255, 255;
+ --background-start-rgb: 0, 0, 0;
+ --background-end-rgb: 0, 0, 0;
+ }
+}
+
+body {
+ color: rgb(var(--foreground-rgb));
+ background: linear-gradient(
+ to bottom,
+ transparent,
+ rgb(var(--background-end-rgb))
+ )
+ rgb(var(--background-start-rgb));
+}
+
+a {
+ @apply underline text-purple-400;
+}
+
+li {
+ @apply list-disc;
+}
diff --git a/template-ts/css/globals-no-chakraui.css b/template-ts/css/globals-no-chakraui.css
new file mode 100644
index 0000000..28583ba
--- /dev/null
+++ b/template-ts/css/globals-no-chakraui.css
@@ -0,0 +1,35 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+:root {
+ --foreground-rgb: 0, 0, 0;
+ --background-start-rgb: 200, 200, 255;
+ --background-end-rgb: 255, 255, 255;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --foreground-rgb: 255, 255, 255;
+ --background-start-rgb: 0, 0, 0;
+ --background-end-rgb: 0, 0, 0;
+ }
+}
+
+body {
+ color: rgb(var(--foreground-rgb));
+ background: linear-gradient(
+ to bottom,
+ transparent,
+ rgb(var(--background-end-rgb))
+ )
+ rgb(var(--background-start-rgb));
+}
+
+a {
+ @apply underline text-purple-400;
+}
+
+li {
+ @apply list-disc;
+}
diff --git a/template-ts/css/globals-radix.css b/template-ts/css/globals-radix.css
new file mode 100644
index 0000000..796b61a
--- /dev/null
+++ b/template-ts/css/globals-radix.css
@@ -0,0 +1,11 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+body {
+ background: linear-gradient(
+ to bottom,
+ rgb(33, 33, 33) 0%,
+ rgb(116, 84, 168) 80%
+ );
+}
diff --git a/template-ts/css/globals.css b/template-ts/css/globals.css
new file mode 100644
index 0000000..81521ee
--- /dev/null
+++ b/template-ts/css/globals.css
@@ -0,0 +1,27 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+:root {
+ --foreground-rgb: 0, 0, 0;
+ --background-start-rgb: 200, 200, 255;
+ --background-end-rgb: 255, 255, 255;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --foreground-rgb: 255, 255, 255;
+ --background-start-rgb: 0, 0, 0;
+ --background-end-rgb: 0, 0, 0;
+ }
+}
+
+body {
+ color: rgb(var(--foreground-rgb));
+ background: linear-gradient(
+ to bottom,
+ transparent,
+ rgb(var(--background-end-rgb))
+ )
+ rgb(var(--background-start-rgb));
+}
diff --git a/template-ts/image/android-chrome-192x192.png b/template-ts/image/android-chrome-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..16fdb0ebb0271fde488c85c298e5d7e8c9947a82
GIT binary patch
literal 11902
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
SzQljE-wHCS(shz1q5lV#yu<(i
literal 0
HcmV?d00001
diff --git a/template-ts/image/android-chrome-512x512.png b/template-ts/image/android-chrome-512x512.png
new file mode 100644
index 0000000000000000000000000000000000000000..909e33bc835a3b3fbbb333ab6f04cf9138b06d0e
GIT binary patch
literal 39285
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