Skip to content

Commit

Permalink
Merge branch 'refs/heads/pr/4'
Browse files Browse the repository at this point in the history
# Conflicts:
#	package.json
#	src/index.ts
#	tsconfig.json
#	yarn.lock
  • Loading branch information
fearandesire committed Jun 28, 2024
2 parents 2a26b21 + 520bc36 commit 72e6ec0
Show file tree
Hide file tree
Showing 16 changed files with 3,671 additions and 2,478 deletions.
109 changes: 40 additions & 69 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,94 +2,65 @@
"name": "saph-convert",
"version": "1.0.2",
"description": "CLI tool to effortlessly convert Sapphire.js JavaScript commands to TypeScript",
"main": "dist/cli.js",
"imports": {
"#root": "./dist/*.js",
"#lib/*": "./dist/lib/*.js",
"#functions": "./dist/functions/index.js",
"#functions/*": "./dist/functions/*.js",
"#commands/*": "./dist/commands/*.js",
"#constants": "./dist/constants.js"
},
"scripts": {
"build": "tsc",
"dev": "tsx src/cli.ts",
"start": "node dist/cli.js",
"release": "yarn release-it"
},
"bin": "dist/cli.js",
"keywords": [
"sapphire.js command converter",
"js converter",
"command-line",
"cli",
"js-to-ts",
"code-conversion",
"typescript-converter",
"sapphire-converter",
"node.js",
"programming"
],
"author": "fearandesire <fenixcoding@gmail.com>",
"repository": {
"type": "git",
"url": "https://github.com/fearandesire/saph-convert"
},
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"bin": "dist/index.js",
"sideEffects": "false",
"files": [
"dist/**/*.js"
],
"scripts": {
"lint": "eslint src --ext ts --fix",
"prettier": "prettier --ignore-path=.prettierignore",
"format": "prettier --write .",
"build": "tsc -b src",
"clean": "tsc -b src --clean",
"watch": "tsc -b src -w",
"bump": "cliff-jumper",
"check-update": "cliff-jumper --dry-run",
"prepack": "yarn build"
},
"packageManager": "yarn@4.2.2",
"dependencies": {
"ansis": "^3.2.0",
"commander": "^12.1.0",
"ts-morph": "^22.0.0"
},
"devDependencies": {
"@commitlint/cli": "^19.3.0",
"@commitlint/config-conventional": "^19.2.2",
"@favware/cliff-jumper": "^4.0.2",
"@favware/npm-deprecate": "^1.0.2",
"@sapphire/eslint-config": "^5.0.5",
"@sapphire/prettier-config": "^2.0.0",
"@sapphire/ts-config": "^5.0.1",
"@sapphire/decorators": "^6.1.0",
"@sapphire/framework": "^5.2.1",
"@types/lodash": "^4.17.4",
"@types/node": "^20.14.1",
"@typescript-eslint/eslint-plugin": "^7.11.0",
"@typescript-eslint/parser": "^7.12.0",
"cz-conventional-changelog": "^3.3.0",
"eslint": "^8.57.0",
"discord.js": "^14.15.3",
"eslint": "^9.5.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3",
"globals": "^15.6.0",
"lint-staged": "^15.2.7",
"prettier": "^3.3.0",
"release-it": "^17.3.0",
"release-it-changelogen": "^0.1.0",
"tsconfig-paths": "^4.2.0",
"tsx": "^4.11.0",
"typescript": "^5.5.2",
"vitest": "^1.6.0"
},
"engines": {
"node": ">=v18"
},
"keywords": [
"sapphire.js command converter",
"js converter",
"command-line",
"cli",
"js-to-ts",
"code-conversion",
"typescript-converter",
"sapphire-converter",
"node.js",
"programming"
],
"repository": {
"type": "git",
"url": "git+https://github.com/fearandesire/saph-convert.git"
},
"bugs": {
"url": "https://github.com/fearandesire/saph-convert/issues"
},
"commitlint": {
"extends": [
"@commitlint/config-conventional"
]
},
"lint-staged": {
"*": "prettier --ignore-unknown --write",
"*.{mjs,js,ts}": "eslint --fix --ext mjs,js,ts"
},
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
},
"publishConfig": {
"access": "public"
},
"prettier": "@sapphire/prettier-config",
"packageManager": "yarn@4.3.1"
}
}
65 changes: 65 additions & 0 deletions src/cli.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/usr/bin/env node
import { convertDirectory } from '#commands/convert-directory'
import { convertFile } from '#commands/convert-file'
import {
overwriteOptionsDefaultValue,
overwriteOptionsDescription,
overwriteOptionsFlag,
replaceOptionsDefaultValue,
replaceOptionsDescription,
replaceOptionsFlag,
} from '#constants'
import { Command } from 'commander'

export const cli = new Command()

cli.name('saph-convert')
.description('CLI tool to convert Sapphire.js command files from JS to TS')
.version('1.0.0')

