@tsed/cli
Version:
CLI to bootstrap your Ts.ED project
407 lines (406 loc) • 11.5 kB
JavaScript
import { ArchitectureConvention, PlatformType, ProjectConvention } from "../../../interfaces/index.js";
import { hasFeature, hasValue } from "../utils/hasFeature.js";
import { isPlatform } from "../utils/isPlatform.js";
export var FeatureType;
(function (FeatureType) {
FeatureType["GRAPHQL"] = "graphql";
FeatureType["SOCKETIO"] = "socketio";
FeatureType["OIDC"] = "oidc";
FeatureType["PASSPORTJS"] = "passportjs";
FeatureType["COMMANDS"] = "commands";
FeatureType["DB"] = "db";
FeatureType["DOC"] = "doc";
// DOC
FeatureType["SWAGGER"] = "swagger";
FeatureType["SCALAR"] = "scalar";
// ORM
FeatureType["PRISMA"] = "prisma";
FeatureType["MONGOOSE"] = "mongoose";
// TYPEORM
FeatureType["TYPEORM"] = "typeorm";
FeatureType["TYPEORM_MYSQL"] = "typeorm:mysql";
FeatureType["TYPEORM_MARIADB"] = "typeorm:mariadb";
FeatureType["TYPEORM_POSTGRES"] = "typeorm:postgres";
FeatureType["TYPEORM_COCKROACHDB"] = "typeorm:cockroachdb";
FeatureType["TYPEORM_SQLITE"] = "typeorm:sqlite";
FeatureType["TYPEORM_BETTER_SQLITE3"] = "typeorm:better-sqlite3";
FeatureType["TYPEORM_CORDOVA"] = "typeorm:cordova";
FeatureType["TYPEORM_NATIVESCRIPT"] = "typeorm:nativescript";
FeatureType["TYPEORM_ORACLE"] = "typeorm:oracle";
FeatureType["TYPEORM_MSSQL"] = "typeorm:mssql";
FeatureType["TYPEORM_MONGODB"] = "typeorm:mongodb";
FeatureType["TYPEORM_SQLJS"] = "typeorm:sqljs";
FeatureType["TYPEORM_REACTNATIVE"] = "typeorm:reactnative";
FeatureType["TYPEORM_EXPO"] = "typeorm:expo";
// TESTING
FeatureType["TESTING"] = "testing";
FeatureType["JEST"] = "jest";
FeatureType["VITEST"] = "vitest";
FeatureType["LINTER"] = "linter";
FeatureType["ESLINT"] = "eslint";
FeatureType["LINT_STAGED"] = "lintstaged";
FeatureType["PRETTIER"] = "prettier";
})(FeatureType || (FeatureType = {}));
export const FeaturesMap = {
[]: {
name: "Express.js",
checked: (options) => options.platform === PlatformType.EXPRESS || !options.platform
},
[]: {
name: "Koa.js",
checked: (options) => options.platform === PlatformType.KOA
},
[]: {
name: "Fastify.js (beta)",
checked: (options) => options.platform === PlatformType.FASTIFY
},
[]: {
name: "TypeGraphQL",
dependencies: {
"@tsed/typegraphql": "{{tsedVersion}}"
},
devDependencies: {
"@tsed/cli-plugin-typegraphql": "{{cliVersion}}"
}
},
[]: {
name: "Documentation"
},
[]: {
name: "Database"
},
[]: {
name: "Passport.js",
when: isPlatform(PlatformType.EXPRESS),
devDependencies: {
"@tsed/cli-plugin-passport": "{{cliVersion}}"
}
},
[]: {
name: "Socket.io",
dependencies: {
"@tsed/socketio": "{{tsedVersion}}",
"socket.io": "latest"
}
},
[]: {
name: "Swagger",
dependencies: {
"@tsed/swagger": "{{tsedVersion}}"
}
},
[]: {
name: "Scalar",
dependencies: {
"@tsed/scalar": "{{tsedVersion}}"
}
},
[]: {
name: "OpenID Connect provider",
devDependencies: {
"@tsed/cli-plugin-oidc-provider": "{{cliVersion}}"
}
},
[]: {
name: "Testing",
dependencies: {},
devDependencies: {
"@types/supertest": "latest",
supertest: "latest"
}
},
[]: {
name: "Linter"
},
[]: {
name: "Commands",
dependencies: {
"@tsed/cli-core": "{{cliVersion}}"
},
devDependencies: {
"@types/inquirer": "^8.2.4"
}
},
[]: {
name: "Ts.ED",
checked: true
},
[]: {
name: "Angular",
checked: false
},
[]: {
name: "Ts.ED",
checked: true
},
[]: {
name: "Feature",
checked: false
},
[]: {
name: "MySQL",
dependencies: {
mysql2: "latest"
}
},
[]: {
name: "MariaDB",
dependencies: {
mariadb: "latest"
}
},
[]: {
name: "Postgres",
dependencies: {
pg: "latest"
}
},
[]: {
name: "CockRoachDB",
dependencies: {
cockroachdb: "latest"
}
},
[]: {
name: "SQLite",
dependencies: {
sqlite3: "latest"
}
},
[]: {
name: "Better SQLite3",
dependencies: {
"better-sqlite3": "latest"
}
},
[]: {
name: "Cordova"
},
[]: {
name: "NativeScript"
},
[]: {
name: "Oracle",
dependencies: {
oracledb: "latest"
}
},
[]: {
name: "MsSQL",
dependencies: {
mssql: "latest"
}
},
[]: {
name: "MongoDB",
dependencies: {
mongodb: "latest"
}
},
[]: {
name: "SQL.js"
},
[]: {
name: "ReactNative"
},
[]: {
name: "Expo"
},
[]: {
name: "Prisma",
devDependencies: {
"@tsed/cli-plugin-prisma": "{{cliVersion}}"
}
},
[]: {
name: "Mongoose",
devDependencies: {
"@tsed/cli-plugin-mongoose": "{{cliVersion}}"
}
},
[]: {
name: "TypeORM",
devDependencies: {
"@tsed/cli-plugin-typeorm": "{{cliVersion}}",
typeorm: "latest"
}
},
[]: {
name: "Vitest",
devDependencies: {
"@tsed/cli-plugin-vitest": "{{cliVersion}}"
}
},
[]: {
name: "Jest (unstable with ESM)",
devDependencies: {
"@tsed/cli-plugin-jest": "{{cliVersion}}"
}
},
[]: {
name: "EsLint",
checked: true,
devDependencies: {
"@tsed/cli-plugin-eslint": "{{cliVersion}}"
}
},
[]: {
name: "Prettier"
},
[]: {
name: "Lint on commit"
},
node: {
name: "Node.js + SWC",
checked: true
},
babel: {
name: "Node.js + Babel",
checked: false
},
webpack: {
name: "Node.js + Webpack",
checked: false
},
bun: {
name: "Bun.js",
checked: false
},
yarn: {
name: "Yarn",
checked: true
},
yarn_berry: {
name: "Yarn Berry",
checked: false
},
npm: {
name: "NPM",
checked: false
},
pnpm: {
name: "PNPM",
checked: false
}
};
export const FrameworksPrompt = {
message: "Choose the target Framework:",
type: "list",
name: "platform",
choices: [PlatformType.EXPRESS, PlatformType.KOA, PlatformType.FASTIFY]
};
export const FeaturesPrompt = (availableRuntimes, availablePackageManagers) => [
FrameworksPrompt,
{
message: "Choose the architecture for your project:",
type: "list",
name: "architecture",
choices: [ArchitectureConvention.DEFAULT, ArchitectureConvention.FEATURE]
},
{
message: "Choose the convention file styling:",
type: "list",
name: "convention",
choices: [ProjectConvention.DEFAULT, ProjectConvention.ANGULAR]
},
{
type: "checkbox",
name: "features",
message: "Check the features needed for your project",
choices: [
FeatureType.GRAPHQL,
FeatureType.DB,
FeatureType.PASSPORTJS,
FeatureType.SOCKETIO,
FeatureType.DOC,
FeatureType.OIDC,
FeatureType.TESTING,
FeatureType.LINTER,
FeatureType.COMMANDS
]
},
{
type: "checkbox",
message: "Choose a documentation plugin",
name: "featuresDoc",
when: hasFeature(FeatureType.DOC),
choices: [FeatureType.SWAGGER, FeatureType.SCALAR]
},
{
message: "Choose a ORM manager",
type: "list",
name: "featuresDB",
when: hasFeature(FeatureType.DB),
choices: [FeatureType.PRISMA, FeatureType.MONGOOSE, FeatureType.TYPEORM]
},
{
type: "list",
name: "featuresTypeORM",
message: "Which TypeORM you want to install?",
choices: [
FeatureType.TYPEORM_MYSQL,
FeatureType.TYPEORM_MARIADB,
FeatureType.TYPEORM_POSTGRES,
FeatureType.TYPEORM_COCKROACHDB,
FeatureType.TYPEORM_SQLITE,
FeatureType.TYPEORM_BETTER_SQLITE3,
FeatureType.TYPEORM_CORDOVA,
FeatureType.TYPEORM_NATIVESCRIPT,
FeatureType.TYPEORM_ORACLE,
FeatureType.TYPEORM_MSSQL,
FeatureType.TYPEORM_MONGODB,
FeatureType.TYPEORM_SQLJS,
FeatureType.TYPEORM_REACTNATIVE,
FeatureType.TYPEORM_EXPO
],
when: hasValue("featuresDB", FeatureType.TYPEORM)
},
// {
// type: "password",
// name: "GH_TOKEN",
// message:
// "Enter GH_TOKEN to use the premium @tsedio/prisma package or leave blank (see https://tsed.dev/tutorials/prisma-client.html)",
// when: hasValue("featuresDB.type", "prisma")
// },
{
message: "Choose unit framework",
type: "list",
name: "featuresTesting",
when: hasFeature(FeatureType.TESTING),
choices: [FeatureType.VITEST, FeatureType.JEST]
},
{
message: "Choose linter tools framework",
type: "list",
name: "featuresLinter",
when: hasFeature(FeatureType.LINTER),
choices: [FeatureType.ESLINT]
},
{
message: "Choose extra linter tools",
type: "checkbox",
name: "featuresExtraLinter",
when: hasFeature(FeatureType.LINTER),
choices: [FeatureType.PRETTIER, FeatureType.LINT_STAGED]
},
{
message: "Choose the OIDC base path server",
name: "oidcBasePath",
default: "/oidc",
when: hasFeature(FeatureType.OIDC),
type: "input"
},
{
message: "Choose the runtime:",
type: "list",
name: "runtime",
choices: availableRuntimes
},
{
message: "Choose the package manager:",
type: "list",
name: "packageManager",
when: hasValue("runtime", ["node", "babel", "swc", "webpack"]),
choices: availablePackageManagers
}
];