@rock-js/tools
Advanced tools
| /** | ||
| * Rename common files that cannot be put into template literaly, e.g. .gitignore. | ||
| */ | ||
| export declare function renameCommonFiles(projectPath: string): void; | ||
| /** | ||
| * Replace placeholder with project nae in whole template: | ||
| * - Rename paths containing placeholder | ||
| * - Replace placeholder in text files | ||
| */ | ||
| export declare function replacePlaceholder(projectPath: string, normalizedName: string): void; | ||
| //# sourceMappingURL=edit-template.d.ts.map |
| {"version":3,"file":"edit-template.d.ts","sourceRoot":"","sources":["../../../src/lib/edit-template.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,QAcpD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,QA4BvB"} |
| import * as fs from 'node:fs'; | ||
| import * as path from 'node:path'; | ||
| import { renameFile, walkDirectory } from './fs.js'; | ||
| /** | ||
| * Placeholder name used in template, that should be replaced with normalized project name. | ||
| */ | ||
| const PLACEHOLDER_NAME = 'HelloWorld'; | ||
| /** | ||
| * Rename common files that cannot be put into template literaly, e.g. .gitignore. | ||
| */ | ||
| export function renameCommonFiles(projectPath) { | ||
| const sourceGitIgnorePath = path.join(projectPath, 'gitignore'); | ||
| if (fs.existsSync(sourceGitIgnorePath)) { | ||
| fs.renameSync(sourceGitIgnorePath, path.join(projectPath, '.gitignore')); | ||
| } | ||
| // Harmony platform has a separate gitignore file. | ||
| const harmonyGitIgnorePath = path.join(projectPath, 'harmony', 'gitignore'); | ||
| if (fs.existsSync(harmonyGitIgnorePath)) { | ||
| fs.renameSync(harmonyGitIgnorePath, path.join(projectPath, 'harmony', '.gitignore')); | ||
| } | ||
| } | ||
| /** | ||
| * Replace placeholder with project nae in whole template: | ||
| * - Rename paths containing placeholder | ||
| * - Replace placeholder in text files | ||
| */ | ||
| export function replacePlaceholder(projectPath, normalizedName) { | ||
| if (normalizedName === PLACEHOLDER_NAME) { | ||
| return; | ||
| } | ||
| for (const filePath of walkDirectory(projectPath).reverse()) { | ||
| // Skip anything inside node_modules | ||
| if (filePath.split(path.sep).includes('node_modules')) { | ||
| continue; | ||
| } | ||
| if (!fs.statSync(filePath).isDirectory()) { | ||
| replacePlaceholderInTextFile(filePath, normalizedName); | ||
| } | ||
| if (path.basename(filePath).includes(PLACEHOLDER_NAME)) { | ||
| renameFile(filePath, PLACEHOLDER_NAME, normalizedName); | ||
| } | ||
| else if (path.basename(filePath).includes(PLACEHOLDER_NAME.toLowerCase())) { | ||
| renameFile(filePath, PLACEHOLDER_NAME.toLowerCase(), normalizedName.toLowerCase()); | ||
| } | ||
| } | ||
| } | ||
| function replacePlaceholderInTextFile(filePath, normalizedName) { | ||
| const fileContent = fs.readFileSync(filePath, 'utf8'); | ||
| const replacedFileContent = fileContent | ||
| .replaceAll(PLACEHOLDER_NAME, normalizedName) | ||
| .replaceAll(PLACEHOLDER_NAME.toLowerCase(), normalizedName.toLowerCase()); | ||
| if (fileContent !== replacedFileContent) { | ||
| fs.writeFileSync(filePath, replacedFileContent, 'utf8'); | ||
| } | ||
| } | ||
| //# sourceMappingURL=edit-template.js.map |
| {"version":3,"file":"edit-template.js","sourceRoot":"","sources":["../../../src/lib/edit-template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEpD;;GAEG;AACH,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAEtC;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACvC,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,kDAAkD;IAClD,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC5E,IAAI,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACxC,EAAE,CAAC,UAAU,CACX,oBAAoB,EACpB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,CAChD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,cAAsB;IAEtB,IAAI,cAAc,KAAK,gBAAgB,EAAE,CAAC;QACxC,OAAO;IACT,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5D,oCAAoC;QACpC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACtD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACzC,4BAA4B,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvD,UAAU,CAAC,QAAQ,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;QACzD,CAAC;aAAM,IACL,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,EAChE,CAAC;YACD,UAAU,CACR,QAAQ,EACR,gBAAgB,CAAC,WAAW,EAAE,EAC9B,cAAc,CAAC,WAAW,EAAE,CAC7B,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CACnC,QAAgB,EAChB,cAAsB;IAEtB,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,mBAAmB,GAAG,WAAW;SACpC,UAAU,CAAC,gBAAgB,EAAE,cAAc,CAAC;SAC5C,UAAU,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;IAE5E,IAAI,WAAW,KAAK,mBAAmB,EAAE,CAAC;QACxC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"} |
| export declare function isEmptyDirSync(path: string): boolean; | ||
| type CopyDirOptions = { | ||
| skipFiles?: string[]; | ||
| }; | ||
| export declare function copyDirSync(from: string, to: string, { skipFiles }?: CopyDirOptions): void; | ||
| export declare function removeDirSync(path: string): void; | ||
| export declare function removeDirs(paths: string[]): Promise<void[]>; | ||
| export declare function walkDirectory(currentPath: string): string[]; | ||
| export declare function renameFile(filePath: string, oldName: string, newName: string): void; | ||
| export declare function getNameWithoutExtension(filePath: string): string; | ||
| export {}; | ||
| //# sourceMappingURL=fs.d.ts.map |
| {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../src/lib/fs.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,WAG1C;AAED,KAAK,cAAc,GAAG;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,EAAE,SAAc,EAAE,GAAE,cAAmB,QAmBxC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,QAIzC;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,mBAM/C;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAS3D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAO5E;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,UAEvD"} |
| import fs from 'node:fs'; | ||
| import fsPromises from 'node:fs/promises'; | ||
| import path from 'node:path'; | ||
| import nodePath from 'node:path'; | ||
| import { mergePackageJsons } from './package-json.js'; | ||
| export function isEmptyDirSync(path) { | ||
| const files = fs.readdirSync(path); | ||
| return files.length === 0 || (files.length === 1 && files[0] === '.git'); | ||
| } | ||
| export function copyDirSync(from, to, { skipFiles = [] } = {}) { | ||
| fs.mkdirSync(to, { recursive: true }); | ||
| for (const file of fs.readdirSync(from)) { | ||
| const srcFile = nodePath.resolve(from, file); | ||
| const stat = fs.statSync(srcFile); | ||
| const distFile = nodePath.resolve(to, file); | ||
| if (stat.isDirectory()) { | ||
| copyDirSync(srcFile, distFile, { skipFiles }); | ||
| } | ||
| else { | ||
| if (nodePath.basename(srcFile) === 'package.json') { | ||
| mergePackageJsons(srcFile, distFile); | ||
| } | ||
| else if (!skipFiles?.includes(nodePath.basename(srcFile))) { | ||
| fs.copyFileSync(srcFile, distFile); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| export function removeDirSync(path) { | ||
| if (fs.existsSync(path)) { | ||
| fs.rmSync(path, { recursive: true }); | ||
| } | ||
| } | ||
| export async function removeDirs(paths) { | ||
| return await Promise.all(paths.map((dirPath) => fsPromises.rm(dirPath, { recursive: true, force: true }))); | ||
| } | ||
| export function walkDirectory(currentPath) { | ||
| if (!fs.lstatSync(currentPath).isDirectory()) { | ||
| return [currentPath]; | ||
| } | ||
| const childPaths = fs | ||
| .readdirSync(currentPath) | ||
| .flatMap((childName) => walkDirectory(path.join(currentPath, childName))); | ||
| return [currentPath, ...childPaths]; | ||
| } | ||
| export function renameFile(filePath, oldName, newName) { | ||
| const newFileName = nodePath.join(nodePath.dirname(filePath), nodePath.basename(filePath).replaceAll(oldName, newName)); | ||
| fs.renameSync(filePath, newFileName); | ||
| } | ||
| export function getNameWithoutExtension(filePath) { | ||
| return path.basename(filePath, path.extname(filePath)); | ||
| } | ||
| //# sourceMappingURL=fs.js.map |
| {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/lib/fs.ts"],"names":[],"mappings":"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"} |
| export declare function gitInitStep(path: string, version: string | null): Promise<void>; | ||
| export declare function hasGitClient(): Promise<boolean>; | ||
| export declare function isGitRepo(path: string): Promise<boolean>; | ||
| export declare function isGitDirty(dir: string): Promise<boolean>; | ||
| //# sourceMappingURL=git.d.ts.map |
| {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/lib/git.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,iBAoBrE;AAeD,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAOrD;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU9D;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,oBAM3C"} |
| import logger from './logger.js'; | ||
| import { spinner } from './prompts.js'; | ||
| import { spawn } from './spawn.js'; | ||
| export async function gitInitStep(path, version) { | ||
| if (!(await hasGitClient())) { | ||
| logger.info('Git client not found, skipping git initialization'); | ||
| return; | ||
| } | ||
| if (await isGitRepo(path)) { | ||
| logger.debug('Git repo already initialized, skipping git initialization'); | ||
| return; | ||
| } | ||
| const loader = spinner(); | ||
| loader.start('Initializing git repo'); | ||
| const message = `Initial commit\n\nGenerated by rock${version ? `@${version}` : ''}.`; | ||
| await initGitRepo(path, message); | ||
| loader.stop('Git repo initialized.'); | ||
| } | ||
| async function initGitRepo(path, message) { | ||
| try { | ||
| await spawn('git', ['init'], { cwd: path }); | ||
| await spawn('git', ['branch', '-M', 'main'], { cwd: path }); | ||
| await spawn('git', ['add', '.'], { cwd: path }); | ||
| await spawn('git', ['commit', '-m', message], { | ||
| cwd: path, | ||
| }); | ||
| } | ||
| catch (error) { | ||
| logger.warn('Failed to initialize git repository', error); | ||
| } | ||
| } | ||
| export async function hasGitClient() { | ||
| try { | ||
| await spawn('git', ['--version'], { stdio: 'ignore' }); | ||
| return true; | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| } | ||
| export async function isGitRepo(path) { | ||
| try { | ||
| await spawn('git', ['rev-parse', '--is-inside-work-tree'], { | ||
| stdio: 'ignore', | ||
| cwd: path, | ||
| }); | ||
| return true; | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| } | ||
| export async function isGitDirty(dir) { | ||
| const { output } = await spawn('git', ['status', '--porcelain'], { | ||
| cwd: dir, | ||
| }); | ||
| return output.trim() !== ''; | ||
| } | ||
| //# sourceMappingURL=git.js.map |
| {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/lib/git.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,OAAsB;IACpE,IAAI,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;IACzB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,sCACd,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAC5B,GAAG,CAAC;IACJ,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEjC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,OAAe;IACtD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;YAC5C,GAAG,EAAE,IAAI;SACV,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE;YACzD,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE,IAAI;SACV,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE;QAC/D,GAAG,EAAE,GAAG;KACT,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC"} |
| export declare function mergePackageJsons(from: string, to: string): void; | ||
| export declare function rewritePackageJson(projectPath: string, packageName: string): void; | ||
| //# sourceMappingURL=package-json.d.ts.map |
| {"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../../src/lib/package-json.ts"],"names":[],"mappings":"AAGA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAczD;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAoC1E"} |
| import * as fs from 'node:fs'; | ||
| import * as path from 'node:path'; | ||
| export function mergePackageJsons(from, to) { | ||
| const src = JSON.parse(fs.readFileSync(from, 'utf-8')); | ||
| if (!fs.existsSync(to)) { | ||
| fs.copyFileSync(from, to); | ||
| } | ||
| const dist = JSON.parse(fs.readFileSync(to, 'utf-8')); | ||
| // @todo consider adding a warning when src keys are different from dist keys | ||
| dist.scripts = { ...dist.scripts, ...src.scripts }; | ||
| dist.dependencies = { ...dist.dependencies, ...src.dependencies }; | ||
| dist.devDependencies = { ...dist.devDependencies, ...src.devDependencies }; | ||
| dist.peerDependencies = { ...dist.peerDependencies, ...src.peerDependencies }; | ||
| fs.writeFileSync(to, JSON.stringify(dist, null, 2)); | ||
| } | ||
| export function rewritePackageJson(projectPath, packageName) { | ||
| const packageJsonPath = path.join(projectPath, 'package.json'); | ||
| if (!fs.existsSync(packageJsonPath)) { | ||
| return; | ||
| } | ||
| const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); | ||
| // Override fields from template | ||
| packageJson.name = packageName; | ||
| packageJson.version = '1.0.0'; | ||
| packageJson.private = true; | ||
| delete packageJson.publishConfig; | ||
| if (packageJson.dependencies) { | ||
| packageJson.dependencies = Object.fromEntries(Object.entries(packageJson.dependencies).sort()); | ||
| } | ||
| if (packageJson.devDependencies) { | ||
| packageJson.devDependencies = Object.fromEntries(Object.entries(packageJson.devDependencies).sort()); | ||
| } | ||
| if (packageJson.peerDependencies) { | ||
| packageJson.peerDependencies = Object.fromEntries(Object.entries(packageJson.peerDependencies).sort()); | ||
| } | ||
| fs.writeFileSync(packageJsonPath, JSON.stringify(sortPackageJson(packageJson), null, 2)); | ||
| } | ||
| /** | ||
| * Sort fields in package.json to make it cleaner. | ||
| * @param packageJson | ||
| * @returns | ||
| */ | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| function sortPackageJson(packageJson) { | ||
| const { name, version, private: privateValue, scripts, dependencies, devDependencies, peerDependencies, ...rest } = packageJson; | ||
| const result = {}; | ||
| setField(result, 'name', name); | ||
| setField(result, 'version', version); | ||
| setField(result, 'private', privateValue); | ||
| setField(result, 'scripts', scripts); | ||
| setField(result, 'dependencies', dependencies); | ||
| setField(result, 'devDependencies', devDependencies); | ||
| setField(result, 'peerDependencies', peerDependencies); | ||
| for (const key in rest) { | ||
| result[key] = rest[key]; | ||
| } | ||
| return result; | ||
| } | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| function setField(packageJson, key, value) { | ||
| if (value !== undefined) { | ||
| packageJson[key] = value; | ||
| } | ||
| } | ||
| //# sourceMappingURL=package-json.js.map |
| {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../../src/lib/package-json.ts"],"names":[],"mappings":"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"} |
| export declare function validateProjectName(name: string): string | undefined; | ||
| /** | ||
| * Transform project name to PascalCase. The input name can be in either kebab-case or PascalCase. | ||
| * | ||
| * @param name - Project name | ||
| * @returns PascalCase project name | ||
| */ | ||
| export declare function normalizeProjectName(name: string): string; | ||
| //# sourceMappingURL=project-name.d.ts.map |
| {"version":3,"file":"project-name.d.ts","sourceRoot":"","sources":["../../../src/lib/project-name.ts"],"names":[],"mappings":"AA8DA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,sBAe/C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,UAQhD"} |
| /** | ||
| * Allow for alphanumeric, hyphen (kebab-case), and underscore (_). | ||
| * Has to start with a letter. | ||
| */ | ||
| const NAME_REGEX = /^[A-Z][0-9A-Z_-]*$/i; | ||
| // ref: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html | ||
| const javaKeywords = [ | ||
| 'abstract', | ||
| 'continue', | ||
| 'for', | ||
| 'new', | ||
| 'switch', | ||
| 'assert', | ||
| 'default', | ||
| 'goto', | ||
| 'package', | ||
| 'synchronized', | ||
| 'boolean', | ||
| 'do', | ||
| 'if', | ||
| 'private', | ||
| 'this', | ||
| 'break', | ||
| 'double', | ||
| 'implements', | ||
| 'protected', | ||
| 'throw', | ||
| 'byte', | ||
| 'else', | ||
| 'import', | ||
| 'public', | ||
| 'throws', | ||
| 'case', | ||
| 'enum', | ||
| 'instanceof', | ||
| 'return', | ||
| 'transient', | ||
| 'catch', | ||
| 'extends', | ||
| 'int', | ||
| 'short', | ||
| 'try', | ||
| 'char', | ||
| 'final', | ||
| 'interface', | ||
| 'static', | ||
| 'void', | ||
| 'class', | ||
| 'finally', | ||
| 'long', | ||
| 'strictfp', | ||
| 'volatile', | ||
| 'const', | ||
| 'float', | ||
| 'native', | ||
| 'super', | ||
| 'while', | ||
| ]; | ||
| const reservedNames = ['react', 'react-native', ...javaKeywords]; | ||
| export function validateProjectName(name) { | ||
| if (name.length === 0) { | ||
| return 'Project name cannot be empty.'; | ||
| } | ||
| if (!name.match(NAME_REGEX)) { | ||
| return `Invalid project name: "${name}". Please use a valid identifier name (alphanumeric, hyphen, underscore).`; | ||
| } | ||
| const lowerCaseName = name.toLowerCase(); | ||
| if (reservedNames.includes(lowerCaseName)) { | ||
| return `Invalid project name: "${name}". Can't use reserved name. Please use another name.`; | ||
| } | ||
| return undefined; | ||
| } | ||
| /** | ||
| * Transform project name to PascalCase. The input name can be in either kebab-case or PascalCase. | ||
| * | ||
| * @param name - Project name | ||
| * @returns PascalCase project name | ||
| */ | ||
| export function normalizeProjectName(name) { | ||
| if (!name) | ||
| return ''; | ||
| return name | ||
| .split('-') | ||
| .filter(Boolean) | ||
| .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) | ||
| .join(''); | ||
| } | ||
| //# sourceMappingURL=project-name.js.map |
| {"version":3,"file":"project-name.js","sourceRoot":"","sources":["../../../src/lib/project-name.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAEzC,gFAAgF;AAChF,MAAM,YAAY,GAAG;IACnB,UAAU;IACV,UAAU;IACV,KAAK;IACL,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,SAAS;IACT,cAAc;IACd,SAAS;IACT,IAAI;IACJ,IAAI;IACJ,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,OAAO;IACP,SAAS;IACT,KAAK;IACL,OAAO;IACP,KAAK;IACL,MAAM;IACN,OAAO;IACP,WAAW;IACX,QAAQ;IACR,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,UAAU;IACV,UAAU;IACV,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;CACR,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,CAAC;AAEjE,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,+BAA+B,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,0BAA0B,IAAI,2EAA2E,CAAC;IACnH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1C,OAAO,0BAA0B,IAAI,sDAAsD,CAAC;IAC9F,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"} |
@@ -13,2 +13,7 @@ export * from './lib/prompts.js'; | ||
| export * from './lib/build-cache/localBuildCache.js'; | ||
| export * from './lib/fs.js'; | ||
| export * from './lib/package-json.js'; | ||
| export * from './lib/project-name.js'; | ||
| export * from './lib/edit-template.js'; | ||
| export * from './lib/git.js'; | ||
| export { getBinaryPath } from './lib/build-cache/getBinaryPath.js'; | ||
@@ -15,0 +20,0 @@ export { findDevServerPort } from './lib/dev-server/findDevServerPort.js'; |
@@ -13,2 +13,7 @@ export * from './lib/prompts.js'; | ||
| export * from './lib/build-cache/localBuildCache.js'; | ||
| export * from './lib/fs.js'; | ||
| export * from './lib/package-json.js'; | ||
| export * from './lib/project-name.js'; | ||
| export * from './lib/edit-template.js'; | ||
| export * from './lib/git.js'; | ||
| export { getBinaryPath } from './lib/build-cache/getBinaryPath.js'; | ||
@@ -15,0 +20,0 @@ export { findDevServerPort } from './lib/dev-server/findDevServerPort.js'; |
+2
-2
| { | ||
| "name": "@rock-js/tools", | ||
| "version": "0.12.10", | ||
| "version": "0.12.11", | ||
| "description": "Internal core utilities for Rock", | ||
@@ -33,3 +33,3 @@ "type": "module", | ||
| "devDependencies": { | ||
| "@rock-js/test-helpers": "^0.12.10", | ||
| "@rock-js/test-helpers": "^0.12.11", | ||
| "@types/adm-zip": "^0.5.7" | ||
@@ -36,0 +36,0 @@ }, |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
141312
22.4%134
17.54%1874
23.86%