├── .nvmrc
├── templates
├── application
│ ├── preact
│ │ ├── src
│ │ │ ├── index.ts
│ │ │ ├── index.css
│ │ │ └── App.tsx
│ │ ├── module-federation.config.ts
│ │ ├── index.html
│ │ ├── .babelrc
│ │ ├── tsconfig.json
│ │ ├── package.json
│ │ ├── gitignore
│ │ └── rspack.config.ts.ejs
│ ├── lit-html
│ │ ├── src
│ │ │ ├── index.ts
│ │ │ ├── index.css
│ │ │ └── App.ts
│ │ ├── module-federation.config.ts
│ │ ├── .babelrc
│ │ ├── index.html
│ │ ├── tsconfig.json
│ │ ├── package.json
│ │ ├── rspack.config.ts.ejs
│ │ └── gitignore
│ ├── react-18
│ │ ├── src
│ │ │ ├── index.ts
│ │ │ ├── index.css
│ │ │ └── App.tsx
│ │ ├── module-federation.config.ts
│ │ ├── .babelrc
│ │ ├── index.html
│ │ ├── tsconfig.json
│ │ ├── package.json
│ │ ├── gitignore
│ │ └── rspack.config.ts.ejs
│ ├── react-19
│ │ ├── src
│ │ │ ├── index.ts
│ │ │ ├── index.css
│ │ │ └── App.tsx
│ │ ├── module-federation.config.ts
│ │ ├── .babelrc
│ │ ├── index.html
│ │ ├── tsconfig.json
│ │ ├── package.json
│ │ ├── gitignore
│ │ └── rspack.config.ts.ejs
│ ├── solid-js
│ │ ├── src
│ │ │ ├── index.ts
│ │ │ ├── index.css
│ │ │ └── App.tsx
│ │ ├── module-federation.config.ts
│ │ ├── .babelrc
│ │ ├── index.html
│ │ ├── tsconfig.json
│ │ ├── package.json
│ │ ├── rspack.config.ts.ejs
│ │ └── gitignore
│ ├── vue3
│ │ ├── src
│ │ │ ├── index.ts
│ │ │ ├── bootloader.ts
│ │ │ ├── vue-shim.d.ts
│ │ │ ├── index.css
│ │ │ └── App.vue
│ │ ├── .babelrc
│ │ ├── module-federation.config.ts
│ │ ├── index.html
│ │ ├── tsconfig.json
│ │ ├── package.json
│ │ ├── gitignore
│ │ └── rspack.config.ts.ejs
│ ├── svelte
│ │ ├── src
│ │ │ ├── index.ts
│ │ │ ├── App.svelte
│ │ │ ├── index.css
│ │ │ └── bootloader.ts
│ │ ├── module-federation.config.ts
│ │ ├── .babelrc
│ │ ├── index.html
│ │ ├── tsconfig.json
│ │ ├── package.json
│ │ ├── gitignore
│ │ └── rspack.config.ts.ejs
│ └── vanilla
│ │ ├── module-federation.config.ts
│ │ ├── .babelrc
│ │ ├── src
│ │ ├── index.css
│ │ └── index.ts
│ │ ├── index.html
│ │ ├── tsconfig.json
│ │ ├── package.json
│ │ ├── rspack.config.ts.ejs
│ │ └── gitignore
├── application-extras
│ └── tailwind
│ │ ├── src
│ │ └── index.css
│ │ └── postcss.config.mjs
├── server
│ ├── nestjs-auth
│ │ ├── .prettierrc
│ │ ├── src
│ │ │ ├── config.ts
│ │ │ ├── auth
│ │ │ │ ├── constants.ts
│ │ │ │ ├── jwt-auth.guard.ts
│ │ │ │ ├── local-auth.guard.ts
│ │ │ │ ├── jwt.strategy.ts
│ │ │ │ ├── local.strategy.ts
│ │ │ │ ├── auth.module.ts
│ │ │ │ └── auth.service.ts
│ │ │ ├── users
│ │ │ │ ├── users.module.ts
│ │ │ │ └── users.service.ts
│ │ │ ├── modules
│ │ │ │ ├── authorized
│ │ │ │ │ ├── authorized.module.ts
│ │ │ │ │ └── authorized.controller.ts
│ │ │ │ └── unauthorized
│ │ │ │ │ ├── unauthorized.module.ts
│ │ │ │ │ └── unauthorized.controller.ts
│ │ │ ├── main.ts
│ │ │ ├── app.controller.ts
│ │ │ └── app.module.ts
│ │ ├── nest-cli.json
│ │ ├── public
│ │ │ ├── placeholder.txt
│ │ │ └── .DS_Store
│ │ ├── .DS_Store
│ │ ├── tsconfig.build.json
│ │ ├── test
│ │ │ ├── jest-e2e.json
│ │ │ └── app.e2e-spec.ts
│ │ ├── gitignore
│ │ ├── tsconfig.json
│ │ ├── .eslintrc.js
│ │ ├── README.md
│ │ └── package.json
│ ├── nestjs-todo
│ │ ├── .prettierrc
│ │ ├── nest-cli.json
│ │ ├── tsconfig.build.json
│ │ ├── src
│ │ │ ├── app.module.ts
│ │ │ ├── modules
│ │ │ │ └── todos
│ │ │ │ │ ├── todo.module.ts
│ │ │ │ │ └── todo.controller.ts
│ │ │ └── main.ts
│ │ ├── test
│ │ │ ├── jest-e2e.json
│ │ │ └── app.e2e-spec.ts
│ │ ├── gitignore
│ │ ├── tsconfig.json
│ │ ├── .eslintrc.js
│ │ └── package.json
│ ├── express
│ │ ├── index.ts
│ │ ├── gitignore
│ │ ├── package.json
│ │ └── yarn.lock
│ ├── graphql-nexus
│ │ ├── gitignore
│ │ ├── package.json
│ │ ├── src
│ │ │ └── index.ts
│ │ └── tsconfig.json
│ ├── graphql-apollo
│ │ ├── package.json
│ │ ├── gitignore
│ │ ├── src
│ │ │ └── index.ts
│ │ └── tsconfig.json
│ └── graphql-subscriptions
│ │ ├── gitignore
│ │ ├── package.json
│ │ ├── src
│ │ └── index.ts
│ │ └── tsconfig.json
└── library
│ └── typescript
│ ├── src
│ └── index.ts
│ ├── package.json
│ ├── yarn.lock
│ ├── gitignore
│ └── tsconfig.json
├── .husky
└── pre-commit
├── .prettierrc
├── .gitignore
├── .npmignore
├── tsconfig.json
├── eslint.config.mjs
├── LICENSE
├── package.json
├── README.md
├── src
├── __tests__
│ └── index.test.ts
└── index.ts
└── bin
└── create-mf-app.ts
/.nvmrc:
--------------------------------------------------------------------------------
1 | v18.16.0
--------------------------------------------------------------------------------
/templates/application/preact/src/index.ts:
--------------------------------------------------------------------------------
1 | import("./App");
2 |
--------------------------------------------------------------------------------
/templates/application/lit-html/src/index.ts:
--------------------------------------------------------------------------------
1 | import("./App");
2 |
--------------------------------------------------------------------------------
/templates/application/react-18/src/index.ts:
--------------------------------------------------------------------------------
1 | import("./App");
2 |
--------------------------------------------------------------------------------
/templates/application/react-19/src/index.ts:
--------------------------------------------------------------------------------
1 | import("./App");
2 |
--------------------------------------------------------------------------------
/templates/application/solid-js/src/index.ts:
--------------------------------------------------------------------------------
1 | import("./App");
2 |
--------------------------------------------------------------------------------
/templates/application/vue3/src/index.ts:
--------------------------------------------------------------------------------
1 | import("./bootloader");
2 |
--------------------------------------------------------------------------------
/templates/application/svelte/src/index.ts:
--------------------------------------------------------------------------------
1 | import("./bootloader");
2 |
--------------------------------------------------------------------------------
/templates/application-extras/tailwind/src/index.css:
--------------------------------------------------------------------------------
1 | @import "tailwindcss";
2 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | . "$(dirname "$0")/_/husky.sh"
3 |
4 | pnpm lint
5 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": false,
3 | "trailingComma": "es5",
4 | "semi": true
5 | }
6 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "all"
4 | }
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "all"
4 | }
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/config.ts:
--------------------------------------------------------------------------------
1 | export const JWT_SECRET = process.env.JWT_SECRET || 'secret';
2 |
--------------------------------------------------------------------------------
/templates/application/vue3/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-typescript", "@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/auth/constants.ts:
--------------------------------------------------------------------------------
1 | export const jwtConstants = {
2 | secret: 'secretKey',
3 | };
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | bin/create-mf-app.js
3 | src/index.js
4 | src/types.js
5 | pnpm-lock.yaml
6 | .DS_Store
7 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/nest-cli.json:
--------------------------------------------------------------------------------
1 | {
2 | "collection": "@nestjs/schematics",
3 | "sourceRoot": "src"
4 | }
5 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/public/placeholder.txt:
--------------------------------------------------------------------------------
1 | Put your static files in this directory and then delete this file.
2 |
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/nest-cli.json:
--------------------------------------------------------------------------------
1 | {
2 | "collection": "@nestjs/schematics",
3 | "sourceRoot": "src"
4 | }
5 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jherr/create-mf-app/HEAD/templates/server/nestjs-auth/.DS_Store
--------------------------------------------------------------------------------
/templates/library/typescript/src/index.ts:
--------------------------------------------------------------------------------
1 | const addNumbers = (a: number, b: number): number => a + b;
2 | export default addNumbers;
3 |
--------------------------------------------------------------------------------
/templates/application-extras/tailwind/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | "@tailwindcss/postcss": {},
4 | },
5 | };
6 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/public/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jherr/create-mf-app/HEAD/templates/server/nestjs-auth/public/.DS_Store
--------------------------------------------------------------------------------
/templates/application/vanilla/module-federation.config.ts:
--------------------------------------------------------------------------------
1 | export const mfConfig = {
2 | name: "{{SAFE_NAME}}",
3 | exposes: {},
4 | shared: [],
5 | };
6 |
--------------------------------------------------------------------------------
/templates/application/vue3/module-federation.config.ts:
--------------------------------------------------------------------------------
1 | export const mfConfig = {
2 | name: "{{SAFE_NAME}}",
3 | exposes: {},
4 | shared: ["vue"],
5 | };
6 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/tsconfig.build.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/tsconfig.build.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/templates/application/preact/module-federation.config.ts:
--------------------------------------------------------------------------------
1 | export const mfConfig = {
2 | name: "{{SAFE_NAME}}",
3 | exposes: {},
4 | shared: ["preact"],
5 | };
6 |
--------------------------------------------------------------------------------
/templates/application/svelte/module-federation.config.ts:
--------------------------------------------------------------------------------
1 | export const mfConfig = {
2 | name: "{{SAFE_NAME}}",
3 | exposes: {},
4 | shared: ["svelte"],
5 | };
6 |
--------------------------------------------------------------------------------
/templates/application/svelte/src/App.svelte:
--------------------------------------------------------------------------------
1 |
2 |
Name: {{ NAME }}
3 |
Framework: {{ FRAMEWORK }}
4 |
5 |
--------------------------------------------------------------------------------
/templates/application/lit-html/module-federation.config.ts:
--------------------------------------------------------------------------------
1 | export const mfConfig = {
2 | name: "{{SAFE_NAME}}",
3 | exposes: {},
4 | shared: ["lit-html"],
5 | };
6 |
--------------------------------------------------------------------------------
/templates/application/solid-js/module-federation.config.ts:
--------------------------------------------------------------------------------
1 | export const mfConfig = {
2 | name: "{{SAFE_NAME}}",
3 | exposes: {},
4 | shared: ["solid-js"],
5 | };
6 |
--------------------------------------------------------------------------------
/templates/application/react-18/module-federation.config.ts:
--------------------------------------------------------------------------------
1 | export const mfConfig = {
2 | name: "{{SAFE_NAME}}",
3 | exposes: {},
4 | shared: ["react", "react-dom"],
5 | };
6 |
--------------------------------------------------------------------------------
/templates/application/react-19/module-federation.config.ts:
--------------------------------------------------------------------------------
1 | export const mfConfig = {
2 | name: "{{SAFE_NAME}}",
3 | exposes: {},
4 | shared: ["react", "react-dom"],
5 | };
6 |
--------------------------------------------------------------------------------
/templates/application/svelte/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-typescript", "@babel/preset-env"],
3 | "plugins": [
4 | ["@babel/transform-runtime"]
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------
/templates/application/vanilla/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-typescript", "@babel/preset-env"],
3 | "plugins": [
4 | ["@babel/transform-runtime"]
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------
/templates/application/lit-html/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-typescript", "@babel/preset-env"],
3 | "plugins": [
4 | ["@babel/transform-runtime"]
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------
/templates/application/vue3/src/bootloader.ts:
--------------------------------------------------------------------------------
1 | import { createApp } from "vue";
2 |
3 | import "./index.css";
4 |
5 | import App from "./App.vue";
6 |
7 | createApp(App).mount("#app");
8 |
--------------------------------------------------------------------------------
/templates/application/react-18/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-typescript", "@babel/preset-react", "@babel/preset-env"],
3 | "plugins": [
4 | ["@babel/transform-runtime"]
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------
/templates/application/react-19/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-typescript", "@babel/preset-react", "@babel/preset-env"],
3 | "plugins": [
4 | ["@babel/transform-runtime"]
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------
/templates/application/solid-js/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-typescript", "babel-preset-solid", "@babel/preset-env"],
3 | "plugins": [
4 | ["@babel/transform-runtime"]
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------
/templates/application/vue3/src/vue-shim.d.ts:
--------------------------------------------------------------------------------
1 | declare module "*.vue" {
2 | import { defineComponent } from "vue";
3 | const Component: ReturnType;
4 | export default Component;
5 | }
6 |
--------------------------------------------------------------------------------
/templates/application/preact/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: Arial, Helvetica, sans-serif;
3 | }
4 |
5 | .container {
6 | font-size: 3rem;
7 | margin: auto;
8 | max-width: 800px;
9 | margin-top: 20px;
10 | }
--------------------------------------------------------------------------------
/templates/application/svelte/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: Arial, Helvetica, sans-serif;
3 | }
4 |
5 | .container {
6 | font-size: 3rem;
7 | margin: auto;
8 | max-width: 800px;
9 | margin-top: 20px;
10 | }
--------------------------------------------------------------------------------
/templates/application/vanilla/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: Arial, Helvetica, sans-serif;
3 | }
4 |
5 | .container {
6 | font-size: 3rem;
7 | margin: auto;
8 | max-width: 800px;
9 | margin-top: 20px;
10 | }
--------------------------------------------------------------------------------
/templates/application/vue3/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: Arial, Helvetica, sans-serif;
3 | }
4 |
5 | .container {
6 | font-size: 3rem;
7 | margin: auto;
8 | max-width: 800px;
9 | margin-top: 20px;
10 | }
--------------------------------------------------------------------------------
/templates/application/lit-html/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: Arial, Helvetica, sans-serif;
3 | }
4 |
5 | .container {
6 | font-size: 3rem;
7 | margin: auto;
8 | max-width: 800px;
9 | margin-top: 20px;
10 | }
--------------------------------------------------------------------------------
/templates/application/react-18/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: Arial, Helvetica, sans-serif;
3 | }
4 |
5 | .container {
6 | font-size: 3rem;
7 | margin: auto;
8 | max-width: 800px;
9 | margin-top: 20px;
10 | }
--------------------------------------------------------------------------------
/templates/application/react-19/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: Arial, Helvetica, sans-serif;
3 | }
4 |
5 | .container {
6 | font-size: 3rem;
7 | margin: auto;
8 | max-width: 800px;
9 | margin-top: 20px;
10 | }
--------------------------------------------------------------------------------
/templates/application/solid-js/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: Arial, Helvetica, sans-serif;
3 | }
4 |
5 | .container {
6 | font-size: 3rem;
7 | margin: auto;
8 | max-width: 800px;
9 | margin-top: 20px;
10 | }
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/auth/jwt-auth.guard.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@nestjs/common';
2 | import { AuthGuard } from '@nestjs/passport';
3 |
4 | @Injectable()
5 | export class JwtAuthGuard extends AuthGuard('jwt') {}
6 |
--------------------------------------------------------------------------------
/templates/application/vanilla/src/index.ts:
--------------------------------------------------------------------------------
1 | import "./index.css";
2 |
3 | document.getElementById("app").innerHTML = `
4 |
5 |
Name: {{NAME}}
6 |
Framework: {{FRAMEWORK}}
7 |
8 | `;
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/auth/local-auth.guard.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@nestjs/common';
2 | import { AuthGuard } from '@nestjs/passport';
3 |
4 | @Injectable()
5 | export class LocalAuthGuard extends AuthGuard('local') {}
6 |
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/src/app.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { TodosModule } from './modules/todos/todo.module';
3 |
4 | @Module({
5 | imports: [TodosModule],
6 | })
7 | export class AppModule {}
8 |
--------------------------------------------------------------------------------
/templates/application/svelte/src/bootloader.ts:
--------------------------------------------------------------------------------
1 | import App from "./App.svelte";
2 |
3 | import "./index.css";
4 |
5 | const app = new App({
6 | target: document.getElementById("app"),
7 | });
8 |
9 | window.app = app;
10 |
11 | export default app;
12 |
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/src/modules/todos/todo.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 |
3 | import { TodosController } from './todo.controller';
4 |
5 | @Module({
6 | controllers: [TodosController],
7 | })
8 | export class TodosModule {}
9 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/test/jest-e2e.json:
--------------------------------------------------------------------------------
1 | {
2 | "moduleFileExtensions": ["js", "json", "ts"],
3 | "rootDir": ".",
4 | "testEnvironment": "node",
5 | "testRegex": ".e2e-spec.ts$",
6 | "transform": {
7 | "^.+\\.(t|j)s$": "ts-jest"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/test/jest-e2e.json:
--------------------------------------------------------------------------------
1 | {
2 | "moduleFileExtensions": ["js", "json", "ts"],
3 | "rootDir": ".",
4 | "testEnvironment": "node",
5 | "testRegex": ".e2e-spec.ts$",
6 | "transform": {
7 | "^.+\\.(t|j)s$": "ts-jest"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/users/users.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 |
3 | import { UsersService } from './users.service';
4 |
5 | @Module({
6 | providers: [UsersService],
7 | exports: [UsersService],
8 | })
9 | export class UsersModule {}
10 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/modules/authorized/authorized.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 |
3 | import { AuthorizedController } from './authorized.controller';
4 |
5 | @Module({
6 | controllers: [AuthorizedController],
7 | })
8 | export class AuthorizedModule {}
9 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/modules/unauthorized/unauthorized.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 |
3 | import { UnauthorizedController } from './unauthorized.controller';
4 |
5 | @Module({
6 | controllers: [UnauthorizedController],
7 | })
8 | export class UnauthorizedModule {}
9 |
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/src/main.ts:
--------------------------------------------------------------------------------
1 | import { NestFactory } from '@nestjs/core';
2 | import { AppModule } from './app.module';
3 |
4 | async function bootstrap() {
5 | const app = await NestFactory.create(AppModule);
6 | app.enableCors();
7 | await app.listen({{PORT}});
8 | }
9 | bootstrap();
10 |
--------------------------------------------------------------------------------
/templates/library/typescript/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "1.0.0",
4 | "main": "dist/index.js",
5 | "license": "MIT",
6 | "scripts": {
7 | "build": "tsc",
8 | "watch": "tsc --watch"
9 | },
10 | "devDependencies": {
11 | "typescript": "^4.4.4"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | # https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package
2 |
3 | #node
4 | yarn.lock
5 |
6 | #misc
7 | .husky
8 | assets
9 |
10 | #tests
11 | test
12 | coverage
13 |
14 | #linters
15 | .eslintrc*
16 | .eslintignore
17 |
18 | #editor settings
19 | .vscode
20 | .idea
21 | .editorconfig
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/main.ts:
--------------------------------------------------------------------------------
1 | import { NestFactory } from '@nestjs/core';
2 |
3 | import { AppModule } from './app.module';
4 |
5 | async function bootstrap() {
6 | const app = await NestFactory.create(AppModule);
7 | app.enableCors();
8 | await app.listen({{PORT}});
9 | }
10 | bootstrap();
11 |
--------------------------------------------------------------------------------
/templates/application/lit-html/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{NAME}}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/templates/application/preact/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{NAME}}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/templates/application/react-18/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{NAME}}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/templates/application/react-19/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{NAME}}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/templates/application/solid-js/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{NAME}}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/templates/application/svelte/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{NAME}}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/templates/application/vanilla/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{NAME}}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/templates/application/vue3/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{NAME}}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/templates/server/express/index.ts:
--------------------------------------------------------------------------------
1 | import express from "express";
2 |
3 | const app = express();
4 | const port = {{PORT}};
5 |
6 | app.get("/", (req, res) => {
7 | res.send("Hello from {{NAME}}");
8 | });
9 |
10 | app.listen(port, () => {
11 | console.log(`{{NAME}} listening at http://localhost:${port}`);
12 | });
13 |
--------------------------------------------------------------------------------
/templates/application/lit-html/src/App.ts:
--------------------------------------------------------------------------------
1 | import { html, render } from "lit-html";
2 |
3 | import "./index.css";
4 |
5 | const myTemplate = html`
6 |
Name: {{ NAME }}
7 |
Framework: {{ FRAMEWORK }}
8 |
`;
9 |
10 | render(myTemplate, document.getElementById("app"));
11 |
--------------------------------------------------------------------------------
/templates/server/graphql-nexus/gitignore:
--------------------------------------------------------------------------------
1 | *~
2 | *.o
3 | *.pyc
4 | *.d
5 | .DS_Store*
6 | *.swp
7 |
8 | obj/
9 | lib/
10 | bin/
11 | build/
12 | build-dep-src/
13 | build-dep-install/
14 | python/nexus/proto/
15 | python/nexus.egg-info/
16 |
17 | cmake-build*/
18 | .clion.source.upload.marker
19 | .clangd/
20 | compile_commands.json
--------------------------------------------------------------------------------
/templates/application/preact/src/App.tsx:
--------------------------------------------------------------------------------
1 | import { render, h } from "preact";
2 |
3 | import "./index.css";
4 |
5 | const App = () => (
6 |
7 |
Name: {{ NAME }}
8 |
Framework: {{ FRAMEWORK }}
9 |
10 | );
11 |
12 | render(, document.getElementById("app"));
13 |
--------------------------------------------------------------------------------
/templates/application/solid-js/src/App.tsx:
--------------------------------------------------------------------------------
1 | import { render } from "solid-js/web";
2 |
3 | import "./index.css";
4 |
5 | const App = () => (
6 |
7 |
Name: {{ NAME }}
8 |
Framework: {{ FRAMEWORK }}
9 |
10 | );
11 |
12 | render(App, document.getElementById("app"));
13 |
--------------------------------------------------------------------------------
/templates/application/vue3/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Name: {{ NAME }}
4 |
Framework: {{ FRAMEWORK }}
5 |
6 |
7 |
8 |
13 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/modules/unauthorized/unauthorized.controller.ts:
--------------------------------------------------------------------------------
1 | import { Controller, Get, Param } from '@nestjs/common';
2 |
3 | @Controller('unauthorized')
4 | export class UnauthorizedController {
5 | constructor() {}
6 |
7 | @Get()
8 | async index(): Promise {
9 | return true;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/templates/server/express/gitignore:
--------------------------------------------------------------------------------
1 | # OS X
2 | .DS_Store*
3 | Icon?
4 | ._*
5 |
6 | # Windows
7 | Thumbs.db
8 | ehthumbs.db
9 | Desktop.ini
10 |
11 | # Linux
12 | .directory
13 | *~
14 |
15 |
16 | # npm
17 | node_modules
18 | package-lock.json
19 | *.log
20 | *.gz
21 |
22 |
23 | # Coveralls
24 | coverage
25 |
26 | # Benchmarking
27 | benchmarks/graphs
--------------------------------------------------------------------------------
/templates/application/preact/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | [
4 | "@babel/preset-react",
5 | {
6 | "runtime": "automatic",
7 | "importSource": "preact"
8 | }
9 | ]
10 | ],
11 | "plugins": [
12 | ["@babel/plugin-transform-react-jsx", {
13 | "pragma": "h",
14 | "pragmaFrag": "Fragment"
15 | }]
16 | ]
17 | }
18 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "esnext",
4 | "outDir": ".",
5 | "module": "commonjs",
6 | "esModuleInterop": true,
7 | "forceConsistentCasingInFileNames": true,
8 | "strict": true,
9 | "skipLibCheck": true
10 | },
11 | "include": ["src/**/*", "bin/**/*"],
12 | "exclude": ["node_modules", "src/__tests__/**/*"]
13 | }
14 |
--------------------------------------------------------------------------------
/templates/server/express/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "1.0.0",
4 | "license": "MIT",
5 | "scripts": {
6 | "start": "ts-node index.ts"
7 | },
8 | "dependencies": {
9 | "express": "^4.17.1"
10 | },
11 | "devDependencies": {
12 | "@types/express": "^4.17.13",
13 | "ts-node": "^10.4.0",
14 | "typescript": "^4.4.4"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/templates/application/react-19/src/App.tsx:
--------------------------------------------------------------------------------
1 | import ReactDOM from "react-dom/client";
2 |
3 | import "./index.css";
4 |
5 | const App = () => (
6 |
7 |
Name: {{ NAME }}
8 |
Framework: {{ FRAMEWORK }}
9 |
10 | );
11 |
12 | const root = ReactDOM.createRoot(document.getElementById("app") as HTMLElement);
13 |
14 | root.render();
--------------------------------------------------------------------------------
/templates/library/typescript/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | typescript@^4.4.4:
6 | version "4.4.4"
7 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c"
8 | integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==
9 |
--------------------------------------------------------------------------------
/templates/application/react-18/src/App.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom/client";
3 |
4 | import "./index.css";
5 |
6 | const App = () => (
7 |
8 |
Name: {{ NAME }}
9 |
Framework: {{ FRAMEWORK }}
10 |
11 | );
12 |
13 | const root = ReactDOM.createRoot(document.getElementById("app") as HTMLElement);
14 | root.render();
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/modules/authorized/authorized.controller.ts:
--------------------------------------------------------------------------------
1 | import {
2 | Controller,
3 | Get,
4 | Request,
5 | UseGuards,
6 | } from '@nestjs/common';
7 | import { JwtAuthGuard } from '../../auth/jwt-auth.guard';
8 |
9 | @Controller('authorized')
10 | export class AuthorizedController {
11 | constructor() {}
12 |
13 | @Get()
14 | @UseGuards(JwtAuthGuard)
15 | async index(@Request() req): Promise<{userId: number}> {
16 | return { userId: req.user.userId };
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import tseslint from "typescript-eslint";
2 |
3 | /** @type {import('eslint').Linter.Config[]} */
4 | export default {
5 | plugins: {
6 | "@typescript-eslint": tseslint.plugin,
7 | },
8 | languageOptions: {
9 | parser: tseslint.parser,
10 | parserOptions: {
11 | projectService: true,
12 | tsconfigRootDir: import.meta.dirname,
13 | },
14 | },
15 | files: ["bin/*.ts", "src/*.ts"],
16 | ignores: ["bin/*.js", "src/*.js", "templates", "node_modules"],
17 | };
18 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/app.controller.ts:
--------------------------------------------------------------------------------
1 | import { Controller, Post, UseGuards, Request } from '@nestjs/common';
2 | import { LocalAuthGuard } from './auth/local-auth.guard';
3 | import { AuthService } from './auth/auth.service';
4 |
5 | @Controller()
6 | export class AppController {
7 | constructor(private authService: AuthService) {}
8 |
9 | @UseGuards(LocalAuthGuard)
10 | @Post('auth/login')
11 | async login(@Request() req) {
12 | return this.authService.login(req.user);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/templates/server/graphql-apollo/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "1.0.0",
4 | "license": "MIT",
5 | "scripts": {
6 | "start": "ts-node src/index.ts",
7 | "dev": "tsnd --respawn src/index.ts",
8 | "build": "tsc",
9 | "serve": "node dist/index.js"
10 | },
11 | "dependencies": {
12 | "apollo-server": "^3.4.0",
13 | "graphql": "^15.6.1"
14 | },
15 | "devDependencies": {
16 | "ts-node": "^10.4.0",
17 | "ts-node-dev": "^1.1.8",
18 | "typescript": "^4.4.4"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/templates/server/graphql-apollo/gitignore:
--------------------------------------------------------------------------------
1 | # Ignore the compiled output.
2 | dist/
3 |
4 | # TypeScript incremental compilation cache
5 | *.tsbuildinfo
6 |
7 | # Logs
8 | logs
9 | *.log
10 | npm-debug.log*
11 | yarn-debug.log*
12 | yarn-error.log*
13 |
14 | # Coverage (from Jest)
15 | coverage/
16 |
17 | # JUnit Reports (used mainly in CircleCI)
18 | reports/
19 | junit.xml
20 |
21 | # Node modules
22 | node_modules/
23 |
24 | # Mac OS
25 | .DS_Store
26 |
27 | # Intellij Configuration Files
28 | .idea/
29 |
30 | # Local Netlify folder
31 | .netlify
--------------------------------------------------------------------------------
/templates/server/graphql-subscriptions/gitignore:
--------------------------------------------------------------------------------
1 | # Ignore the compiled output.
2 | dist/
3 |
4 | # TypeScript incremental compilation cache
5 | *.tsbuildinfo
6 |
7 | # Logs
8 | logs
9 | *.log
10 | npm-debug.log*
11 | yarn-debug.log*
12 | yarn-error.log*
13 |
14 | # Coverage (from Jest)
15 | coverage/
16 |
17 | # JUnit Reports (used mainly in CircleCI)
18 | reports/
19 | junit.xml
20 |
21 | # Node modules
22 | node_modules/
23 |
24 | # Mac OS
25 | .DS_Store
26 |
27 | # Intellij Configuration Files
28 | .idea/
29 |
30 | # Local Netlify folder
31 | .netlify
--------------------------------------------------------------------------------
/templates/server/graphql-nexus/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "1.0.0",
4 | "license": "MIT",
5 | "scripts": {
6 | "start": "ts-node src/index.ts",
7 | "dev": "tsnd --respawn src/index.ts",
8 | "build": "tsc",
9 | "serve": "node dist/index.js"
10 | },
11 | "dependencies": {
12 | "apollo-server": "^3.4.0",
13 | "graphql": "^15.6.1",
14 | "nexus": "^1.1.0"
15 | },
16 | "devDependencies": {
17 | "ts-node": "^10.4.0",
18 | "ts-node-dev": "^1.1.8",
19 | "typescript": "^4.4.4"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/gitignore:
--------------------------------------------------------------------------------
1 | # compiled output
2 | /dist
3 | /node_modules
4 |
5 | # Logs
6 | logs
7 | *.log
8 | npm-debug.log*
9 | pnpm-debug.log*
10 | yarn-debug.log*
11 | yarn-error.log*
12 | lerna-debug.log*
13 |
14 | # OS
15 | .DS_Store
16 |
17 | # Tests
18 | /coverage
19 | /.nyc_output
20 |
21 | # IDEs and editors
22 | /.idea
23 | .project
24 | .classpath
25 | .c9/
26 | *.launch
27 | .settings/
28 | *.sublime-workspace
29 |
30 | # IDE - VSCode
31 | .vscode/*
32 | !.vscode/settings.json
33 | !.vscode/tasks.json
34 | !.vscode/launch.json
35 | !.vscode/extensions.json
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/gitignore:
--------------------------------------------------------------------------------
1 | # compiled output
2 | /dist
3 | /node_modules
4 |
5 | # Logs
6 | logs
7 | *.log
8 | npm-debug.log*
9 | pnpm-debug.log*
10 | yarn-debug.log*
11 | yarn-error.log*
12 | lerna-debug.log*
13 |
14 | # OS
15 | .DS_Store
16 |
17 | # Tests
18 | /coverage
19 | /.nyc_output
20 |
21 | # IDEs and editors
22 | /.idea
23 | .project
24 | .classpath
25 | .c9/
26 | *.launch
27 | .settings/
28 | *.sublime-workspace
29 |
30 | # IDE - VSCode
31 | .vscode/*
32 | !.vscode/settings.json
33 | !.vscode/tasks.json
34 | !.vscode/launch.json
35 | !.vscode/extensions.json
--------------------------------------------------------------------------------
/templates/application/vue3/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "lib": ["DOM", "ES2020"],
5 | "module": "ESNext",
6 | "jsx": "react-jsx",
7 | "strict": true,
8 | "noEmit": true,
9 | "skipLibCheck": true,
10 | "isolatedModules": true,
11 | "resolveJsonModule": true,
12 | "moduleResolution": "bundler",
13 | "useDefineForClassFields": true,
14 | "allowImportingTsExtensions": true,
15 | "paths": {
16 | "*": ["./@mf-types/*"]
17 | }
18 | },
19 | "include": ["src"],
20 | "ts-node": {
21 | "compilerOptions": {
22 | "module": "CommonJS"
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/users/users.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@nestjs/common';
2 |
3 | export type User = {
4 | userId: number;
5 | username: string;
6 | password: string;
7 | };
8 |
9 | @Injectable()
10 | export class UsersService {
11 | private readonly users = [
12 | {
13 | userId: 1,
14 | username: 'sally',
15 | password: '123',
16 | },
17 | {
18 | userId: 2,
19 | username: 'maria',
20 | password: '123',
21 | },
22 | ];
23 |
24 | async findOne(username: string): Promise {
25 | return this.users.find((user) => user.username === username);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/templates/application/lit-html/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "lib": ["DOM", "ES2020"],
5 | "module": "ESNext",
6 | "jsx": "react-jsx",
7 | "strict": true,
8 | "noEmit": true,
9 | "skipLibCheck": true,
10 | "isolatedModules": true,
11 | "resolveJsonModule": true,
12 | "moduleResolution": "bundler",
13 | "useDefineForClassFields": true,
14 | "allowImportingTsExtensions": true,
15 | "paths": {
16 | "*": ["./@mf-types/*"]
17 | }
18 | },
19 | "include": ["src"],
20 | "ts-node": {
21 | "compilerOptions": {
22 | "module": "CommonJS"
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/templates/application/react-18/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "lib": ["DOM", "ES2020"],
5 | "module": "ESNext",
6 | "jsx": "react-jsx",
7 | "strict": true,
8 | "noEmit": true,
9 | "skipLibCheck": true,
10 | "isolatedModules": true,
11 | "resolveJsonModule": true,
12 | "moduleResolution": "bundler",
13 | "useDefineForClassFields": true,
14 | "allowImportingTsExtensions": true,
15 | "paths": {
16 | "*": ["./@mf-types/*"]
17 | }
18 | },
19 | "include": ["src"],
20 | "ts-node": {
21 | "compilerOptions": {
22 | "module": "CommonJS"
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/templates/application/react-19/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "lib": ["DOM", "ES2020"],
5 | "module": "ESNext",
6 | "jsx": "react-jsx",
7 | "strict": true,
8 | "noEmit": true,
9 | "skipLibCheck": true,
10 | "isolatedModules": true,
11 | "resolveJsonModule": true,
12 | "moduleResolution": "bundler",
13 | "useDefineForClassFields": true,
14 | "allowImportingTsExtensions": true,
15 | "paths": {
16 | "*": ["./@mf-types/*"]
17 | }
18 | },
19 | "include": ["src"],
20 | "ts-node": {
21 | "compilerOptions": {
22 | "module": "CommonJS"
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/templates/application/svelte/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "lib": ["DOM", "ES2020"],
5 | "module": "ESNext",
6 | "jsx": "react-jsx",
7 | "strict": true,
8 | "noEmit": true,
9 | "skipLibCheck": true,
10 | "isolatedModules": true,
11 | "resolveJsonModule": true,
12 | "moduleResolution": "bundler",
13 | "useDefineForClassFields": true,
14 | "allowImportingTsExtensions": true,
15 | "paths": {
16 | "*": ["./@mf-types/*"]
17 | }
18 | },
19 | "include": ["src"],
20 | "ts-node": {
21 | "compilerOptions": {
22 | "module": "CommonJS"
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/templates/application/vanilla/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "lib": ["DOM", "ES2020"],
5 | "module": "ESNext",
6 | "jsx": "react-jsx",
7 | "strict": true,
8 | "noEmit": true,
9 | "skipLibCheck": true,
10 | "isolatedModules": true,
11 | "resolveJsonModule": true,
12 | "moduleResolution": "bundler",
13 | "useDefineForClassFields": true,
14 | "allowImportingTsExtensions": true,
15 | "paths": {
16 | "*": ["./@mf-types/*"]
17 | }
18 | },
19 | "include": ["src"],
20 | "ts-node": {
21 | "compilerOptions": {
22 | "module": "CommonJS"
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "declaration": true,
5 | "removeComments": true,
6 | "emitDecoratorMetadata": true,
7 | "experimentalDecorators": true,
8 | "allowSyntheticDefaultImports": true,
9 | "target": "es2017",
10 | "sourceMap": true,
11 | "outDir": "./dist",
12 | "baseUrl": "./",
13 | "incremental": true,
14 | "skipLibCheck": true,
15 | "strictNullChecks": false,
16 | "noImplicitAny": false,
17 | "strictBindCallApply": false,
18 | "forceConsistentCasingInFileNames": false,
19 | "noFallthroughCasesInSwitch": false
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "declaration": true,
5 | "removeComments": true,
6 | "emitDecoratorMetadata": true,
7 | "experimentalDecorators": true,
8 | "allowSyntheticDefaultImports": true,
9 | "target": "es2017",
10 | "sourceMap": true,
11 | "outDir": "./dist",
12 | "baseUrl": "./",
13 | "incremental": true,
14 | "skipLibCheck": true,
15 | "strictNullChecks": false,
16 | "noImplicitAny": false,
17 | "strictBindCallApply": false,
18 | "forceConsistentCasingInFileNames": false,
19 | "noFallthroughCasesInSwitch": false
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/auth/jwt.strategy.ts:
--------------------------------------------------------------------------------
1 | import { ExtractJwt, Strategy } from 'passport-jwt';
2 | import { PassportStrategy } from '@nestjs/passport';
3 | import { Injectable } from '@nestjs/common';
4 |
5 | import { jwtConstants } from './constants';
6 |
7 | @Injectable()
8 | export class JwtStrategy extends PassportStrategy(Strategy) {
9 | constructor() {
10 | super({
11 | jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
12 | ignoreExpiration: false,
13 | secretOrKey: jwtConstants.secret,
14 | });
15 | }
16 |
17 | async validate(payload: any) {
18 | return { userId: payload.sub, username: payload.username };
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/templates/application/preact/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "lib": ["DOM", "ES2020"],
5 | "module": "ESNext",
6 | "jsx": "react-jsx",
7 | "jsxImportSource": "preact",
8 | "strict": true,
9 | "noEmit": true,
10 | "skipLibCheck": true,
11 | "isolatedModules": true,
12 | "resolveJsonModule": true,
13 | "moduleResolution": "bundler",
14 | "useDefineForClassFields": true,
15 | "allowImportingTsExtensions": true,
16 | "paths": {
17 | "*": ["./@mf-types/*"]
18 | }
19 | },
20 | "include": ["src"],
21 | "ts-node": {
22 | "compilerOptions": {
23 | "module": "CommonJS"
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/templates/application/solid-js/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "lib": ["DOM", "ES2020"],
5 | "module": "ESNext",
6 | "jsx": "react-jsx",
7 | "jsxImportSource": "preact",
8 | "strict": true,
9 | "noEmit": true,
10 | "skipLibCheck": true,
11 | "isolatedModules": true,
12 | "resolveJsonModule": true,
13 | "moduleResolution": "bundler",
14 | "useDefineForClassFields": true,
15 | "allowImportingTsExtensions": true,
16 | "paths": {
17 | "*": ["./@mf-types/*"]
18 | }
19 | },
20 | "include": ["src"],
21 | "ts-node": {
22 | "compilerOptions": {
23 | "module": "CommonJS"
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/auth/local.strategy.ts:
--------------------------------------------------------------------------------
1 | import { Strategy } from 'passport-local';
2 | import { PassportStrategy } from '@nestjs/passport';
3 | import { Injectable, UnauthorizedException } from '@nestjs/common';
4 | import { AuthService } from './auth.service';
5 |
6 | @Injectable()
7 | export class LocalStrategy extends PassportStrategy(Strategy) {
8 | constructor(private authService: AuthService) {
9 | super();
10 | }
11 |
12 | async validate(username: string, password: string): Promise {
13 | const user = await this.authService.validateUser(username, password);
14 | if (!user) {
15 | throw new UnauthorizedException();
16 | }
17 | return user;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/templates/server/graphql-apollo/src/index.ts:
--------------------------------------------------------------------------------
1 | import { ApolloServer, gql } from "apollo-server";
2 |
3 | const typeDefs = gql`
4 | type Book {
5 | title: String
6 | author: String
7 | }
8 |
9 | type Query {
10 | books: [Book]
11 | }
12 | `;
13 |
14 | const books = [
15 | {
16 | title: "The Awakening",
17 | author: "Kate Chopin",
18 | },
19 | {
20 | title: "City of Glass",
21 | author: "Paul Auster",
22 | },
23 | ];
24 |
25 | const resolvers = {
26 | Query: {
27 | books: () => books,
28 | },
29 | };
30 |
31 | const server = new ApolloServer({ typeDefs, resolvers });
32 |
33 | server.listen({ port: {{PORT}} }).then(({ url }) => {
34 | console.log(`🚀 {{NAME}} ready at ${url}`);
35 | });
36 |
--------------------------------------------------------------------------------
/templates/server/graphql-subscriptions/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "1.0.0",
4 | "main": "index.js",
5 | "license": "MIT",
6 | "scripts": {
7 | "start": "ts-node src/index.ts",
8 | "dev": "tsnd --respawn src/index.ts",
9 | "build": "tsc",
10 | "serve": "node dist/index.js"
11 | },
12 | "dependencies": {
13 | "@graphql-tools/schema": "^7.1.5",
14 | "apollo-server-express": "3.1.2",
15 | "express": "^4.17.1",
16 | "graphql": "^15.5.1",
17 | "graphql-subscriptions": "^1.2.1",
18 | "subscriptions-transport-ws": "^0.9.19"
19 | },
20 | "devDependencies": {
21 | "ts-node": "^10.4.0",
22 | "ts-node-dev": "^1.1.8",
23 | "typescript": "^4.4.4"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/templates/application/lit-html/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "0.0.1",
4 | "scripts": {
5 | "build": "NODE_ENV=production rspack build",
6 | "build:dev": "NODE_ENV=development rspack build",
7 | "build:start": "cd dist && rspack serve",
8 | "start": "NODE_ENV=development rspack serve"
9 | },
10 | "devDependencies": {
11 | "@rspack/cli": "~1.2.0",
12 | "@rspack/core": "~1.2.0",
13 | "autoprefixer": "^10.1.0",
14 | "css-loader": "^7.1.2",
15 | "postcss": "^8.2.1",
16 | "postcss-loader": "^8.0.0",
17 | "ts-node": "^10.9.2",
18 | "typescript": "^5.7.3"
19 | },
20 | "dependencies": {
21 | "@module-federation/enhanced": "^0.8.9",
22 | "lit-html": "^2.0.1"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | parser: '@typescript-eslint/parser',
3 | parserOptions: {
4 | project: 'tsconfig.json',
5 | sourceType: 'module',
6 | },
7 | plugins: ['@typescript-eslint/eslint-plugin'],
8 | extends: [
9 | 'plugin:@typescript-eslint/recommended',
10 | 'plugin:prettier/recommended',
11 | ],
12 | root: true,
13 | env: {
14 | node: true,
15 | jest: true,
16 | },
17 | ignorePatterns: ['.eslintrc.js'],
18 | rules: {
19 | '@typescript-eslint/interface-name-prefix': 'off',
20 | '@typescript-eslint/explicit-function-return-type': 'off',
21 | '@typescript-eslint/explicit-module-boundary-types': 'off',
22 | '@typescript-eslint/no-explicit-any': 'off',
23 | },
24 | };
25 |
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | parser: '@typescript-eslint/parser',
3 | parserOptions: {
4 | project: 'tsconfig.json',
5 | sourceType: 'module',
6 | },
7 | plugins: ['@typescript-eslint/eslint-plugin'],
8 | extends: [
9 | 'plugin:@typescript-eslint/recommended',
10 | 'plugin:prettier/recommended',
11 | ],
12 | root: true,
13 | env: {
14 | node: true,
15 | jest: true,
16 | },
17 | ignorePatterns: ['.eslintrc.js'],
18 | rules: {
19 | '@typescript-eslint/interface-name-prefix': 'off',
20 | '@typescript-eslint/explicit-function-return-type': 'off',
21 | '@typescript-eslint/explicit-module-boundary-types': 'off',
22 | '@typescript-eslint/no-explicit-any': 'off',
23 | },
24 | };
25 |
--------------------------------------------------------------------------------
/templates/application/vanilla/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "0.0.1",
4 | "scripts": {
5 | "build": "NODE_ENV=production rspack build",
6 | "build:dev": "NODE_ENV=development rspack build",
7 | "build:start": "cd dist && rspack serve",
8 | "start": "NODE_ENV=development rspack serve"
9 | },
10 | "devDependencies": {
11 | "@rspack/cli": "~1.2.0",
12 | "@rspack/core": "~1.2.0",
13 | "@rspack/plugin-react-refresh": "~1.0.1",
14 | "autoprefixer": "^10.1.0",
15 | "css-loader": "^7.1.2",
16 | "postcss": "^8.2.1",
17 | "postcss-loader": "^8.0.0",
18 | "ts-node": "^10.9.2",
19 | "typescript": "^5.7.3"
20 | },
21 | "dependencies": {
22 | "@module-federation/enhanced": "^0.8.9"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/test/app.e2e-spec.ts:
--------------------------------------------------------------------------------
1 | import { Test, TestingModule } from '@nestjs/testing';
2 | import { INestApplication } from '@nestjs/common';
3 | import * as request from 'supertest';
4 | import { AppModule } from './../src/app.module';
5 |
6 | describe('AppController (e2e)', () => {
7 | let app: INestApplication;
8 |
9 | beforeEach(async () => {
10 | const moduleFixture: TestingModule = await Test.createTestingModule({
11 | imports: [AppModule],
12 | }).compile();
13 |
14 | app = moduleFixture.createNestApplication();
15 | await app.init();
16 | });
17 |
18 | it('/ (GET)', () => {
19 | return request(app.getHttpServer())
20 | .get('/')
21 | .expect(200)
22 | .expect('Hello World!');
23 | });
24 | });
25 |
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/test/app.e2e-spec.ts:
--------------------------------------------------------------------------------
1 | import { Test, TestingModule } from '@nestjs/testing';
2 | import { INestApplication } from '@nestjs/common';
3 | import * as request from 'supertest';
4 | import { AppModule } from './../src/app.module';
5 |
6 | describe('AppController (e2e)', () => {
7 | let app: INestApplication;
8 |
9 | beforeEach(async () => {
10 | const moduleFixture: TestingModule = await Test.createTestingModule({
11 | imports: [AppModule],
12 | }).compile();
13 |
14 | app = moduleFixture.createNestApplication();
15 | await app.init();
16 | });
17 |
18 | it('/ (GET)', () => {
19 | return request(app.getHttpServer())
20 | .get('/')
21 | .expect(200)
22 | .expect('Hello World!');
23 | });
24 | });
25 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/auth/auth.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { PassportModule } from '@nestjs/passport';
3 | import { JwtModule } from '@nestjs/jwt';
4 |
5 | import { AuthService } from './auth.service';
6 | import { LocalStrategy } from './local.strategy';
7 | import { JwtStrategy } from './jwt.strategy';
8 | import { UsersModule } from '../users/users.module';
9 | import { jwtConstants } from './constants';
10 |
11 | @Module({
12 | imports: [
13 | UsersModule,
14 | PassportModule,
15 | JwtModule.register({
16 | secret: jwtConstants.secret,
17 | signOptions: { expiresIn: '24h' },
18 | }),
19 | ],
20 | providers: [AuthService, LocalStrategy, JwtStrategy],
21 | exports: [AuthService],
22 | })
23 | export class AuthModule {}
24 |
--------------------------------------------------------------------------------
/templates/server/graphql-nexus/src/index.ts:
--------------------------------------------------------------------------------
1 | import { ApolloServer } from "apollo-server";
2 | import { queryType, stringArg, makeSchema } from "nexus";
3 | import * as path from "path";
4 |
5 | const Query = queryType({
6 | definition(t) {
7 | t.string("hello", {
8 | args: { name: stringArg() },
9 | resolve: (parent, { name }) => `Hello ${name || "World"}!`,
10 | });
11 | },
12 | });
13 |
14 | const schema = makeSchema({
15 | types: [Query],
16 | outputs: {
17 | schema: path.join(__dirname, "/generated/schema.graphql"),
18 | typegen: path.join(__dirname, "/generated/typings.ts"),
19 | },
20 | });
21 |
22 | const server = new ApolloServer({ schema });
23 |
24 | server.listen({ port: {{PORT}} }).then(({ url }) => {
25 | console.log(`🚀 {{NAME}} ready at ${url}`);
26 | });
27 |
--------------------------------------------------------------------------------
/templates/application/svelte/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "0.0.1",
4 | "scripts": {
5 | "build": "NODE_ENV=production rspack build",
6 | "build:dev": "NODE_ENV=development rspack build",
7 | "build:start": "cd dist && rspack serve",
8 | "start": "NODE_ENV=development rspack serve"
9 | },
10 | "devDependencies": {
11 | "@rspack/cli": "~1.2.0",
12 | "@rspack/core": "~1.2.0",
13 | "autoprefixer": "^10.1.0",
14 | "css-loader": "^7.1.2",
15 | "postcss": "^8.2.1",
16 | "postcss-loader": "^8.0.0",
17 | "svelte-loader": "^3.1.9",
18 | "svelte-preprocess": "^5.1.3",
19 | "ts-node": "^10.9.2",
20 | "typescript": "^5.7.3"
21 | },
22 | "dependencies": {
23 | "@module-federation/enhanced": "^0.8.9",
24 | "svelte": "^4.2.9"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/app.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { ServeStaticModule } from '@nestjs/serve-static';
3 | import { join } from 'path';
4 |
5 | import { AuthorizedModule } from './modules/authorized/authorized.module';
6 | import { UnauthorizedModule } from './modules/unauthorized/unauthorized.module';
7 | import { AppController } from './app.controller';
8 | import { AuthModule } from './auth/auth.module';
9 | import { UsersService } from './users/users.service';
10 |
11 | @Module({
12 | controllers: [AppController],
13 | providers: [UsersService],
14 | imports: [
15 | ServeStaticModule.forRoot({
16 | rootPath: join(__dirname, '..', 'public'),
17 | }),
18 | AuthorizedModule,
19 | UnauthorizedModule,
20 | AuthModule,
21 | ],
22 | })
23 | export class AppModule {}
24 |
--------------------------------------------------------------------------------
/templates/application/preact/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "0.0.1",
4 | "scripts": {
5 | "build": "NODE_ENV=production rspack build",
6 | "build:dev": "NODE_ENV=development rspack build",
7 | "build:start": "cd dist && rspack serve",
8 | "start": "NODE_ENV=development rspack serve"
9 | },
10 | "devDependencies": {
11 | "@rspack/cli": "~1.2.0",
12 | "@rspack/core": "~1.2.0",
13 | "@rspack/plugin-react-refresh": "~1.0.1",
14 | "autoprefixer": "^10.1.0",
15 | "css-loader": "^7.1.2",
16 | "postcss": "^8.2.1",
17 | "postcss-loader": "^8.0.0",
18 | "react-refresh": "^0.14.0",
19 | "ts-node": "^10.9.2",
20 | "typescript": "^5.7.3"
21 | },
22 | "dependencies": {
23 | "@module-federation/enhanced": "^0.8.9",
24 | "preact": "^10.5.14",
25 | "preact-jsx-runtime": "^1.2.0"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/src/auth/auth.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@nestjs/common';
2 | import { JwtService } from '@nestjs/jwt';
3 |
4 | import { UsersService } from '../users/users.service';
5 |
6 | @Injectable()
7 | export class AuthService {
8 | constructor(
9 | private usersService: UsersService,
10 | private jwtService: JwtService,
11 | ) {}
12 |
13 | async validateUser(username: string, pass: string): Promise {
14 | const user = await this.usersService.findOne(username);
15 | if (user && user.password === pass) {
16 | const { password, ...result } = user;
17 | return result;
18 | }
19 | return null;
20 | }
21 |
22 | async login(user: any) {
23 | const payload = { username: user.username, sub: user.userId };
24 | return {
25 | access_token: this.jwtService.sign(payload),
26 | };
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/templates/application/vue3/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "0.0.1",
4 | "scripts": {
5 | "build": "NODE_ENV=production rspack build",
6 | "build:dev": "NODE_ENV=development rspack build",
7 | "build:start": "cd dist && rspack serve",
8 | "start": "NODE_ENV=development rspack serve"
9 | },
10 | "devDependencies": {
11 | "@babel/preset-env": "^7.23.8",
12 | "@babel/preset-typescript": "^7.23.3",
13 | "@rspack/cli": "~1.2.0",
14 | "@rspack/core": "~1.2.0",
15 | "autoprefixer": "^10.1.0",
16 | "css-loader": "^7.1.2",
17 | "postcss": "^8.2.1",
18 | "postcss-loader": "^8.0.0",
19 | "ts-node": "^10.9.2",
20 | "typescript": "^5.7.3",
21 | "vue-loader": "^16.8.1",
22 | "vue-template-compiler": "^2.6.14"
23 | },
24 | "dependencies": {
25 | "@module-federation/enhanced": "^0.8.9",
26 | "vue": "^3.2.19"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/templates/application/react-18/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "0.0.1",
4 | "scripts": {
5 | "build": "NODE_ENV=production rspack build",
6 | "build:dev": "NODE_ENV=development rspack build",
7 | "build:start": "cd dist && rspack serve",
8 | "start": "NODE_ENV=development rspack serve"
9 | },
10 | "devDependencies": {
11 | "@rspack/cli": "~1.2.0",
12 | "@rspack/core": "~1.2.0",
13 | "@rspack/plugin-react-refresh": "~1.0.1",
14 | "@types/react": "^18.2.0",
15 | "@types/react-dom": "^18.2.0",
16 | "autoprefixer": "^10.1.0",
17 | "css-loader": "^7.1.2",
18 | "postcss": "^8.2.1",
19 | "postcss-loader": "^8.0.0",
20 | "react-refresh": "^0.14.0",
21 | "ts-node": "^10.9.2",
22 | "typescript": "^5.7.3"
23 | },
24 | "dependencies": {
25 | "@module-federation/enhanced": "^0.8.9",
26 | "react": "^18.2.0",
27 | "react-dom": "^18.2.0"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/templates/application/react-19/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "0.0.1",
4 | "scripts": {
5 | "build": "NODE_ENV=production rspack build",
6 | "build:dev": "NODE_ENV=development rspack build",
7 | "build:start": "cd dist && rspack serve",
8 | "start": "NODE_ENV=development rspack serve"
9 | },
10 | "devDependencies": {
11 | "@rspack/cli": "~1.2.0",
12 | "@rspack/core": "~1.2.0",
13 | "@rspack/plugin-react-refresh": "~1.0.1",
14 | "@types/react": "^19.0.0",
15 | "@types/react-dom": "^19.0.0",
16 | "autoprefixer": "^10.1.0",
17 | "css-loader": "^7.1.2",
18 | "postcss": "^8.2.1",
19 | "postcss-loader": "^8.0.0",
20 | "react-refresh": "^0.14.0",
21 | "ts-node": "^10.9.2",
22 | "typescript": "^5.7.3"
23 | },
24 | "dependencies": {
25 | "@module-federation/enhanced": "^0.8.9",
26 | "react": "^19.0.0",
27 | "react-dom": "^19.0.0"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/templates/application/solid-js/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "0.0.1",
4 | "scripts": {
5 | "build": "NODE_ENV=production rspack build",
6 | "build:dev": "NODE_ENV=development rspack build",
7 | "build:start": "cd dist && rspack serve",
8 | "start": "NODE_ENV=development rspack serve"
9 | },
10 | "devDependencies": {
11 | "@rspack/cli": "~1.2.0",
12 | "@rspack/core": "~1.2.0",
13 | "@babel/plugin-transform-runtime": "^7.23.7",
14 | "@babel/preset-env": "^7.23.8",
15 | "@babel/preset-typescript": "^7.23.3",
16 | "autoprefixer": "^10.1.0",
17 | "babel-loader": "^9.1.3",
18 | "babel-preset-solid": "^1.8.9",
19 | "css-loader": "^7.1.2",
20 | "postcss": "^8.2.1",
21 | "postcss-loader": "^8.0.0",
22 | "solid-refresh": "^0.6.3",
23 | "ts-node": "^10.9.2",
24 | "typescript": "^5.7.3"
25 | },
26 | "dependencies": {
27 | "@module-federation/enhanced": "^0.8.9",
28 | "solid-js": "^1.8.11"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Jack Herrington
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "create-mf-app",
3 | "version": "2.0.3",
4 | "description": "Create Module Federation apps",
5 | "main": "src/index.js",
6 | "bin": "bin/create-mf-app.js",
7 | "scripts": {
8 | "start": "tsc && node bin/create-mf-app.js",
9 | "build": "tsc",
10 | "lint": "eslint --fix",
11 | "prepare": "husky install",
12 | "test": "vitest run",
13 | "test:watch": "vitest watch"
14 | },
15 | "author": "Jack Herrington",
16 | "license": "MIT",
17 | "dependencies": {
18 | "@clack/prompts": "^0.9.1",
19 | "commander": "^13.1.0",
20 | "ejs": "^3.1.10",
21 | "glob": "^11.0.1"
22 | },
23 | "devDependencies": {
24 | "@types/ejs": "^3.1.5",
25 | "@types/glob": "^8.1.0",
26 | "@types/node": "^22.13.0",
27 | "@typescript-eslint/eslint-plugin": "^7.7.0",
28 | "@typescript-eslint/parser": "^7.7.0",
29 | "eslint": "^9.19.0",
30 | "globals": "^15.14.0",
31 | "husky": "^7.0.4",
32 | "prettier": "^3.4.2",
33 | "ts-node": "^10.9.2",
34 | "typescript": "^4.5.3",
35 | "typescript-eslint": "^8.22.0",
36 | "vitest": "^1.4.0"
37 | },
38 | "packageManager": "pnpm@9.1.4"
39 | }
40 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/README.md:
--------------------------------------------------------------------------------
1 | Static files are served out of the public directory.
2 |
3 | ```
4 | $ curl http://localhost:{{PORT}}/placeholder.txt
5 | $ # result -> Put your static files in this directory and then delete this file.
6 | ```
7 |
8 | You can have un-authorized routes.
9 |
10 | ```
11 | $ curl http://localhost:{{PORT}}/unauthorized
12 | $ # result -> true
13 | ```
14 |
15 | Trying authorized routes without a JWT will result in a 401.
16 |
17 | ```
18 | $ curl http://localhost:{{PORT}}/authorized
19 | $ # result -> {"statusCode":401,"message":"Unauthorized"}
20 | ```
21 |
22 | Use the `/auth/login` route to login.
23 |
24 | ```
25 | $ # POST /auth/login
26 | $ curl -X POST http://localhost:{{PORT}}/auth/login -d '{"username": "maria", "password": "123"}' -H "Content-Type: application/json"
27 | $ # result -> {"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2Vybm... }
28 | ```
29 |
30 | Send the JWT to authorized routes using the `Authorization` header and prefixing the JWT with `Bearer `.
31 |
32 | ```
33 | $ # GET /profile using access_token returned from previous step as bearer code
34 | $ curl http://localhost:{{PORT}}/authorized -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2Vybm..."
35 | $ # result -> {"userId":2}
36 | ```
37 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # create-mf-app
2 |
3 | [](https://badge.fury.io/js/create-mf-app) [](https://badge.fury.io/js/create-mf-app)
4 |
5 | Creates a Module Federation application, API server, or library based on one of multiple different templates.
6 |
7 | ## Usage
8 |
9 | ```shell
10 | npx create-mf-app
11 | ```
12 |
13 | These projects are not production complete. They are designed as lightweight projects that can be used to quickly prototype a new feature or library.
14 |
15 | ## CLI Usage
16 |
17 | Without any arguments, the CLI will prompt you for the information required to create the project.
18 |
19 | ```shell
20 | npx create-mf-app@latest
21 | ```
22 |
23 | You can also get help for the CLI for the options available.
24 |
25 | ```shell
26 | npx create-mf-app@latest --help
27 | ```
28 |
29 | You can create an application using CLI options:
30 |
31 | ```shell
32 | npx create-mf-app@latest --name my-remote --port 8080 --css Tailwind --template react-19
33 | ```
34 |
35 | Shorthand versions of each option are also available:
36 |
37 | ```shell
38 | npx create-mf-app@latest -n my-remote -p 8080 -c Tailwind -t react-19
39 | ```
40 |
41 | ## Programmatic Usage
42 |
43 | ```js
44 | const { buildProject } = require("create-mf-app");
45 |
46 | buildProject({
47 | type: "Application",
48 | name: "my-remote",
49 | port: "8080",
50 | framework: "react-19",
51 | css: "Tailwind",
52 | });
53 | ```
54 |
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/src/modules/todos/todo.controller.ts:
--------------------------------------------------------------------------------
1 | import {
2 | Controller,
3 | Get,
4 | Post,
5 | Put,
6 | Delete,
7 | Body,
8 | Param,
9 | HttpCode,
10 | } from '@nestjs/common';
11 |
12 | interface Todo {
13 | id: number;
14 | text: string;
15 | active: boolean;
16 | done: boolean;
17 | }
18 |
19 | let todos: Todo[] = [
20 | 'NestJS',
21 | 'GraphQL',
22 | 'Apollo',
23 | 'TypeScript',
24 | 'React',
25 | 'Redux',
26 | 'React Query',
27 | 'Angular',
28 | 'Vue',
29 | 'D3',
30 | 'Svelte',
31 | 'SolidJS',
32 | 'NextJS',
33 | 'AWS',
34 | ].map((text, index) => ({
35 | id: index + 1,
36 | text: `Learn ${text}`,
37 | active: true,
38 | done: false,
39 | }));
40 |
41 | @Controller('todos')
42 | export class TodosController {
43 | constructor() {}
44 |
45 | @Get()
46 | async index(): Promise {
47 | return todos.filter(({ active }) => active);
48 | }
49 |
50 | @Get(':id')
51 | async show(@Param('id') id: string): Promise {
52 | return todos.find((todo) => todo.id === parseInt(id));
53 | }
54 |
55 | @Post()
56 | async create(@Body() { text }: { text: string }): Promise {
57 | const todo = {
58 | id: todos.length + 1,
59 | text,
60 | active: true,
61 | done: false,
62 | };
63 | todos.push(todo);
64 | return todo;
65 | }
66 |
67 | @Put(':id')
68 | async update(@Param('id') id: string, @Body() data: Todo): Promise {
69 | todos = todos.map((todo) =>
70 | todo.id === parseInt(id) ? { ...todo, ...data } : todo,
71 | );
72 |
73 | return data;
74 | }
75 |
76 | @Delete(':id')
77 | @HttpCode(204)
78 | async destroy(@Param('id') id: string): Promise {
79 | todos = todos.map((todo) =>
80 | todo.id === parseInt(id) ? { ...todo, active: false } : todo,
81 | );
82 | return parseInt(id);
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/templates/server/graphql-subscriptions/src/index.ts:
--------------------------------------------------------------------------------
1 | import { createServer } from "http";
2 | import express from "express";
3 | import { execute, subscribe } from "graphql";
4 | import { ApolloServer, gql } from "apollo-server-express";
5 | import { PubSub } from "graphql-subscriptions";
6 | import { SubscriptionServer } from "subscriptions-transport-ws";
7 | import { makeExecutableSchema } from "@graphql-tools/schema";
8 |
9 | (async () => {
10 | const PORT = {{PORT}};
11 | const pubsub = new PubSub();
12 | const app = express();
13 | const httpServer = createServer(app);
14 |
15 | // Schema definition
16 | const typeDefs = gql`
17 | type Query {
18 | currentNumber: Int
19 | }
20 |
21 | type Subscription {
22 | numberIncremented: Int
23 | }
24 | `;
25 |
26 | // Resolver map
27 | const resolvers = {
28 | Query: {
29 | currentNumber() {
30 | return currentNumber;
31 | },
32 | },
33 | Subscription: {
34 | numberIncremented: {
35 | subscribe: () => pubsub.asyncIterator(["NUMBER_INCREMENTED"]),
36 | },
37 | },
38 | };
39 |
40 | const schema = makeExecutableSchema({ typeDefs, resolvers });
41 |
42 | const server = new ApolloServer({
43 | schema,
44 | });
45 | await server.start();
46 | server.applyMiddleware({ app });
47 |
48 | SubscriptionServer.create(
49 | { schema, execute, subscribe },
50 | { server: httpServer, path: server.graphqlPath }
51 | );
52 |
53 | httpServer.listen(PORT, () => {
54 | console.log(
55 | `🚀 {{NAME}} Query endpoint ready at http://localhost:${PORT}${server.graphqlPath}`
56 | );
57 | console.log(
58 | `🚀 {{NAME}} Subscription endpoint ready at ws://localhost:${PORT}${server.graphqlPath}`
59 | );
60 | });
61 |
62 | let currentNumber = 0;
63 | function incrementNumber() {
64 | currentNumber++;
65 | pubsub.publish("NUMBER_INCREMENTED", { numberIncremented: currentNumber });
66 | setTimeout(incrementNumber, 1000);
67 | }
68 | // Start incrementing
69 | incrementNumber();
70 | })();
71 |
--------------------------------------------------------------------------------
/templates/application/solid-js/rspack.config.ts.ejs:
--------------------------------------------------------------------------------
1 | import * as path from "node:path";
2 | import { defineConfig } from "@rspack/cli";
3 | import { rspack } from "@rspack/core";
4 | import { ModuleFederationPlugin } from "@module-federation/enhanced/rspack";
5 |
6 | import { mfConfig } from "./module-federation.config";
7 |
8 | const isDev = process.env.NODE_ENV === "development";
9 |
10 | // Target browsers, see: https://github.com/browserslist/browserslist
11 | const targets = ["chrome >= 87", "edge >= 88", "firefox >= 78", "safari >= 14"];
12 |
13 | export default defineConfig({
14 | context: __dirname,
15 | entry: {
16 | main: "./src/index.ts",
17 | },
18 | resolve: {
19 | extensions: ["...", ".ts", ".tsx", ".jsx"],
20 | },
21 |
22 | devServer: {
23 | port: <%= PORT %>,
24 | historyApiFallback: true,
25 | watchFiles: [path.resolve(__dirname, "src")],
26 | },
27 | output: {
28 | // You need to set a unique value that is not equal to other applications
29 | uniqueName: "<%= SAFE_NAME %>",
30 | // publicPath must be configured if using manifest
31 | publicPath: "http://localhost:<%= PORT %>/",
32 | },
33 |
34 | experiments: {
35 | css: true,
36 | },
37 |
38 | module: {
39 | rules: [
40 | {
41 | test: /\.svg$/,
42 | type: "asset",
43 | },
44 | {
45 | test: /\.css$/,
46 | use: ["postcss-loader"],
47 | type: "css",
48 | },
49 | {
50 | test: /\.jsx|\.tsx$/,
51 | use: [
52 | {
53 | loader: 'babel-loader',
54 | options: {
55 | presets: [['solid']],
56 | plugins: ['solid-refresh/babel'],
57 | },
58 | },
59 | ],
60 | },
61 | ],
62 | },
63 | plugins: [
64 | new rspack.HtmlRspackPlugin({
65 | template: "./index.html",
66 | }),
67 | new ModuleFederationPlugin(mfConfig),
68 | ].filter(Boolean),
69 | optimization: {
70 | minimizer: [
71 | new rspack.SwcJsMinimizerRspackPlugin(),
72 | new rspack.LightningCssMinimizerRspackPlugin({
73 | minimizerOptions: { targets },
74 | }),
75 | ],
76 | },
77 | });
78 |
--------------------------------------------------------------------------------
/templates/application/lit-html/rspack.config.ts.ejs:
--------------------------------------------------------------------------------
1 | import * as path from "node:path";
2 | import { defineConfig } from "@rspack/cli";
3 | import { rspack } from "@rspack/core";
4 | import { ModuleFederationPlugin } from "@module-federation/enhanced/rspack";
5 |
6 | import { mfConfig } from "./module-federation.config";
7 |
8 | // Target browsers, see: https://github.com/browserslist/browserslist
9 | const targets = ["chrome >= 87", "edge >= 88", "firefox >= 78", "safari >= 14"];
10 |
11 | export default defineConfig({
12 | context: __dirname,
13 | entry: {
14 | main: "./src/index.ts",
15 | },
16 | resolve: {
17 | extensions: ["...", ".ts", ".tsx", ".jsx"],
18 | },
19 |
20 | devServer: {
21 | port: <%= PORT %>,
22 | historyApiFallback: true,
23 | watchFiles: [path.resolve(__dirname, "src")],
24 | },
25 | output: {
26 | // You need to set a unique value that is not equal to other applications
27 | uniqueName: "<%= SAFE_NAME %>",
28 | // publicPath must be configured if using manifest
29 | publicPath: "http://localhost:<%= PORT %>/",
30 | },
31 |
32 | experiments: {
33 | css: true,
34 | },
35 |
36 | module: {
37 | rules: [
38 | {
39 | test: /\.svg$/,
40 | type: "asset",
41 | },
42 | {
43 | test: /\.css$/,
44 | use: ["postcss-loader"],
45 | type: "css",
46 | },
47 | {
48 | test: /\.(jsx?|tsx?)$/,
49 | use: [
50 | {
51 | loader: "builtin:swc-loader",
52 | options: {
53 | jsc: {
54 | parser: {
55 | syntax: "typescript",
56 | tsx: true,
57 | },
58 | },
59 | env: { targets },
60 | },
61 | },
62 | ],
63 | },
64 | ],
65 | },
66 | plugins: [
67 | new rspack.HtmlRspackPlugin({
68 | template: "./index.html",
69 | }),
70 | new ModuleFederationPlugin(mfConfig),
71 | ].filter(Boolean),
72 | optimization: {
73 | minimizer: [
74 | new rspack.SwcJsMinimizerRspackPlugin(),
75 | new rspack.LightningCssMinimizerRspackPlugin({
76 | minimizerOptions: { targets },
77 | }),
78 | ],
79 | },
80 | });
81 |
--------------------------------------------------------------------------------
/templates/application/vanilla/rspack.config.ts.ejs:
--------------------------------------------------------------------------------
1 | import * as path from "node:path";
2 | import { defineConfig } from "@rspack/cli";
3 | import { rspack } from "@rspack/core";
4 | import { ModuleFederationPlugin } from "@module-federation/enhanced/rspack";
5 |
6 | import { mfConfig } from "./module-federation.config";
7 |
8 | const isDev = process.env.NODE_ENV === "development";
9 |
10 | // Target browsers, see: https://github.com/browserslist/browserslist
11 | const targets = ["chrome >= 87", "edge >= 88", "firefox >= 78", "safari >= 14"];
12 |
13 | export default defineConfig({
14 | context: __dirname,
15 | entry: {
16 | main: "./src/index.ts",
17 | },
18 | resolve: {
19 | extensions: ["...", ".ts", ".tsx", ".jsx"],
20 | },
21 |
22 | devServer: {
23 | port: <%= PORT %>,
24 | historyApiFallback: true,
25 | watchFiles: [path.resolve(__dirname, "src")],
26 | },
27 |
28 | output: {
29 | // You need to set a unique value that is not equal to other applications
30 | uniqueName: "<%= SAFE_NAME %>",
31 | // publicPath must be configured if using manifest
32 | publicPath: "http://localhost:<%= PORT %>/",
33 | },
34 |
35 | experiments: {
36 | css: true,
37 | },
38 |
39 | module: {
40 | rules: [
41 | {
42 | test: /\.svg$/,
43 | type: "asset",
44 | },
45 | {
46 | test: /\.css$/,
47 | use: ["postcss-loader"],
48 | type: "css",
49 | },
50 | {
51 | test: /\.(jsx?|tsx?)$/,
52 | use: [
53 | {
54 | loader: "builtin:swc-loader",
55 | options: {
56 | jsc: {
57 | parser: {
58 | syntax: "typescript",
59 | tsx: true,
60 | },
61 | },
62 | env: { targets },
63 | },
64 | },
65 | ],
66 | },
67 | ],
68 | },
69 | plugins: [
70 | new rspack.HtmlRspackPlugin({
71 | template: "./index.html",
72 | }),
73 | new ModuleFederationPlugin(mfConfig),
74 | ].filter(Boolean),
75 | optimization: {
76 | minimizer: [
77 | new rspack.SwcJsMinimizerRspackPlugin(),
78 | new rspack.LightningCssMinimizerRspackPlugin({
79 | minimizerOptions: { targets },
80 | }),
81 | ],
82 | },
83 | });
84 |
--------------------------------------------------------------------------------
/templates/server/nestjs-todo/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "1.0.0",
4 | "description": "",
5 | "author": "",
6 | "private": true,
7 | "license": "UNLICENSED",
8 | "scripts": {
9 | "prebuild": "rimraf dist",
10 | "build": "nest build",
11 | "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
12 | "start": "nest start",
13 | "start:dev": "nest start --watch",
14 | "start:debug": "nest start --debug --watch",
15 | "start:prod": "node dist/main",
16 | "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
17 | "test": "jest",
18 | "test:watch": "jest --watch",
19 | "test:cov": "jest --coverage",
20 | "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
21 | "test:e2e": "jest --config ./test/jest-e2e.json"
22 | },
23 | "dependencies": {
24 | "@nestjs/common": "^8.0.0",
25 | "@nestjs/core": "^8.0.0",
26 | "@nestjs/platform-express": "^8.0.0",
27 | "class-validator": "^0.13.1",
28 | "reflect-metadata": "^0.1.13",
29 | "rimraf": "^3.0.2",
30 | "rxjs": "^7.2.0"
31 | },
32 | "devDependencies": {
33 | "@nestjs/cli": "^8.0.0",
34 | "@nestjs/schematics": "^8.0.0",
35 | "@nestjs/testing": "^8.0.0",
36 | "@types/express": "^4.17.13",
37 | "@types/jest": "^27.0.1",
38 | "@types/node": "^16.0.0",
39 | "@types/supertest": "^2.0.11",
40 | "@typescript-eslint/eslint-plugin": "^4.28.2",
41 | "@typescript-eslint/parser": "^4.28.2",
42 | "eslint": "^7.30.0",
43 | "eslint-config-prettier": "^8.3.0",
44 | "eslint-plugin-prettier": "^3.4.0",
45 | "jest": "^27.0.6",
46 | "prettier": "^2.3.2",
47 | "supertest": "^6.1.3",
48 | "ts-jest": "^27.0.3",
49 | "ts-loader": "^9.2.3",
50 | "ts-node": "^10.0.0",
51 | "tsconfig-paths": "^3.10.1",
52 | "typescript": "^4.3.5"
53 | },
54 | "jest": {
55 | "moduleFileExtensions": [
56 | "js",
57 | "json",
58 | "ts"
59 | ],
60 | "rootDir": "src",
61 | "testRegex": ".*\\.spec\\.ts$",
62 | "transform": {
63 | "^.+\\.(t|j)s$": "ts-jest"
64 | },
65 | "collectCoverageFrom": [
66 | "**/*.(t|j)s"
67 | ],
68 | "coverageDirectory": "../coverage",
69 | "testEnvironment": "node"
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/templates/application/preact/gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # Snowpack dependency directory (https://snowpack.dev/)
45 | web_modules/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 | .parcel-cache
78 |
79 | # Next.js build output
80 | .next
81 | out
82 |
83 | # Nuxt.js build / generate output
84 | .nuxt
85 | dist
86 |
87 | # Gatsby files
88 | .cache/
89 | # Comment in the public line in if your project uses Gatsby and not Next.js
90 | # https://nextjs.org/blog/next-9-1#public-directory-support
91 | # public
92 |
93 | # vuepress build output
94 | .vuepress/dist
95 |
96 | # Serverless directories
97 | .serverless/
98 |
99 | # FuseBox cache
100 | .fusebox/
101 |
102 | # DynamoDB Local files
103 | .dynamodb/
104 |
105 | # TernJS port file
106 | .tern-port
107 |
108 | # Stores VSCode versions used for testing VSCode extensions
109 | .vscode-test
110 |
111 | # yarn v2
112 | .yarn/cache
113 | .yarn/unplugged
114 | .yarn/build-state.yml
115 | .yarn/install-state.gz
116 | .pnp.*
117 |
--------------------------------------------------------------------------------
/templates/application/svelte/gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # Snowpack dependency directory (https://snowpack.dev/)
45 | web_modules/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 | .parcel-cache
78 |
79 | # Next.js build output
80 | .next
81 | out
82 |
83 | # Nuxt.js build / generate output
84 | .nuxt
85 | dist
86 |
87 | # Gatsby files
88 | .cache/
89 | # Comment in the public line in if your project uses Gatsby and not Next.js
90 | # https://nextjs.org/blog/next-9-1#public-directory-support
91 | # public
92 |
93 | # vuepress build output
94 | .vuepress/dist
95 |
96 | # Serverless directories
97 | .serverless/
98 |
99 | # FuseBox cache
100 | .fusebox/
101 |
102 | # DynamoDB Local files
103 | .dynamodb/
104 |
105 | # TernJS port file
106 | .tern-port
107 |
108 | # Stores VSCode versions used for testing VSCode extensions
109 | .vscode-test
110 |
111 | # yarn v2
112 | .yarn/cache
113 | .yarn/unplugged
114 | .yarn/build-state.yml
115 | .yarn/install-state.gz
116 | .pnp.*
117 |
--------------------------------------------------------------------------------
/templates/application/vue3/gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # Snowpack dependency directory (https://snowpack.dev/)
45 | web_modules/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 | .parcel-cache
78 |
79 | # Next.js build output
80 | .next
81 | out
82 |
83 | # Nuxt.js build / generate output
84 | .nuxt
85 | dist
86 |
87 | # Gatsby files
88 | .cache/
89 | # Comment in the public line in if your project uses Gatsby and not Next.js
90 | # https://nextjs.org/blog/next-9-1#public-directory-support
91 | # public
92 |
93 | # vuepress build output
94 | .vuepress/dist
95 |
96 | # Serverless directories
97 | .serverless/
98 |
99 | # FuseBox cache
100 | .fusebox/
101 |
102 | # DynamoDB Local files
103 | .dynamodb/
104 |
105 | # TernJS port file
106 | .tern-port
107 |
108 | # Stores VSCode versions used for testing VSCode extensions
109 | .vscode-test
110 |
111 | # yarn v2
112 | .yarn/cache
113 | .yarn/unplugged
114 | .yarn/build-state.yml
115 | .yarn/install-state.gz
116 | .pnp.*
117 |
--------------------------------------------------------------------------------
/templates/application/lit-html/gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # Snowpack dependency directory (https://snowpack.dev/)
45 | web_modules/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 | .parcel-cache
78 |
79 | # Next.js build output
80 | .next
81 | out
82 |
83 | # Nuxt.js build / generate output
84 | .nuxt
85 | dist
86 |
87 | # Gatsby files
88 | .cache/
89 | # Comment in the public line in if your project uses Gatsby and not Next.js
90 | # https://nextjs.org/blog/next-9-1#public-directory-support
91 | # public
92 |
93 | # vuepress build output
94 | .vuepress/dist
95 |
96 | # Serverless directories
97 | .serverless/
98 |
99 | # FuseBox cache
100 | .fusebox/
101 |
102 | # DynamoDB Local files
103 | .dynamodb/
104 |
105 | # TernJS port file
106 | .tern-port
107 |
108 | # Stores VSCode versions used for testing VSCode extensions
109 | .vscode-test
110 |
111 | # yarn v2
112 | .yarn/cache
113 | .yarn/unplugged
114 | .yarn/build-state.yml
115 | .yarn/install-state.gz
116 | .pnp.*
117 |
--------------------------------------------------------------------------------
/templates/application/react-18/gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # Snowpack dependency directory (https://snowpack.dev/)
45 | web_modules/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 | .parcel-cache
78 |
79 | # Next.js build output
80 | .next
81 | out
82 |
83 | # Nuxt.js build / generate output
84 | .nuxt
85 | dist
86 |
87 | # Gatsby files
88 | .cache/
89 | # Comment in the public line in if your project uses Gatsby and not Next.js
90 | # https://nextjs.org/blog/next-9-1#public-directory-support
91 | # public
92 |
93 | # vuepress build output
94 | .vuepress/dist
95 |
96 | # Serverless directories
97 | .serverless/
98 |
99 | # FuseBox cache
100 | .fusebox/
101 |
102 | # DynamoDB Local files
103 | .dynamodb/
104 |
105 | # TernJS port file
106 | .tern-port
107 |
108 | # Stores VSCode versions used for testing VSCode extensions
109 | .vscode-test
110 |
111 | # yarn v2
112 | .yarn/cache
113 | .yarn/unplugged
114 | .yarn/build-state.yml
115 | .yarn/install-state.gz
116 | .pnp.*
117 |
--------------------------------------------------------------------------------
/templates/application/react-19/gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # Snowpack dependency directory (https://snowpack.dev/)
45 | web_modules/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 | .parcel-cache
78 |
79 | # Next.js build output
80 | .next
81 | out
82 |
83 | # Nuxt.js build / generate output
84 | .nuxt
85 | dist
86 |
87 | # Gatsby files
88 | .cache/
89 | # Comment in the public line in if your project uses Gatsby and not Next.js
90 | # https://nextjs.org/blog/next-9-1#public-directory-support
91 | # public
92 |
93 | # vuepress build output
94 | .vuepress/dist
95 |
96 | # Serverless directories
97 | .serverless/
98 |
99 | # FuseBox cache
100 | .fusebox/
101 |
102 | # DynamoDB Local files
103 | .dynamodb/
104 |
105 | # TernJS port file
106 | .tern-port
107 |
108 | # Stores VSCode versions used for testing VSCode extensions
109 | .vscode-test
110 |
111 | # yarn v2
112 | .yarn/cache
113 | .yarn/unplugged
114 | .yarn/build-state.yml
115 | .yarn/install-state.gz
116 | .pnp.*
117 |
--------------------------------------------------------------------------------
/templates/application/solid-js/gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # Snowpack dependency directory (https://snowpack.dev/)
45 | web_modules/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 | .parcel-cache
78 |
79 | # Next.js build output
80 | .next
81 | out
82 |
83 | # Nuxt.js build / generate output
84 | .nuxt
85 | dist
86 |
87 | # Gatsby files
88 | .cache/
89 | # Comment in the public line in if your project uses Gatsby and not Next.js
90 | # https://nextjs.org/blog/next-9-1#public-directory-support
91 | # public
92 |
93 | # vuepress build output
94 | .vuepress/dist
95 |
96 | # Serverless directories
97 | .serverless/
98 |
99 | # FuseBox cache
100 | .fusebox/
101 |
102 | # DynamoDB Local files
103 | .dynamodb/
104 |
105 | # TernJS port file
106 | .tern-port
107 |
108 | # Stores VSCode versions used for testing VSCode extensions
109 | .vscode-test
110 |
111 | # yarn v2
112 | .yarn/cache
113 | .yarn/unplugged
114 | .yarn/build-state.yml
115 | .yarn/install-state.gz
116 | .pnp.*
117 |
--------------------------------------------------------------------------------
/templates/application/vanilla/gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # Snowpack dependency directory (https://snowpack.dev/)
45 | web_modules/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 | .parcel-cache
78 |
79 | # Next.js build output
80 | .next
81 | out
82 |
83 | # Nuxt.js build / generate output
84 | .nuxt
85 | dist
86 |
87 | # Gatsby files
88 | .cache/
89 | # Comment in the public line in if your project uses Gatsby and not Next.js
90 | # https://nextjs.org/blog/next-9-1#public-directory-support
91 | # public
92 |
93 | # vuepress build output
94 | .vuepress/dist
95 |
96 | # Serverless directories
97 | .serverless/
98 |
99 | # FuseBox cache
100 | .fusebox/
101 |
102 | # DynamoDB Local files
103 | .dynamodb/
104 |
105 | # TernJS port file
106 | .tern-port
107 |
108 | # Stores VSCode versions used for testing VSCode extensions
109 | .vscode-test
110 |
111 | # yarn v2
112 | .yarn/cache
113 | .yarn/unplugged
114 | .yarn/build-state.yml
115 | .yarn/install-state.gz
116 | .pnp.*
117 |
--------------------------------------------------------------------------------
/templates/library/typescript/gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 | .pnpm-debug.log*
9 |
10 | # Diagnostic reports (https://nodejs.org/api/report.html)
11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12 |
13 | # Runtime data
14 | pids
15 | *.pid
16 | *.seed
17 | *.pid.lock
18 |
19 | # Directory for instrumented libs generated by jscoverage/JSCover
20 | lib-cov
21 |
22 | # Coverage directory used by tools like istanbul
23 | coverage
24 | *.lcov
25 |
26 | # nyc test coverage
27 | .nyc_output
28 |
29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30 | .grunt
31 |
32 | # Bower dependency directory (https://bower.io/)
33 | bower_components
34 |
35 | # node-waf configuration
36 | .lock-wscript
37 |
38 | # Compiled binary addons (https://nodejs.org/api/addons.html)
39 | build/Release
40 |
41 | # Dependency directories
42 | node_modules/
43 | jspm_packages/
44 |
45 | # Snowpack dependency directory (https://snowpack.dev/)
46 | web_modules/
47 |
48 | # TypeScript cache
49 | *.tsbuildinfo
50 |
51 | # Optional npm cache directory
52 | .npm
53 |
54 | # Optional eslint cache
55 | .eslintcache
56 |
57 | # Microbundle cache
58 | .rpt2_cache/
59 | .rts2_cache_cjs/
60 | .rts2_cache_es/
61 | .rts2_cache_umd/
62 |
63 | # Optional REPL history
64 | .node_repl_history
65 |
66 | # Output of 'npm pack'
67 | *.tgz
68 |
69 | # Yarn Integrity file
70 | .yarn-integrity
71 |
72 | # dotenv environment variables file
73 | .env
74 | .env.test
75 | .env.production
76 |
77 | # parcel-bundler cache (https://parceljs.org/)
78 | .cache
79 | .parcel-cache
80 |
81 | # Next.js build output
82 | .next
83 | out
84 |
85 | # Nuxt.js build / generate output
86 | .nuxt
87 | dist
88 |
89 | # Gatsby files
90 | .cache/
91 | # Comment in the public line in if your project uses Gatsby and not Next.js
92 | # https://nextjs.org/blog/next-9-1#public-directory-support
93 | # public
94 |
95 | # vuepress build output
96 | .vuepress/dist
97 |
98 | # Serverless directories
99 | .serverless/
100 |
101 | # FuseBox cache
102 | .fusebox/
103 |
104 | # DynamoDB Local files
105 | .dynamodb/
106 |
107 | # TernJS port file
108 | .tern-port
109 |
110 | # Stores VSCode versions used for testing VSCode extensions
111 | .vscode-test
112 |
113 | # yarn v2
114 | .yarn/cache
115 | .yarn/unplugged
116 | .yarn/build-state.yml
117 | .yarn/install-state.gz
118 | .pnp.*
--------------------------------------------------------------------------------
/templates/application/vue3/rspack.config.ts.ejs:
--------------------------------------------------------------------------------
1 | import * as path from "node:path";
2 | import { defineConfig } from "@rspack/cli";
3 | import { rspack } from "@rspack/core";
4 | import { ModuleFederationPlugin } from "@module-federation/enhanced/rspack";
5 | import { VueLoaderPlugin } from "vue-loader";
6 |
7 | import { mfConfig } from "./module-federation.config";
8 |
9 | const isDev = process.env.NODE_ENV === "development";
10 |
11 | // Target browsers, see: https://github.com/browserslist/browserslist
12 | const targets = ["chrome >= 87", "edge >= 88", "firefox >= 78", "safari >= 14"];
13 |
14 | export default defineConfig({
15 | context: __dirname,
16 | entry: {
17 | main: "./src/index.ts",
18 | },
19 | resolve: {
20 | extensions: ["...", ".ts", ".tsx", ".jsx"],
21 | },
22 |
23 | devServer: {
24 | port: <%= PORT %>,
25 | historyApiFallback: true,
26 | watchFiles: [path.resolve(__dirname, "src")],
27 | },
28 |
29 | output: {
30 | // You need to set a unique value that is not equal to other applications
31 | uniqueName: "<%= SAFE_NAME %>",
32 | // publicPath must be configured if using manifest
33 | publicPath: "http://localhost:<%= PORT %>/",
34 | },
35 |
36 | experiments: {
37 | css: true,
38 | },
39 |
40 | module: {
41 | rules: [
42 | {
43 | test: /\.vue$/,
44 | loader: "vue-loader",
45 | options: {
46 | experimentalInlineMatchResource: true,
47 | },
48 | },
49 | {
50 | test: /\.css$/,
51 | use: ["postcss-loader"],
52 | type: "css",
53 | },
54 | {
55 | test: /\.svg$/,
56 | type: "asset",
57 | },
58 | {
59 | test: /\.(jsx?|tsx?)$/,
60 | use: [
61 | {
62 | loader: "builtin:swc-loader",
63 | options: {
64 | jsc: {
65 | parser: {
66 | syntax: "typescript",
67 | tsx: true,
68 | },
69 | },
70 | env: { targets },
71 | },
72 | },
73 | ],
74 | },
75 | ],
76 | },
77 | plugins: [
78 | new VueLoaderPlugin(),
79 | new rspack.HtmlRspackPlugin({
80 | template: "./index.html",
81 | }),
82 | new ModuleFederationPlugin(mfConfig),
83 | ].filter(Boolean),
84 | optimization: {
85 | minimizer: [
86 | new rspack.SwcJsMinimizerRspackPlugin(),
87 | new rspack.LightningCssMinimizerRspackPlugin({
88 | minimizerOptions: { targets },
89 | }),
90 | ],
91 | },
92 | });
93 |
--------------------------------------------------------------------------------
/templates/server/nestjs-auth/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "{{NAME}}",
3 | "version": "1.0.0",
4 | "description": "",
5 | "author": "",
6 | "private": true,
7 | "license": "UNLICENSED",
8 | "scripts": {
9 | "prebuild": "rimraf dist",
10 | "build": "nest build",
11 | "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
12 | "start": "nest start",
13 | "start:dev": "nest start --watch",
14 | "start:debug": "nest start --debug --watch",
15 | "start:prod": "node dist/main",
16 | "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
17 | "test": "jest",
18 | "test:watch": "jest --watch",
19 | "test:cov": "jest --coverage",
20 | "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
21 | "test:e2e": "jest --config ./test/jest-e2e.json"
22 | },
23 | "dependencies": {
24 | "@nestjs/common": "^8.0.0",
25 | "@nestjs/core": "^8.0.0",
26 | "@nestjs/jwt": "^8.0.0",
27 | "@nestjs/passport": "^8.0.1",
28 | "@nestjs/platform-express": "^8.0.0",
29 | "@nestjs/serve-static": "^2.2.2",
30 | "class-validator": "^0.13.1",
31 | "jsonwebtoken": "^8.5.1",
32 | "passport": "^0.5.0",
33 | "passport-jwt": "^4.0.0",
34 | "passport-local": "^1.0.0",
35 | "reflect-metadata": "^0.1.13",
36 | "rimraf": "^3.0.2",
37 | "rxjs": "^7.2.0"
38 | },
39 | "devDependencies": {
40 | "@nestjs/cli": "^8.0.0",
41 | "@nestjs/schematics": "^8.0.0",
42 | "@nestjs/testing": "^8.0.0",
43 | "@types/express": "^4.17.13",
44 | "@types/jest": "^27.0.1",
45 | "@types/node": "^16.0.0",
46 | "@types/passport-jwt": "^3.0.6",
47 | "@types/passport-local": "^1.0.34",
48 | "@types/supertest": "^2.0.11",
49 | "@typescript-eslint/eslint-plugin": "^4.28.2",
50 | "@typescript-eslint/parser": "^4.28.2",
51 | "eslint": "^7.30.0",
52 | "eslint-config-prettier": "^8.3.0",
53 | "eslint-plugin-prettier": "^3.4.0",
54 | "jest": "^27.0.6",
55 | "prettier": "^2.3.2",
56 | "supertest": "^6.1.3",
57 | "ts-jest": "^27.0.3",
58 | "ts-loader": "^9.2.3",
59 | "ts-node": "^10.0.0",
60 | "tsconfig-paths": "^3.10.1",
61 | "typescript": "^4.3.5"
62 | },
63 | "jest": {
64 | "moduleFileExtensions": [
65 | "js",
66 | "json",
67 | "ts"
68 | ],
69 | "rootDir": "src",
70 | "testRegex": ".*\\.spec\\.ts$",
71 | "transform": {
72 | "^.+\\.(t|j)s$": "ts-jest"
73 | },
74 | "collectCoverageFrom": [
75 | "**/*.(t|j)s"
76 | ],
77 | "coverageDirectory": "../coverage",
78 | "testEnvironment": "node"
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/templates/application/preact/rspack.config.ts.ejs:
--------------------------------------------------------------------------------
1 | import * as path from "node:path";
2 | import { defineConfig } from "@rspack/cli";
3 | import { rspack } from "@rspack/core";
4 | import * as RefreshPlugin from "@rspack/plugin-react-refresh";
5 | import { ModuleFederationPlugin } from "@module-federation/enhanced/rspack";
6 |
7 | import { mfConfig } from "./module-federation.config";
8 |
9 | const isDev = process.env.NODE_ENV === "development";
10 |
11 | // Target browsers, see: https://github.com/browserslist/browserslist
12 | const targets = ["chrome >= 87", "edge >= 88", "firefox >= 78", "safari >= 14"];
13 |
14 | export default defineConfig({
15 | context: __dirname,
16 | entry: {
17 | main: "./src/index.ts",
18 | },
19 | resolve: {
20 | extensions: ["...", ".ts", ".tsx", ".jsx"],
21 | alias: {
22 | react: "preact/compat",
23 | "react-dom": "preact/compat"
24 | }
25 | },
26 |
27 | devServer: {
28 | port: <%= PORT %>,
29 | historyApiFallback: true,
30 | watchFiles: [path.resolve(__dirname, "src")],
31 | },
32 | output: {
33 | // You need to set a unique value that is not equal to other applications
34 | uniqueName: "<%= SAFE_NAME %>",
35 | // publicPath must be configured if using manifest
36 | publicPath: "http://localhost:<%= PORT %>/",
37 | },
38 |
39 | experiments: {
40 | css: true,
41 | },
42 |
43 | module: {
44 | rules: [
45 | {
46 | test: /\.svg$/,
47 | type: "asset",
48 | },
49 | {
50 | test: /\.css$/,
51 | use: ["postcss-loader"],
52 | type: "css",
53 | },
54 | {
55 | test: /\.(jsx?|tsx?)$/,
56 | use: [
57 | {
58 | loader: "builtin:swc-loader",
59 | options: {
60 | jsc: {
61 | parser: {
62 | syntax: "typescript",
63 | tsx: true,
64 | },
65 | transform: {
66 | react: {
67 | runtime: "automatic",
68 | development: isDev,
69 | refresh: isDev,
70 | },
71 | },
72 | },
73 | env: { targets },
74 | },
75 | },
76 | ],
77 | },
78 | ],
79 | },
80 | plugins: [
81 | new rspack.HtmlRspackPlugin({
82 | template: "./index.html",
83 | }),
84 | new ModuleFederationPlugin(mfConfig),
85 | isDev ? new RefreshPlugin() : null,
86 | ].filter(Boolean),
87 | optimization: {
88 | minimizer: [
89 | new rspack.SwcJsMinimizerRspackPlugin(),
90 | new rspack.LightningCssMinimizerRspackPlugin({
91 | minimizerOptions: { targets },
92 | }),
93 | ],
94 | },
95 | });
96 |
--------------------------------------------------------------------------------
/templates/application/react-18/rspack.config.ts.ejs:
--------------------------------------------------------------------------------
1 | import * as path from "node:path";
2 | import { defineConfig } from "@rspack/cli";
3 | import { rspack } from "@rspack/core";
4 | import * as RefreshPlugin from "@rspack/plugin-react-refresh";
5 | import { ModuleFederationPlugin } from "@module-federation/enhanced/rspack";
6 | <% if (WITH_ZEPHYR) { %>import { withZephyr } from "zephyr-rspack-plugin";<% } %>
7 |
8 | import { mfConfig } from "./module-federation.config";
9 |
10 | const isDev = process.env.NODE_ENV === "development";
11 |
12 | // Target browsers, see: https://github.com/browserslist/browserslist
13 | const targets = ["chrome >= 87", "edge >= 88", "firefox >= 78", "safari >= 14"];
14 |
15 | <% if (WITH_ZEPHYR) { %>export default withZephyr()({<% } else { %>export default defineConfig({<% } %>
16 | context: __dirname,
17 | entry: {
18 | main: "./src/index.ts",
19 | },
20 | resolve: {
21 | extensions: ["...", ".ts", ".tsx", ".jsx"],
22 | },
23 |
24 | devServer: {
25 | port: <%= PORT %>,
26 | historyApiFallback: true,
27 | watchFiles: [path.resolve(__dirname, "src")],
28 | },
29 | output: {
30 | // You need to set a unique value that is not equal to other applications
31 | uniqueName: "<%= SAFE_NAME %>",
32 | // publicPath must be configured if using manifest
33 | publicPath: "http://localhost:<%= PORT %>/",
34 | },
35 |
36 | experiments: {
37 | css: true,
38 | },
39 |
40 | module: {
41 | rules: [
42 | {
43 | test: /\.svg$/,
44 | type: "asset",
45 | },
46 | {
47 | test: /\.css$/,
48 | use: ["postcss-loader"],
49 | type: "css",
50 | },
51 | {
52 | test: /\.(jsx?|tsx?)$/,
53 | use: [
54 | {
55 | loader: "builtin:swc-loader",
56 | options: {
57 | jsc: {
58 | parser: {
59 | syntax: "typescript",
60 | tsx: true,
61 | },
62 | transform: {
63 | react: {
64 | runtime: "automatic",
65 | development: isDev,
66 | refresh: isDev,
67 | },
68 | },
69 | },
70 | env: { targets },
71 | },
72 | },
73 | ],
74 | },
75 | ],
76 | },
77 | plugins: [
78 | new rspack.HtmlRspackPlugin({
79 | template: "./index.html",
80 | }),
81 | new ModuleFederationPlugin(mfConfig),
82 | isDev ? new RefreshPlugin() : null,
83 | ].filter(Boolean),
84 | optimization: {
85 | minimizer: [
86 | new rspack.SwcJsMinimizerRspackPlugin(),
87 | new rspack.LightningCssMinimizerRspackPlugin({
88 | minimizerOptions: { targets },
89 | }),
90 | ],
91 | },
92 | });
93 |
--------------------------------------------------------------------------------
/templates/application/react-19/rspack.config.ts.ejs:
--------------------------------------------------------------------------------
1 | import * as path from "node:path";
2 | import { defineConfig } from "@rspack/cli";
3 | import { rspack } from "@rspack/core";
4 | import * as RefreshPlugin from "@rspack/plugin-react-refresh";
5 | import { ModuleFederationPlugin } from "@module-federation/enhanced/rspack";
6 | <% if (WITH_ZEPHYR) { %>import { withZephyr } from "zephyr-rspack-plugin";<% } %>
7 |
8 | import { mfConfig } from "./module-federation.config";
9 |
10 | const isDev = process.env.NODE_ENV === "development";
11 |
12 | // Target browsers, see: https://github.com/browserslist/browserslist
13 | const targets = ["chrome >= 87", "edge >= 88", "firefox >= 78", "safari >= 14"];
14 |
15 | <% if (WITH_ZEPHYR) { %>export default withZephyr()({<% } else { %>export default defineConfig({<% } %>
16 | context: __dirname,
17 | entry: {
18 | main: "./src/index.ts",
19 | },
20 | resolve: {
21 | extensions: ["...", ".ts", ".tsx", ".jsx"],
22 | },
23 |
24 | devServer: {
25 | port: <%= PORT %>,
26 | historyApiFallback: true,
27 | watchFiles: [path.resolve(__dirname, "src")],
28 | },
29 | output: {
30 | // You need to set a unique value that is not equal to other applications
31 | uniqueName: "<%= SAFE_NAME %>",
32 | // publicPath must be configured if using manifest
33 | publicPath: "http://localhost:<%= PORT %>/",
34 | },
35 |
36 | experiments: {
37 | css: true,
38 | },
39 |
40 | module: {
41 | rules: [
42 | {
43 | test: /\.svg$/,
44 | type: "asset",
45 | },
46 | {
47 | test: /\.css$/,
48 | use: ["postcss-loader"],
49 | type: "css",
50 | },
51 | {
52 | test: /\.(jsx?|tsx?)$/,
53 | use: [
54 | {
55 | loader: "builtin:swc-loader",
56 | options: {
57 | jsc: {
58 | parser: {
59 | syntax: "typescript",
60 | tsx: true,
61 | },
62 | transform: {
63 | react: {
64 | runtime: "automatic",
65 | development: isDev,
66 | refresh: isDev,
67 | },
68 | },
69 | },
70 | env: { targets },
71 | },
72 | },
73 | ],
74 | },
75 | ],
76 | },
77 | plugins: [
78 | new rspack.HtmlRspackPlugin({
79 | template: "./index.html",
80 | }),
81 | new ModuleFederationPlugin(mfConfig),
82 | isDev ? new RefreshPlugin() : null,
83 | ].filter(Boolean),
84 | optimization: {
85 | minimizer: [
86 | new rspack.SwcJsMinimizerRspackPlugin(),
87 | new rspack.LightningCssMinimizerRspackPlugin({
88 | minimizerOptions: { targets },
89 | }),
90 | ],
91 | },
92 | });
93 |
--------------------------------------------------------------------------------
/templates/application/svelte/rspack.config.ts.ejs:
--------------------------------------------------------------------------------
1 | import * as path from "node:path";
2 | import { defineConfig } from "@rspack/cli";
3 | import { rspack } from "@rspack/core";
4 | import { ModuleFederationPlugin } from "@module-federation/enhanced/rspack";
5 |
6 | const sveltePreprocess = require('svelte-preprocess');
7 |
8 | import { mfConfig } from "./module-federation.config";
9 |
10 | const isDev = process.env.NODE_ENV === "development";
11 |
12 | // Target browsers, see: https://github.com/browserslist/browserslist
13 | const targets = ["chrome >= 87", "edge >= 88", "firefox >= 78", "safari >= 14"];
14 |
15 | export default defineConfig({
16 | context: __dirname,
17 | entry: {
18 | main: "./src/index.ts",
19 | },
20 | resolve: {
21 | extensions: ["...", ".ts", ".tsx", ".jsx"],
22 | },
23 |
24 | devServer: {
25 | port: <%= PORT %>,
26 | historyApiFallback: true,
27 | watchFiles: [path.resolve(__dirname, "src")],
28 | },
29 | output: {
30 | // You need to set a unique value that is not equal to other applications
31 | uniqueName: "<%= SAFE_NAME %>",
32 | // publicPath must be configured if using manifest
33 | publicPath: "http://localhost:<%= PORT %>/",
34 | },
35 |
36 | experiments: {
37 | css: true,
38 | },
39 |
40 | module: {
41 | rules: [
42 | {
43 | test: /\.svg$/,
44 | type: "asset",
45 | },
46 | {
47 | test: /\.css$/,
48 | use: ["postcss-loader"],
49 | type: "css",
50 | },
51 | {
52 | test: /\.(jsx?|tsx?)$/,
53 | use: [
54 | {
55 | loader: "builtin:swc-loader",
56 | options: {
57 | jsc: {
58 | parser: {
59 | syntax: "typescript",
60 | tsx: true,
61 | },
62 | },
63 | env: { targets },
64 | },
65 | },
66 | ],
67 | },
68 | {
69 | test: /\.svelte$/,
70 | use: [
71 | {
72 | loader: 'svelte-loader',
73 | options: {
74 | compilerOptions: {
75 | dev: isDev,
76 | },
77 |
78 | emitCss: !isDev,
79 | hotReload: isDev,
80 | preprocess: sveltePreprocess({ sourceMap: isDev, postcss: true }),
81 | },
82 | },
83 | ],
84 | },
85 | ],
86 | },
87 | plugins: [
88 | new rspack.HtmlRspackPlugin({
89 | template: "./index.html",
90 | }),
91 | new ModuleFederationPlugin(mfConfig),
92 | ].filter(Boolean),
93 | optimization: {
94 | minimizer: [
95 | new rspack.SwcJsMinimizerRspackPlugin(),
96 | new rspack.LightningCssMinimizerRspackPlugin({
97 | minimizerOptions: { targets },
98 | }),
99 | ],
100 | },
101 | });
102 |
--------------------------------------------------------------------------------
/src/__tests__/index.test.ts:
--------------------------------------------------------------------------------
1 | import { describe, it, expect, afterEach } from "vitest";
2 | import fs from "fs";
3 | import path from "path";
4 | import { buildProject } from "../index";
5 |
6 | describe("Project Generation", () => {
7 | const testDir = "test-project";
8 |
9 | afterEach(() => {
10 | if (fs.existsSync(testDir)) {
11 | fs.rmSync(testDir, { recursive: true });
12 | }
13 | });
14 |
15 | describe("Application Projects", () => {
16 | const frameworks = [
17 | "react-18",
18 | "react-19",
19 | "vue3",
20 | "svelte",
21 | "preact",
22 | "lit-html",
23 | "solid-js",
24 | "vanilla",
25 | ];
26 |
27 | frameworks.forEach((framework) => {
28 | it(`should generate ${framework} application correctly`, async () => {
29 | await buildProject({
30 | name: testDir,
31 | framework,
32 | type: "Application",
33 | css: "CSS",
34 | withZephyr: 'no',
35 | });
36 |
37 | expect(fs.existsSync(testDir)).toBe(true);
38 | expect(fs.existsSync(path.join(testDir, "package.json"))).toBe(true);
39 | expect(fs.existsSync(path.join(testDir, "src"))).toBe(true);
40 | });
41 | });
42 | });
43 |
44 | describe("Library Projects", () => {
45 | it("should generate TypeScript library correctly", async () => {
46 | await buildProject({
47 | name: testDir,
48 | framework: "typescript",
49 | type: "Library",
50 | css: "CSS",
51 | withZephyr: "no",
52 | });
53 |
54 | expect(fs.existsSync(testDir)).toBe(true);
55 | expect(fs.existsSync(path.join(testDir, "package.json"))).toBe(true);
56 | expect(fs.existsSync(path.join(testDir, "src"))).toBe(true);
57 | });
58 | });
59 |
60 | describe("API Projects", () => {
61 | const frameworks = [
62 | "express",
63 | "nestjs-auth",
64 | "nestjs-todo",
65 | "graphql-apollo",
66 | "graphql-nexus",
67 | "graphql-subscriptions",
68 | ];
69 |
70 | frameworks.forEach((framework) => {
71 | it(`should generate ${framework} API correctly`, async () => {
72 | await buildProject({
73 | name: testDir,
74 | framework,
75 | type: "API",
76 | css: "CSS",
77 | withZephyr: 'no',
78 | });
79 |
80 | expect(fs.existsSync(testDir)).toBe(true);
81 | expect(fs.existsSync(path.join(testDir, "package.json"))).toBe(true);
82 | // expect(fs.existsSync(path.join(testDir, 'src'))).toBe(true);
83 | });
84 | });
85 | });
86 |
87 | describe("Tailwind Integration", () => {
88 | it("should have correct Tailwind setup", async () => {
89 | await buildProject({
90 | name: testDir,
91 | framework: "react-18",
92 | type: "Application",
93 | css: "Tailwind",
94 | withZephyr: 'no',
95 | });
96 |
97 | const indexCssPath = path.join(testDir, "src/index.css");
98 | const packageJsonPath = path.join(testDir, "package.json");
99 |
100 | // Verify index.css exists and has correct content
101 | expect(fs.existsSync(indexCssPath)).toBe(true);
102 | const indexCssContent = fs.readFileSync(indexCssPath, "utf-8");
103 | expect(indexCssContent.trim()).toBe('@import "tailwindcss";');
104 |
105 | // Verify package.json has correct Tailwind dependencies
106 | const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
107 | expect(packageJson.devDependencies["@tailwindcss/postcss"]).toBe(
108 | "^4.0.3"
109 | );
110 | expect(packageJson.devDependencies["tailwindcss"]).toBe("^4.0.3");
111 | });
112 | });
113 | });
114 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | import fs from "node:fs";
2 | import path from "node:path";
3 | import { glob } from "glob";
4 | import ejs from "ejs";
5 |
6 | export type Project = {
7 | framework?: string;
8 | css?: "CSS" | "Tailwind";
9 | withZephyr: boolean;
10 | port?: number;
11 | name: string;
12 | type: "Application" | "Library" | "API";
13 | };
14 |
15 | type Profiler = {
16 | NAME: string;
17 | FRAMEWORK: string | undefined;
18 | SAFE_NAME: string;
19 | PORT?: number;
20 | CSS?: "Tailwind" | "Empty CSS";
21 | WITH_ZEPHYR: boolean;
22 | CONTAINER?: string;
23 | };
24 |
25 | const templateFile = (fileName: string, replacements: Profiler) => {
26 | let fileContent = fs.readFileSync(fileName, "utf8").toString();
27 |
28 | let outputFileName = fileName;
29 | // Allow for EJS templates if there is logic required to process the template
30 | if (fileName.endsWith(".ejs")) {
31 | fs.unlinkSync(fileName);
32 | outputFileName = fileName.replace(".ejs", "");
33 | fileContent = ejs.render(fileContent, replacements);
34 | } else {
35 | fileContent = Object.entries(replacements).reduce((acc, [key, value]) => {
36 | return acc.replace(
37 | new RegExp(`({{${key}}}|{{ ${key} }})`, "g"),
38 | value?.toString() ?? ""
39 | );
40 | }, fileContent);
41 | }
42 |
43 | fs.writeFileSync(outputFileName, fileContent);
44 | };
45 |
46 | // required for npm publish
47 | const renameGitignore = (projectName: string) => {
48 | if (fs.existsSync(path.normalize(`${projectName}/gitignore`))) {
49 | fs.renameSync(
50 | path.normalize(`${projectName}/gitignore`),
51 | path.normalize(`${projectName}/.gitignore`)
52 | );
53 | }
54 | };
55 |
56 | const buildProfiler = ({
57 | type,
58 | framework,
59 | name,
60 | css,
61 | port,
62 | withZephyr,
63 | }: Project) => {
64 | const profiler: Profiler = {
65 | NAME: name,
66 | FRAMEWORK: framework,
67 | SAFE_NAME: name.replace(/-/g, "_").trim(),
68 | WITH_ZEPHYR: withZephyr,
69 | };
70 |
71 | if (type === "API" || type === "Application") {
72 | profiler.PORT = port;
73 | }
74 |
75 | if (type === "Application") {
76 | const isTailwind = css === "Tailwind";
77 | profiler.CONTAINER = isTailwind
78 | ? "mt-10 text-3xl mx-auto max-w-6xl"
79 | : "container";
80 | profiler.CSS = isTailwind ? "Tailwind" : "Empty CSS";
81 | }
82 | return profiler;
83 | };
84 |
85 | // I for the life of me, could not get ncp to copy the directory fast enough to
86 | // get the template replacements handled properly.
87 | // So I made this hand rolled function to do it
88 | const copyDirSync = (sourceDir: string, targetDir: string) => {
89 | if (!fs.existsSync(targetDir)) {
90 | fs.mkdirSync(targetDir, { recursive: true });
91 | }
92 |
93 | const files = fs.readdirSync(sourceDir);
94 |
95 | files.forEach((file) => {
96 | const sourcePath = path.join(sourceDir, file);
97 | const targetPath = path.join(targetDir, file);
98 |
99 | const stats = fs.statSync(sourcePath);
100 |
101 | if (stats.isDirectory()) {
102 | copyDirSync(sourcePath, targetPath);
103 | } else {
104 | fs.copyFileSync(sourcePath, targetPath);
105 | }
106 | });
107 | };
108 |
109 | export const buildProject = async (project: Project) => {
110 | const { name, framework, type, withZephyr } = project;
111 | const tempDir = type.toLowerCase();
112 | const profiler = buildProfiler(project);
113 |
114 | if (type === "Application") {
115 | copyDirSync(
116 | path.join(__dirname, `../templates/${tempDir}/${framework}`),
117 | name
118 | );
119 |
120 | const pkg = fs.readFileSync(path.join(name, "package.json"), "utf8");
121 | const packageJSON = JSON.parse(pkg);
122 | packageJSON.devDependencies = packageJSON.devDependencies || {};
123 |
124 | if (project.css === "Tailwind") {
125 | await copyDirSync(
126 | path.join(__dirname, "../templates/application-extras/tailwind"),
127 | name
128 | );
129 | packageJSON.devDependencies["@tailwindcss/postcss"] = "^4.0.3";
130 | packageJSON.devDependencies["tailwindcss"] = "^4.0.3";
131 | }
132 |
133 | if (withZephyr) {
134 | packageJSON.dependencies["zephyr-rspack-plugin"] = "^0.0.50";
135 | }
136 |
137 | await fs.writeFileSync(
138 | path.join(name, "package.json"),
139 | JSON.stringify(packageJSON, null, 2)
140 | );
141 | }
142 | if (type === "Library") {
143 | await copyDirSync(
144 | path.join(__dirname, `../templates/${tempDir}/typescript`),
145 | name
146 | );
147 | }
148 | if (type === "API") {
149 | await copyDirSync(
150 | path.join(__dirname, `../templates/server/${framework}`),
151 | name
152 | );
153 | }
154 |
155 | renameGitignore(name);
156 |
157 | const files = glob.sync(`${name}/**/*`);
158 | for (const file of files) {
159 | if (fs.lstatSync(file).isFile()) {
160 | templateFile(file, profiler);
161 | }
162 | }
163 | };
164 |
--------------------------------------------------------------------------------
/bin/create-mf-app.ts:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | import {
3 | intro,
4 | outro,
5 | text,
6 | isCancel,
7 | cancel,
8 | select,
9 | spinner,
10 | } from "@clack/prompts";
11 | import fs from "node:fs";
12 | import path from "node:path";
13 | import { program } from "commander";
14 |
15 | import { buildProject, Project } from "../src";
16 |
17 | const applicationTemplates = fs
18 | .readdirSync(path.join(__dirname, "../templates/application"))
19 | .sort();
20 |
21 | const serverTemplates = fs
22 | .readdirSync(path.join(__dirname, "../templates/server"))
23 | .sort();
24 |
25 | const templates = [
26 | ...applicationTemplates.map((t) => ({
27 | framework: t,
28 | type: "Application",
29 | })),
30 | ...serverTemplates.map((t) => ({
31 | framework: t,
32 | type: "Server",
33 | })),
34 | {
35 | framework: "library",
36 | type: "Library",
37 | },
38 | ];
39 |
40 | program
41 | .option("-n, --name ", "The name of the project")
42 | .option(
43 | "-t, --template ",
44 | `The template to use (${templates.map((t) => t.framework).join(", ")})`
45 | )
46 | .option("-p, --port ", "The port to use")
47 | .option("-c, --css ", "The CSS framework to use (CSS or Tailwind)")
48 | .option(
49 | "-z, --withZephyr ",
50 | "Add deploy withZephyr, sub second deployments on build"
51 | )
52 | .option("-h, --help", "Help");
53 |
54 | program.parse();
55 |
56 | const options = program.opts();
57 |
58 | if (options.help) {
59 | program.outputHelp();
60 | process.exit(0);
61 | }
62 |
63 | if (options.template) {
64 | const template = templates.find((t) => t.framework === options.template);
65 | if (!template) {
66 | console.log(`Invalid template: ${options.template}`);
67 | process.exit(1);
68 | }
69 | options.type = template.type;
70 | options.framework = template.framework;
71 | }
72 |
73 | function checkCancel(value: string | symbol) {
74 | if (isCancel(value)) {
75 | cancel("Operation cancelled.");
76 | process.exit(0);
77 | }
78 | }
79 |
80 | (async () => {
81 | intro("Create Module Federation App (create-mf-app) V2");
82 |
83 | const answers: Project = {
84 | name: "",
85 | type: "Application",
86 | withZephyr: false,
87 | };
88 |
89 | if (options.name) {
90 | answers.name = options.name;
91 | } else {
92 | answers.name = (await text({
93 | message: "What is the name of your app?",
94 | placeholder: "my-awesome-app",
95 | })) as string;
96 | checkCancel(answers.name);
97 | }
98 |
99 | if (options.type) {
100 | answers.type = options.type;
101 | } else {
102 | answers.type = (await select({
103 | message: "Pick a project type.",
104 | options: [
105 | { value: "Application", label: "Application" },
106 | { value: "API", label: "API" },
107 | { value: "Library", label: "Library" },
108 | ],
109 | })) as typeof answers.type;
110 | checkCancel(answers.type);
111 | }
112 |
113 | if (answers.type === "Application" || answers.type === "API") {
114 | const templates =
115 | answers.type === "Application" ? applicationTemplates : serverTemplates;
116 |
117 | if (options.port) {
118 | answers.port = Number(options.port);
119 | } else {
120 | const port = (await text({
121 | message: "Port number?",
122 | initialValue: "8080",
123 | })) as string;
124 | checkCancel(port);
125 | answers.port = Number(port);
126 | }
127 |
128 | if (options.framework) {
129 | answers.framework = options.framework;
130 | } else {
131 | answers.framework = (await select({
132 | message: "Framework?",
133 | options: templates.map((template) => ({
134 | value: template,
135 | label: template,
136 | })),
137 | initialValue: answers.type === "Application" ? "react-19" : "express",
138 | })) as string;
139 | checkCancel(answers.framework);
140 | }
141 |
142 | if (answers.type === "Application") {
143 | if (options.css) {
144 | answers.css = options.css;
145 | } else {
146 | answers.css = (await select({
147 | message: "CSS?",
148 | options: [
149 | { value: "CSS", label: "CSS" },
150 | { value: "Tailwind", label: "Tailwind" },
151 | ],
152 | initialValue: "Tailwind",
153 | })) as "CSS" | "Tailwind";
154 | checkCancel(answers.css);
155 | }
156 | if (options.withZephyr) {
157 | answers.withZephyr = options.withZephyr === "yes";
158 | } else {
159 | if (
160 | answers.framework === "react-19" ||
161 | answers.framework === "react-18"
162 | ) {
163 | answers.withZephyr = (await select({
164 | message: "Add deploy withZephyr?",
165 | options: [
166 | { value: true, label: "Yes" },
167 | { value: false, label: "No" },
168 | ],
169 | initialValue: true,
170 | })) as boolean;
171 | }
172 | }
173 | }
174 | }
175 |
176 | const s = spinner();
177 | s.start("Building project...");
178 | buildProject({
179 | ...answers,
180 | });
181 | s.stop("Project built.");
182 |
183 | outro(`Your '${answers.name}' project is ready to go. Next steps:
184 |
185 | cd ${answers.name}
186 | pnpm i
187 | pnpm start
188 | `);
189 | })();
190 |
--------------------------------------------------------------------------------
/templates/library/typescript/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */
4 |
5 | /* Basic Options */
6 | // "incremental": true, /* Enable incremental compilation */
7 | "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
9 | // "lib": [], /* Specify library files to be included in the compilation. */
10 | // "allowJs": true, /* Allow javascript files to be compiled. */
11 | // "checkJs": true, /* Report errors in .js files. */
12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
13 | "declaration": true, /* Generates corresponding '.d.ts' file. */
14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
15 | // "sourceMap": true, /* Generates corresponding '.map' file. */
16 | // "outFile": "./", /* Concatenate and emit output to single file. */
17 | "outDir": "./dist", /* Redirect output structure to the directory. */
18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
19 | // "composite": true, /* Enable project compilation */
20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
21 | // "removeComments": true, /* Do not emit comments to output. */
22 | // "noEmit": true, /* Do not emit outputs. */
23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
26 |
27 | /* Strict Type-Checking Options */
28 | "strict": true, /* Enable all strict type-checking options. */
29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
30 | // "strictNullChecks": true, /* Enable strict null checks. */
31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */
32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
36 |
37 | /* Additional Checks */
38 | // "noUnusedLocals": true, /* Report errors on unused locals. */
39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
42 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
43 |
44 | /* Module Resolution Options */
45 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
46 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
47 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
48 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
49 | // "typeRoots": [], /* List of folders to include type definitions from. */
50 | // "types": [], /* Type declaration files to be included in compilation. */
51 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
52 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
53 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
54 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
55 |
56 | /* Source Map Options */
57 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
58 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
59 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
60 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
61 |
62 | /* Experimental Options */
63 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
64 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
65 |
66 | /* Advanced Options */
67 | "skipLibCheck": true, /* Skip type checking of declaration files. */
68 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
69 | },
70 | "include": [
71 | "src/**/*.ts"
72 | ],
73 | "exclude": [
74 | "node_modules"
75 | ]
76 | }
77 |
--------------------------------------------------------------------------------
/templates/server/graphql-apollo/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */
4 |
5 | /* Basic Options */
6 | // "incremental": true, /* Enable incremental compilation */
7 | "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
9 | // "lib": [], /* Specify library files to be included in the compilation. */
10 | // "allowJs": true, /* Allow javascript files to be compiled. */
11 | // "checkJs": true, /* Report errors in .js files. */
12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */
14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
15 | // "sourceMap": true, /* Generates corresponding '.map' file. */
16 | // "outFile": "./", /* Concatenate and emit output to single file. */
17 | "outDir": "./dist", /* Redirect output structure to the directory. */
18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
19 | // "composite": true, /* Enable project compilation */
20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
21 | // "removeComments": true, /* Do not emit comments to output. */
22 | // "noEmit": true, /* Do not emit outputs. */
23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
26 |
27 | /* Strict Type-Checking Options */
28 | "strict": true, /* Enable all strict type-checking options. */
29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
30 | // "strictNullChecks": true, /* Enable strict null checks. */
31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */
32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
36 |
37 | /* Additional Checks */
38 | // "noUnusedLocals": true, /* Report errors on unused locals. */
39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
42 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
43 |
44 | /* Module Resolution Options */
45 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
46 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
47 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
48 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
49 | // "typeRoots": [], /* List of folders to include type definitions from. */
50 | // "types": [], /* Type declaration files to be included in compilation. */
51 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
52 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
53 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
54 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
55 |
56 | /* Source Map Options */
57 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
58 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
59 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
60 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
61 |
62 | /* Experimental Options */
63 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
64 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
65 |
66 | /* Advanced Options */
67 | "skipLibCheck": true, /* Skip type checking of declaration files. */
68 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
69 | },
70 | "include": [
71 | "./src/**/*.ts"
72 | ],
73 | "exclude": [
74 | "node_modules"
75 | ]
76 | }
77 |
--------------------------------------------------------------------------------
/templates/server/graphql-nexus/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */
4 |
5 | /* Basic Options */
6 | // "incremental": true, /* Enable incremental compilation */
7 | "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
9 | // "lib": [], /* Specify library files to be included in the compilation. */
10 | // "allowJs": true, /* Allow javascript files to be compiled. */
11 | // "checkJs": true, /* Report errors in .js files. */
12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */
14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
15 | // "sourceMap": true, /* Generates corresponding '.map' file. */
16 | // "outFile": "./", /* Concatenate and emit output to single file. */
17 | "outDir": "./dist", /* Redirect output structure to the directory. */
18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
19 | // "composite": true, /* Enable project compilation */
20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
21 | // "removeComments": true, /* Do not emit comments to output. */
22 | // "noEmit": true, /* Do not emit outputs. */
23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
26 |
27 | /* Strict Type-Checking Options */
28 | "strict": true, /* Enable all strict type-checking options. */
29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
30 | // "strictNullChecks": true, /* Enable strict null checks. */
31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */
32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
36 |
37 | /* Additional Checks */
38 | // "noUnusedLocals": true, /* Report errors on unused locals. */
39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
42 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
43 |
44 | /* Module Resolution Options */
45 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
46 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
47 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
48 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
49 | // "typeRoots": [], /* List of folders to include type definitions from. */
50 | // "types": [], /* Type declaration files to be included in compilation. */
51 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
52 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
53 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
54 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
55 |
56 | /* Source Map Options */
57 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
58 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
59 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
60 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
61 |
62 | /* Experimental Options */
63 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
64 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
65 |
66 | /* Advanced Options */
67 | "skipLibCheck": true, /* Skip type checking of declaration files. */
68 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
69 | },
70 | "include": [
71 | "./src/**/*.ts"
72 | ],
73 | "exclude": [
74 | "node_modules"
75 | ]
76 | }
77 |
--------------------------------------------------------------------------------
/templates/server/graphql-subscriptions/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */
4 |
5 | /* Basic Options */
6 | // "incremental": true, /* Enable incremental compilation */
7 | "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
9 | // "lib": [], /* Specify library files to be included in the compilation. */
10 | // "allowJs": true, /* Allow javascript files to be compiled. */
11 | // "checkJs": true, /* Report errors in .js files. */
12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */
14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
15 | // "sourceMap": true, /* Generates corresponding '.map' file. */
16 | // "outFile": "./", /* Concatenate and emit output to single file. */
17 | "outDir": "./dist", /* Redirect output structure to the directory. */
18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
19 | // "composite": true, /* Enable project compilation */
20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
21 | // "removeComments": true, /* Do not emit comments to output. */
22 | // "noEmit": true, /* Do not emit outputs. */
23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
26 |
27 | /* Strict Type-Checking Options */
28 | "strict": true, /* Enable all strict type-checking options. */
29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
30 | // "strictNullChecks": true, /* Enable strict null checks. */
31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */
32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
36 |
37 | /* Additional Checks */
38 | // "noUnusedLocals": true, /* Report errors on unused locals. */
39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
42 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
43 |
44 | /* Module Resolution Options */
45 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
46 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
47 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
48 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
49 | // "typeRoots": [], /* List of folders to include type definitions from. */
50 | // "types": [], /* Type declaration files to be included in compilation. */
51 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
52 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
53 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
54 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
55 |
56 | /* Source Map Options */
57 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
58 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
59 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
60 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
61 |
62 | /* Experimental Options */
63 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
64 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
65 |
66 | /* Advanced Options */
67 | "skipLibCheck": true, /* Skip type checking of declaration files. */
68 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
69 | },
70 | "include": [
71 | "./src/**/*.ts"
72 | ],
73 | "exclude": [
74 | "node_modules"
75 | ]
76 | }
77 |
--------------------------------------------------------------------------------
/templates/server/express/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@cspotcode/source-map-consumer@0.8.0":
6 | version "0.8.0"
7 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
8 | integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
9 |
10 | "@cspotcode/source-map-support@0.7.0":
11 | version "0.7.0"
12 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
13 | integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
14 | dependencies:
15 | "@cspotcode/source-map-consumer" "0.8.0"
16 |
17 | "@tsconfig/node10@^1.0.7":
18 | version "1.0.8"
19 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
20 | integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
21 |
22 | "@tsconfig/node12@^1.0.7":
23 | version "1.0.9"
24 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c"
25 | integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
26 |
27 | "@tsconfig/node14@^1.0.0":
28 | version "1.0.1"
29 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
30 | integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
31 |
32 | "@tsconfig/node16@^1.0.2":
33 | version "1.0.2"
34 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
35 | integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
36 |
37 | "@types/body-parser@*":
38 | version "1.19.1"
39 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c"
40 | integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==
41 | dependencies:
42 | "@types/connect" "*"
43 | "@types/node" "*"
44 |
45 | "@types/connect@*":
46 | version "3.4.35"
47 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
48 | integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
49 | dependencies:
50 | "@types/node" "*"
51 |
52 | "@types/express-serve-static-core@^4.17.18":
53 | version "4.17.24"
54 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07"
55 | integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==
56 | dependencies:
57 | "@types/node" "*"
58 | "@types/qs" "*"
59 | "@types/range-parser" "*"
60 |
61 | "@types/express@^4.17.13":
62 | version "4.17.13"
63 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034"
64 | integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==
65 | dependencies:
66 | "@types/body-parser" "*"
67 | "@types/express-serve-static-core" "^4.17.18"
68 | "@types/qs" "*"
69 | "@types/serve-static" "*"
70 |
71 | "@types/mime@^1":
72 | version "1.3.2"
73 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
74 | integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
75 |
76 | "@types/node@*":
77 | version "16.11.4"
78 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.4.tgz#90771124822d6663814f7c1c9b45a6654d8fd964"
79 | integrity sha512-TMgXmy0v2xWyuCSCJM6NCna2snndD8yvQF67J29ipdzMcsPa9u+o0tjF5+EQNdhcuZplYuouYqpc4zcd5I6amQ==
80 |
81 | "@types/qs@*":
82 | version "6.9.7"
83 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
84 | integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
85 |
86 | "@types/range-parser@*":
87 | version "1.2.4"
88 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
89 | integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
90 |
91 | "@types/serve-static@*":
92 | version "1.13.10"
93 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9"
94 | integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==
95 | dependencies:
96 | "@types/mime" "^1"
97 | "@types/node" "*"
98 |
99 | accepts@~1.3.7:
100 | version "1.3.7"
101 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
102 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
103 | dependencies:
104 | mime-types "~2.1.24"
105 | negotiator "0.6.2"
106 |
107 | acorn-walk@^8.1.1:
108 | version "8.2.0"
109 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
110 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
111 |
112 | acorn@^8.4.1:
113 | version "8.5.0"
114 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
115 | integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
116 |
117 | arg@^4.1.0:
118 | version "4.1.3"
119 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
120 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
121 |
122 | array-flatten@1.1.1:
123 | version "1.1.1"
124 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
125 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
126 |
127 | body-parser@1.19.0:
128 | version "1.19.0"
129 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
130 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
131 | dependencies:
132 | bytes "3.1.0"
133 | content-type "~1.0.4"
134 | debug "2.6.9"
135 | depd "~1.1.2"
136 | http-errors "1.7.2"
137 | iconv-lite "0.4.24"
138 | on-finished "~2.3.0"
139 | qs "6.7.0"
140 | raw-body "2.4.0"
141 | type-is "~1.6.17"
142 |
143 | bytes@3.1.0:
144 | version "3.1.0"
145 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
146 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
147 |
148 | content-disposition@0.5.3:
149 | version "0.5.3"
150 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
151 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
152 | dependencies:
153 | safe-buffer "5.1.2"
154 |
155 | content-type@~1.0.4:
156 | version "1.0.4"
157 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
158 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
159 |
160 | cookie-signature@1.0.6:
161 | version "1.0.6"
162 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
163 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
164 |
165 | cookie@0.4.0:
166 | version "0.4.0"
167 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
168 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
169 |
170 | create-require@^1.1.0:
171 | version "1.1.1"
172 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
173 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
174 |
175 | debug@2.6.9:
176 | version "2.6.9"
177 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
178 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
179 | dependencies:
180 | ms "2.0.0"
181 |
182 | depd@~1.1.2:
183 | version "1.1.2"
184 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
185 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
186 |
187 | destroy@~1.0.4:
188 | version "1.0.4"
189 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
190 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
191 |
192 | diff@^4.0.1:
193 | version "4.0.2"
194 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
195 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
196 |
197 | ee-first@1.1.1:
198 | version "1.1.1"
199 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
200 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
201 |
202 | encodeurl@~1.0.2:
203 | version "1.0.2"
204 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
205 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
206 |
207 | escape-html@~1.0.3:
208 | version "1.0.3"
209 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
210 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
211 |
212 | etag@~1.8.1:
213 | version "1.8.1"
214 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
215 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
216 |
217 | express@^4.17.1:
218 | version "4.17.1"
219 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
220 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
221 | dependencies:
222 | accepts "~1.3.7"
223 | array-flatten "1.1.1"
224 | body-parser "1.19.0"
225 | content-disposition "0.5.3"
226 | content-type "~1.0.4"
227 | cookie "0.4.0"
228 | cookie-signature "1.0.6"
229 | debug "2.6.9"
230 | depd "~1.1.2"
231 | encodeurl "~1.0.2"
232 | escape-html "~1.0.3"
233 | etag "~1.8.1"
234 | finalhandler "~1.1.2"
235 | fresh "0.5.2"
236 | merge-descriptors "1.0.1"
237 | methods "~1.1.2"
238 | on-finished "~2.3.0"
239 | parseurl "~1.3.3"
240 | path-to-regexp "0.1.7"
241 | proxy-addr "~2.0.5"
242 | qs "6.7.0"
243 | range-parser "~1.2.1"
244 | safe-buffer "5.1.2"
245 | send "0.17.1"
246 | serve-static "1.14.1"
247 | setprototypeof "1.1.1"
248 | statuses "~1.5.0"
249 | type-is "~1.6.18"
250 | utils-merge "1.0.1"
251 | vary "~1.1.2"
252 |
253 | finalhandler@~1.1.2:
254 | version "1.1.2"
255 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
256 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
257 | dependencies:
258 | debug "2.6.9"
259 | encodeurl "~1.0.2"
260 | escape-html "~1.0.3"
261 | on-finished "~2.3.0"
262 | parseurl "~1.3.3"
263 | statuses "~1.5.0"
264 | unpipe "~1.0.0"
265 |
266 | forwarded@0.2.0:
267 | version "0.2.0"
268 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
269 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
270 |
271 | fresh@0.5.2:
272 | version "0.5.2"
273 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
274 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
275 |
276 | http-errors@1.7.2:
277 | version "1.7.2"
278 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
279 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
280 | dependencies:
281 | depd "~1.1.2"
282 | inherits "2.0.3"
283 | setprototypeof "1.1.1"
284 | statuses ">= 1.5.0 < 2"
285 | toidentifier "1.0.0"
286 |
287 | http-errors@~1.7.2:
288 | version "1.7.3"
289 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
290 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
291 | dependencies:
292 | depd "~1.1.2"
293 | inherits "2.0.4"
294 | setprototypeof "1.1.1"
295 | statuses ">= 1.5.0 < 2"
296 | toidentifier "1.0.0"
297 |
298 | iconv-lite@0.4.24:
299 | version "0.4.24"
300 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
301 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
302 | dependencies:
303 | safer-buffer ">= 2.1.2 < 3"
304 |
305 | inherits@2.0.3:
306 | version "2.0.3"
307 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
308 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
309 |
310 | inherits@2.0.4:
311 | version "2.0.4"
312 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
313 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
314 |
315 | ipaddr.js@1.9.1:
316 | version "1.9.1"
317 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
318 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
319 |
320 | make-error@^1.1.1:
321 | version "1.3.6"
322 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
323 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
324 |
325 | media-typer@0.3.0:
326 | version "0.3.0"
327 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
328 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
329 |
330 | merge-descriptors@1.0.1:
331 | version "1.0.1"
332 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
333 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
334 |
335 | methods@~1.1.2:
336 | version "1.1.2"
337 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
338 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
339 |
340 | mime-db@1.50.0:
341 | version "1.50.0"
342 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f"
343 | integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==
344 |
345 | mime-types@~2.1.24:
346 | version "2.1.33"
347 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb"
348 | integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==
349 | dependencies:
350 | mime-db "1.50.0"
351 |
352 | mime@1.6.0:
353 | version "1.6.0"
354 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
355 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
356 |
357 | ms@2.0.0:
358 | version "2.0.0"
359 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
360 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
361 |
362 | ms@2.1.1:
363 | version "2.1.1"
364 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
365 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
366 |
367 | negotiator@0.6.2:
368 | version "0.6.2"
369 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
370 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
371 |
372 | on-finished@~2.3.0:
373 | version "2.3.0"
374 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
375 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
376 | dependencies:
377 | ee-first "1.1.1"
378 |
379 | parseurl@~1.3.3:
380 | version "1.3.3"
381 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
382 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
383 |
384 | path-to-regexp@0.1.7:
385 | version "0.1.7"
386 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
387 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
388 |
389 | proxy-addr@~2.0.5:
390 | version "2.0.7"
391 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
392 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
393 | dependencies:
394 | forwarded "0.2.0"
395 | ipaddr.js "1.9.1"
396 |
397 | qs@6.7.0:
398 | version "6.7.0"
399 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
400 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
401 |
402 | range-parser@~1.2.1:
403 | version "1.2.1"
404 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
405 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
406 |
407 | raw-body@2.4.0:
408 | version "2.4.0"
409 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
410 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
411 | dependencies:
412 | bytes "3.1.0"
413 | http-errors "1.7.2"
414 | iconv-lite "0.4.24"
415 | unpipe "1.0.0"
416 |
417 | safe-buffer@5.1.2:
418 | version "5.1.2"
419 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
420 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
421 |
422 | "safer-buffer@>= 2.1.2 < 3":
423 | version "2.1.2"
424 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
425 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
426 |
427 | send@0.17.1:
428 | version "0.17.1"
429 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
430 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
431 | dependencies:
432 | debug "2.6.9"
433 | depd "~1.1.2"
434 | destroy "~1.0.4"
435 | encodeurl "~1.0.2"
436 | escape-html "~1.0.3"
437 | etag "~1.8.1"
438 | fresh "0.5.2"
439 | http-errors "~1.7.2"
440 | mime "1.6.0"
441 | ms "2.1.1"
442 | on-finished "~2.3.0"
443 | range-parser "~1.2.1"
444 | statuses "~1.5.0"
445 |
446 | serve-static@1.14.1:
447 | version "1.14.1"
448 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
449 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
450 | dependencies:
451 | encodeurl "~1.0.2"
452 | escape-html "~1.0.3"
453 | parseurl "~1.3.3"
454 | send "0.17.1"
455 |
456 | setprototypeof@1.1.1:
457 | version "1.1.1"
458 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
459 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
460 |
461 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
462 | version "1.5.0"
463 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
464 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
465 |
466 | toidentifier@1.0.0:
467 | version "1.0.0"
468 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
469 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
470 |
471 | ts-node@^10.4.0:
472 | version "10.4.0"
473 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7"
474 | integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==
475 | dependencies:
476 | "@cspotcode/source-map-support" "0.7.0"
477 | "@tsconfig/node10" "^1.0.7"
478 | "@tsconfig/node12" "^1.0.7"
479 | "@tsconfig/node14" "^1.0.0"
480 | "@tsconfig/node16" "^1.0.2"
481 | acorn "^8.4.1"
482 | acorn-walk "^8.1.1"
483 | arg "^4.1.0"
484 | create-require "^1.1.0"
485 | diff "^4.0.1"
486 | make-error "^1.1.1"
487 | yn "3.1.1"
488 |
489 | type-is@~1.6.17, type-is@~1.6.18:
490 | version "1.6.18"
491 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
492 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
493 | dependencies:
494 | media-typer "0.3.0"
495 | mime-types "~2.1.24"
496 |
497 | typescript@^4.4.4:
498 | version "4.4.4"
499 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c"
500 | integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==
501 |
502 | unpipe@1.0.0, unpipe@~1.0.0:
503 | version "1.0.0"
504 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
505 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
506 |
507 | utils-merge@1.0.1:
508 | version "1.0.1"
509 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
510 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
511 |
512 | vary@~1.1.2:
513 | version "1.1.2"
514 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
515 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
516 |
517 | yn@3.1.1:
518 | version "3.1.1"
519 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
520 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
521 |
--------------------------------------------------------------------------------