better bun support

This commit is contained in:
jacob
2024-04-18 09:38:41 -05:00
parent ef6800b59b
commit 145eeb44ec
3 changed files with 116 additions and 216 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "@sern/create-bot", "name": "@sern/create-bot",
"version": "1.7.0", "version": "1.8.0",
"main": "./dist/index.js", "main": "./dist/index.js",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
@@ -20,13 +20,11 @@
"dependencies": { "dependencies": {
"colorette": "^2.0.20", "colorette": "^2.0.20",
"minimist": "^1.2.8", "minimist": "^1.2.8",
"prompts": "^2.4.2", "prompts": "^2.4.2"
"semver": "^7.5.4"
}, },
"devDependencies": { "devDependencies": {
"@types/minimist": "^1.2.2", "@types/minimist": "^1.2.2",
"@types/prompts": "^2.4.4", "@types/prompts": "^2.4.4",
"@types/semver": "^7.5.6",
"typescript": "^5.0.0" "typescript": "^5.0.0"
}, },
"engines": { "engines": {

View File

@@ -4,9 +4,8 @@ import minimist from 'minimist';
import path from 'path'; import path from 'path';
import fs from 'fs'; import fs from 'fs';
import assert from 'node:assert'; import assert from 'node:assert';
import { spawn, execSync } from 'node:child_process'; import { spawn } from 'node:child_process';
import { fileURLToPath } from 'node:url'; import { fileURLToPath } from 'node:url';
import semver from 'semver';
const argv = minimist<{ const argv = minimist<{
template?: string; template?: string;
@@ -22,6 +21,7 @@ const metadataPath = path.resolve(packageDirectory, "../..", "metadata", "templa
const templateChoices = const templateChoices =
JSON.parse(fs.readFileSync(metadataPath, 'utf8')) as { title: string, value: string }[]; JSON.parse(fs.readFileSync(metadataPath, 'utf8')) as { title: string, value: string }[];
const template: PromptObject = { const template: PromptObject = {
message: 'Choose template', message: 'Choose template',
name: 'template', name: 'template',
@@ -70,6 +70,30 @@ const which_manager: PromptObject = {
}, },
], ],
}; };
const which_install_cli = {
message: `How do you want to install the sern/cli?`,
name: 'manager',
type: 'select',
choices: [
{
title: 'NPM',
description: 'Default Package Manager',
selected: true,
value: 'npm',
},
{
title: 'bun',
description: 'Bun',
value: 'bun',
},
{
title: 'Skip (Not recommended)',
description: 'Instead of installing globally, use bunx or npx to manage projects',
value: 'skip',
},
],
} as const
async function runInteractive() { async function runInteractive() {
const result: prompt.Answers<'template' | 'name' | 'manageBuild'> = await prompt( const result: prompt.Answers<'template' | 'name' | 'manageBuild'> = await prompt(
[template, name], [template, name],
@@ -91,8 +115,7 @@ async function runInteractive() {
fs.mkdirSync(root, { recursive: true }); fs.mkdirSync(root, { recursive: true });
} }
const configJson = createConfig( const configJson = createConfig((result.template as string).includes('ts'));
(result.template as string).includes('ts'));
await createProject( await createProject(
result.name, result.name,
configJson, configJson,
@@ -108,30 +131,26 @@ async function runInteractive() {
}, },
}) })
const jsonDeps = JSON.parse(String(execSync('npm ls -g --json'))); console.log(`Installing ${magentaBright('@sern/cli')}:`)
const cliVersion = jsonDeps.dependencies['@sern/cli']?.version;
if(semver.satisfies(cliVersion, '1.x')) { //@ts-ignore
console.log('You already have a good enough sern cli.'); const selection = await prompt([which_install_cli])
} else { await new Promise((resolve, reject) => {
console.log(`Installing ${magentaBright('@sern/cli')}:`) const child = spawn(selection.manager, ['install', '-g', '@sern/cli@latest'], { cwd, shell: true });
await new Promise((resolve, reject) => { child.on('data', (s) => console.log(s.toString()));
const child = spawn('npm', ['install', '-g', '@sern/cli@latest'], { cwd, shell: true }); child.on('error', (e) => {
child.on('data', (s) => console.log(s.toString())); console.error(e);
child.on('error', (e) => { console.log(red('Something went wrong with installing. Please do it yourself.'));
console.error(e); reject();
console.log(red('Something went wrong with installing. Please do it yourself.')); });
reject(); child.on('close', resolve)
}); })
child.on('close', resolve)
})
}
await runInstall(install.manager !== 'skip', root, install.manager); await runInstall(install.manager !== 'skip', root, install.manager);
} }
async function runShort( async function runShort(
templateName: string, templateName: string,
name: string, name: string,
installCli: boolean,
pkgManager?: 'yarn' | 'npm' | 'pnpm' pkgManager?: 'yarn' | 'npm' | 'pnpm'
) { ) {
const fullTemplateName = `template-${templateName}`; const fullTemplateName = `template-${templateName}`;
@@ -144,11 +163,7 @@ async function runShort(
throw new Error(red('✖') + ' Could not find template: ' + templateName); throw new Error(red('✖') + ' Could not find template: ' + templateName);
} }
const root = path.join(cwd, name); const root = path.join(cwd, name);
const selectedTemplate = path.resolve( const selectedTemplate = path.resolve(packageDirectory, '../..', fullTemplateName);
packageDirectory,
'../..',
fullTemplateName
);
if (argv.overwrite) { if (argv.overwrite) {
emptyDir(root); emptyDir(root);
} else if (!fs.existsSync(root)) { } else if (!fs.existsSync(root)) {
@@ -157,27 +172,20 @@ async function runShort(
const configJson = createConfig(templateName.includes('ts')); const configJson = createConfig(templateName.includes('ts'));
await createProject(name, configJson, root, selectedTemplate, argv.overwrite); await createProject(name, configJson, root, selectedTemplate, argv.overwrite);
//@ts-ignore
if(installCli) { const selection = await prompt([which_install_cli])
const jsonDeps = JSON.parse(String(execSync('npm ls -g --json'))); console.log(`Installing ${magentaBright('@sern/cli')}:`)
const cliVersion = jsonDeps.dependencies['@sern/cli']?.version; await new Promise((resolve, reject) => {
if(semver.satisfies(cliVersion, '1.x')) { const child = spawn(selection.manager, ['install', '-g', '@sern/cli@latest'], { cwd, shell: true });
console.log('You already have a good enough sern cli.'); child.stdout.pipe(process.stdout)
} else { child.on('data', (s) => console.log(s.toString()));
console.log(`Installing ${magentaBright('@sern/cli')}:`) child.on('error', (e) => {
await new Promise((resolve, reject) => { console.error(e);
const child = spawn('npm', ['install', '-g', '@sern/cli@latest'], { cwd, shell: true }); console.log(red('Something went wrong with installing. Please do it yourself.'));
child.stdout.pipe(process.stdout) reject();
child.on('data', (s) => console.log(s.toString())); });
child.on('error', (e) => { child.on('close', resolve)
console.error(e); })
console.log(red('Something went wrong with installing. Please do it yourself.'));
reject();
});
child.on('close', resolve)
})
}
}
await runInstall(Boolean(pkgManager), root, pkgManager); await runInstall(Boolean(pkgManager), root, pkgManager);
} }
@@ -190,13 +198,8 @@ async function createProject(
overwrite?: boolean overwrite?: boolean
) { ) {
console.log( console.log(magentaBright(`overwrite`) + `: ${overwrite ?? false};\n` +
magentaBright(`overwrite`) + magentaBright('copy') + `: ${selectedTemplate} ${root}`);
`: ${overwrite ?? false};` +
`\n` +
magentaBright('copy') +
`: ${selectedTemplate} ${root}`
);
await copyFolderRecursiveAsync(selectedTemplate, root); await copyFolderRecursiveAsync(selectedTemplate, root);
console.log( console.log(
`Writing ${magentaBright('sern.config.json')} to ${name}/sern.config.json` `Writing ${magentaBright('sern.config.json')} to ${name}/sern.config.json`
@@ -267,11 +270,11 @@ async function init() {
'^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$', '^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$',
'g'), 'g'),
"project name does not match the regular expression"); "project name does not match the regular expression");
await runShort(argv.template, argv.name, true, argv.install); await runShort(argv.template, argv.name, argv.install);
} }
console.log(magentaBright('Done!') console.log(
+ ' visit https://sern.dev for documentation and join https://sern.dev/discord! Happy hacking :)'); magentaBright('Done!'), 'visit https://sern.dev for documentation and join https://sern.dev/discord! Happy hacking :)');
} }
@@ -288,33 +291,11 @@ function emptyDir(dir: string) {
} }
async function copyFolderRecursiveAsync(source: string, target: string) { async function copyFolderRecursiveAsync(source: string, target: string) {
try { try {
// Create target folder if it doesn't exist await fs.promises.cp(source, target, { recursive: true });
if (!fs.existsSync(target)) { } catch (err) {
fs.mkdirSync(target); console.error('Error moving directory:', err);
} }
// Get all files and folders in the source folder
const files = await fs.promises.readdir(source);
for (const file of files) {
const currentSource = path.join(source, file);
const currentTarget = path.join(target, file);
// Check if the current item is a file or a folder
const stats = await fs.promises.stat(currentSource);
if (stats.isDirectory()) {
// Recursively copy the subfolder
await copyFolderRecursiveAsync(currentSource, currentTarget);
} else {
// Copy the file
await fs.promises.copyFile(currentSource, currentTarget);
}
}
} catch (err) {
throw Error('An error occurred: ' + err);
}
} }
init(); init();