cli.option(
replaceOptionsFlag,
replaceOptionsDescription,
replaceOptionsDefaultValue,
)

cli.option(
overwriteOptionsFlag,
overwriteOptionsDescription,
overwriteOptionsDefaultValue,
)

cli.command('convert-file')
.aliases(['cf', 'file', 'f'])
.description('Convert a specific JS command file to TS')
.argument('<inputFile>', 'Path to the JS command file to convert')
.argument(
'[outputPath]',
'Output path for the TS file. Defaults to same directory as input file.',
)
.addHelpText(
'afterAll',
`\nExample:\n $ saph-convert cf src/commands/myCommand.js [dist/commands/myCommand]\n`,
)
.action(convertFile)

cli.command('convert-directory')
.aliases(['cd', 'directory', 'd'])
.description(
'Recursively convert all JS command files in a directory to TS',
)
.argument(
'<directory>',
'Directory containing Sapphire.js JS command files to convert to TS. ❗ Be cautious: this will blindly convert by the `.js` extension in the directory',
)
.argument(
'[outputDirectory]',
'Output directory for the TS files. Defaults to same directory as input.',
)
.addHelpText(
'afterAll',
`\nExample:\n $ saph-convert cdir src/commands [dist/commands]\n`,
)
.action(convertDirectory)

cli.parse(process.argv)
56 changes: 56 additions & 0 deletions src/commands/convert-directory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import {
convertToTypeScript,
findJavaScriptFiles,
readJavaScriptFile,
saveTypeScriptFile,
} from '#functions'
import { CommandOptions } from '#lib/types'
import { cli } from '#root/cli'
import path from 'path'
import Logger from '../lib/Logger'

/**
* Recursively converts all JavaScript files in a directory to TypeScript.
*
* @param {string} inputDirectory - The directory containing JavaScript files to convert.
* @param outputDirectory - The output directory for the TypeScript files.
*/
export const convertDirectory = async (
inputDirectory: string,
outputDirectory?: string,
): Promise<void> => {
const { overwrite, replace } = cli.opts<CommandOptions>()
try {
const jsFiles = await findJavaScriptFiles(inputDirectory)
const totalFiles = jsFiles.length
if (totalFiles === 0) {
Logger.error(
`No JavaScript files found in directory ${inputDirectory}.`,
)
return
} else {
Logger.info(
`Converting ${totalFiles} JavaScript files to TypeScript...`,
)
}
for (const jsFile of jsFiles) {
const relativePath = path.relative(inputDirectory, jsFile)
const outputPath = outputDirectory
? path.join(
outputDirectory,
relativePath.replace(/\.js$/, '.ts'),
)
: jsFile.replace(/\.js$/, '.ts')
const jsCode = await readJavaScriptFile(jsFile)
const tsCode = convertToTypeScript(jsCode)
await saveTypeScriptFile(tsCode, outputPath, overwrite, replace)
}
Logger.info(`Completed TS conversion!`)
} catch (error: unknown) {
if (error instanceof Error) {
Logger.error(`Error: ${error.message}`)
} else {
Logger.error(`Unexpected error occurred`)
}
}
}
40 changes: 40 additions & 0 deletions src/commands/convert-file.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import {
convertToTypeScript,
readJavaScriptFile,
saveTypeScriptFile,
} from '#functions'
import Logger from '#lib/Logger'
import { CommandOptions } from '#lib/types'
import { cli } from '#root/cli'
import path from 'path'

/**
* Converts a specific JavaScript file to TypeScript.
*
* @param {string} inputFile - The JavaScript file to convert.
* @param {string} outputPath - The output path for the TypeScript file.
*/
export const convertFile = async (
inputFile: string,
outputPath?: string,
): Promise<void> => {
const { overwrite, replace } = cli.opts<CommandOptions>()
try {
const jsCode = await readJavaScriptFile(inputFile)
const tsCode = convertToTypeScript(jsCode)
if (!outputPath) {
outputPath = path.join(
path.dirname(inputFile),
path.basename(inputFile, '.js'),
)
}
await saveTypeScriptFile(tsCode, outputPath, overwrite, replace)
Logger.info(`Cmd converted & saved to ${outputPath}`)
} catch (error: unknown) {
if (error instanceof Error) {
Logger.error(`Error: ${error.message}`)
} else {
Logger.error(`Unexpected error occurred`)
}
}
}
9 changes: 9 additions & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export const replaceOptionsFlag = '-r, --replace'
export const replaceOptionsDescription =
'Replace original JS command files with converted TypeScript files. Default: Disabled'
export const replaceOptionsDefaultValue = false

export const overwriteOptionsFlag = '-o, --overwrite'
export const overwriteOptionsDescription =
'Overwrite existing TypeScript files. Default: Enabled'
export const overwriteOptionsDefaultValue = true
Loading

0 comments on commit 72e6ec0

Please sign in to comment.