175
yarn.lock
View File

@@ -1,140 +1,61 @@
# This file is generated by running "yarn install" inside your project. # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# Manual changes might be lost - proceed with caution! # yarn lockfile v1
__metadata:
version: 6
cacheKey: 8
"@sern/create-bot@workspace:.": "@types/minimist@^1.2.2":
version: 0.0.0-use.local version "1.2.5"
resolution: "@sern/create-bot@workspace:." resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e"
integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==
"@types/node@*":
version "20.12.7"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384"
integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==
dependencies: dependencies:
"@types/minimist": ^1.2.2 undici-types "~5.26.4"
"@types/prompts": ^2.4.4
"@types/semver": ^7.5.6
colorette: ^2.0.20
minimist: ^1.2.8
prompts: ^2.4.2
semver: ^7.5.4
typescript: ^5.0.0
bin:
create-bot: index.js
mkbot: index.js
languageName: unknown
linkType: soft
"@types/minimist@npm:^1.2.2": "@types/prompts@^2.4.4":
version: 1.2.2 version "2.4.9"
resolution: "@types/minimist@npm:1.2.2" resolved "https://registry.yarnpkg.com/@types/prompts/-/prompts-2.4.9.tgz#8775a31e40ad227af511aa0d7f19a044ccbd371e"
checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d integrity sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==
languageName: node
linkType: hard
"@types/node@npm:*":
version: 20.2.5
resolution: "@types/node@npm:20.2.5"
checksum: 38ce7c7e9d76880dc632f71d71e0d5914fcda9d5e9a7095d6c339abda55ca4affb0f2a882aeb29398f8e09d2c5151f0b6586c81c8ccdfe529c34b1ea3337425e
languageName: node
linkType: hard
"@types/prompts@npm:^2.4.4":
version: 2.4.4
resolution: "@types/prompts@npm:2.4.4"
dependencies: dependencies:
"@types/node": "*" "@types/node" "*"
kleur: ^3.0.3 kleur "^3.0.3"
checksum: fa8d9a6f63f5e7f4a5b9bd4d40527ca4b8c8c6a63bf0864bf72ea85706a9e1b292d73c8c9a3b7423fb80a5d3e7d563d0069d6644384438c1251adbd9efc03a12
languageName: node
linkType: hard
"@types/semver@npm:^7.5.6": colorette@^2.0.20:
version: 7.5.6 version "2.0.20"
resolution: "@types/semver@npm:7.5.6" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
checksum: 563a0120ec0efcc326567db2ed920d5d98346f3638b6324ea6b50222b96f02a8add3c51a916b6897b51523aad8ac227d21d3dcf8913559f1bfc6c15b14d23037 integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
languageName: node
linkType: hard
"colorette@npm:^2.0.20": kleur@^3.0.3:
version: 2.0.20 version "3.0.3"
resolution: "colorette@npm:2.0.20" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
languageName: node
linkType: hard
"kleur@npm:^3.0.3": minimist@^1.2.8:
version: 3.0.3 version "1.2.8"
resolution: "kleur@npm:3.0.3" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
checksum: df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169 integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
languageName: node
linkType: hard
"lru-cache@npm:^6.0.0": prompts@^2.4.2:
version: 6.0.0 version "2.4.2"
resolution: "lru-cache@npm:6.0.0" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
dependencies: dependencies:
yallist: ^4.0.0 kleur "^3.0.3"
checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 sisteransi "^1.0.5"
languageName: node
linkType: hard
"minimist@npm:^1.2.8": sisteransi@^1.0.5:
version: 1.2.8 version "1.0.5"
resolution: "minimist@npm:1.2.8" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
languageName: node
linkType: hard
"prompts@npm:^2.4.2": typescript@^5.0.0:
version: 2.4.2 version "5.4.5"
resolution: "prompts@npm:2.4.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611"
dependencies: integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==
kleur: ^3.0.3
sisteransi: ^1.0.5
checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d
languageName: node
linkType: hard
"semver@npm:^7.5.4": undici-types@~5.26.4:
version: 7.5.4 version "5.26.5"
resolution: "semver@npm:7.5.4" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
dependencies: integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
lru-cache: ^6.0.0
bin:
semver: bin/semver.js
checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3
languageName: node
linkType: hard
"sisteransi@npm:^1.0.5":
version: 1.0.5
resolution: "sisteransi@npm:1.0.5"
checksum: aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4
languageName: node
linkType: hard
"typescript@npm:^5.0.0":
version: 5.1.3
resolution: "typescript@npm:5.1.3"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: d9d51862d98efa46534f2800a1071a613751b1585dc78884807d0c179bcd93d6e9d4012a508e276742f5f33c480adefc52ffcafaf9e0e00ab641a14cde9a31c7
languageName: node
linkType: hard
"typescript@patch:typescript@^5.0.0#~builtin<compat/typescript>":
version: 5.1.3
resolution: "typescript@patch:typescript@npm%3A5.1.3#~builtin<compat/typescript>::version=5.1.3&hash=5da071"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: 6f0a9dca6bf4ce9dcaf4e282aade55ef4c56ecb5fb98d0a4a5c0113398815aea66d871b5611e83353e5953a19ed9ef103cf5a76ac0f276d550d1e7cd5344f61e
languageName: node
linkType: hard
"yallist@npm:^4.0.0":
version: 4.0.0
resolution: "yallist@npm:4.0.0"
checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5
languageName: node
linkType: hard