diff --git a/package-lock.json b/package-lock.json index d310372..651d7d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -326,6 +326,21 @@ "pump": "^3.0.0" } }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -372,6 +387,23 @@ "p-filter": "^2.0.0", "p-retry": "^4.0.0", "url-join": "^4.0.0" + }, + "dependencies": { + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + } } }, "@semantic-release/npm": { @@ -1256,6 +1288,21 @@ "slash": "^3.0.0" }, "dependencies": { + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -1718,17 +1765,15 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", + "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", "requires": { - "@types/glob": "^7.1.1", "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", "slash": "^3.0.0" } }, diff --git a/package.json b/package.json index 3e54bc4..08f5a5e 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,7 @@ }, "devDependencies": { "@types/app-root-path": "^1.2.4", - "@types/cross-spawn": "^6.0.1", - "@types/glob": "^7.1.1" + "@types/cross-spawn": "^6.0.1" }, "dependencies": { "@semantic-release/changelog": "^3.0.6", @@ -49,7 +48,7 @@ "chai": "^4.2.0", "cross-spawn": "^7.0.1", "del": "^5.1.0", - "glob": "^7.1.6", + "globby": "^11.0.0", "mocha": "^6.2.2", "nyc": "^14.1.1", "semantic-release": "^15.13.31", diff --git a/source/build.ts b/source/build.ts index 6b50699..7f91312 100644 --- a/source/build.ts +++ b/source/build.ts @@ -1,10 +1,35 @@ +import * as fs from 'fs'; import { cleanBuildDirectory } from './clean'; -import { executeCommand, log, wasCalledFromCLI } from './helpers'; +import { executeCommand, getFilePaths, log, wasCalledFromCLI } from './helpers'; +import { + absoluteRootGeneratedTsconfigJsonPath, + absoluteRootSourceTypescriptFilesGlob, + absoluteRootTsconfigJsonPath +} from './variables'; + +function generateTsconfig() { + const tsconfigString = fs.readFileSync(absoluteRootTsconfigJsonPath, 'utf8'); + const tsconfigData = JSON.parse(tsconfigString); + + const files = getFilePaths(absoluteRootSourceTypescriptFilesGlob); + + tsconfigData.files = files; + + const modifiedTsconfigData = JSON.stringify(tsconfigData, undefined, 4); + + fs.writeFileSync(absoluteRootGeneratedTsconfigJsonPath, modifiedTsconfigData); +} function buildTypeScript(outputDirectoryPath: string): void { + log(`Generating TSConfig file to '${absoluteRootGeneratedTsconfigJsonPath}'.`); + + generateTsconfig(); + log(`Building TypeScript files to '${outputDirectoryPath}' directory.`); executeCommand('tsc', [ + '--project', + absoluteRootGeneratedTsconfigJsonPath, '--outDir', outputDirectoryPath ]); diff --git a/source/distribute.ts b/source/distribute.ts index d1976fc..e267624 100644 --- a/source/distribute.ts +++ b/source/distribute.ts @@ -13,7 +13,7 @@ import { absoluteRootDistributeDefaultFilesGlob, absoluteRootDistributeEssentialDirectory, absoluteRootDistributePackageJsonPath, - absoluteRootEssentialDirectory, + absoluteRootDirectory, absoluteRootEssentialFilesGlobs, renamedPrefix } from './variables'; @@ -25,26 +25,18 @@ function copyFiles( originDirectory: string, destinationDirectory: string ): void { - const targetPatterns = Array.isArray(targetPatternOrTargetPatterns) - ? targetPatternOrTargetPatterns - : [ - targetPatternOrTargetPatterns - ]; + const filePaths = getFilePaths(targetPatternOrTargetPatterns); - for (const targetPattern of targetPatterns) { - const filePaths = getFilePaths(targetPattern); + for (const filePath of filePaths) { + const relativeFilePath = path.relative(originDirectory, filePath); + const destinationFilePath = path.join(destinationDirectory, relativeFilePath); + const directory = path.dirname(destinationFilePath); - for (const filePath of filePaths) { - const relativeFilePath = path.relative(originDirectory, filePath); - const destinationFilePath = path.join(destinationDirectory, relativeFilePath); - const directory = path.dirname(destinationFilePath); + fs.mkdirSync(directory, { recursive: true }); - fs.mkdirSync(directory, { recursive: true }); + log(`Copying file '${filePath}' to '${destinationFilePath}'.`); - log(`Copying file '${filePath}' to '${destinationFilePath}'.`); - - fs.copyFileSync(filePath, destinationFilePath); - } + fs.copyFileSync(filePath, destinationFilePath); } } @@ -53,7 +45,7 @@ function copyFilesToDistributeDirectory() { copyFiles(absoluteRootDefaultFilesGlob, absoluteRootDefaultDirectory, absoluteRootDistributeDefaultDirectory); copyFiles( absoluteRootEssentialFilesGlobs, - absoluteRootEssentialDirectory, + absoluteRootDirectory, absoluteRootDistributeEssentialDirectory ); } diff --git a/source/helpers.ts b/source/helpers.ts index 12b855c..4a0c9fa 100644 --- a/source/helpers.ts +++ b/source/helpers.ts @@ -1,5 +1,5 @@ import spawn from 'cross-spawn'; -import { default as glob, IOptions } from 'glob'; +import globby from 'globby'; import * as path from 'path'; export function log(message: string): void { @@ -16,12 +16,19 @@ export function wasCalledFromCLI(otherModule: NodeModule): boolean { return require.main === otherModule; } -export function getFilePaths(pattern: string): string[] { - const filePaths = (<(pattern: string, options: IOptions) => string[]>(glob))(pattern, { - dot: true, - nodir: true, - sync: true - }); +export function getFilePaths(pattern: string): string[]; +export function getFilePaths(patterns: string[]): string[]; +export function getFilePaths(patternOrPatterns: string | string[]): string[] { + const patterns = Array.isArray(patternOrPatterns) + ? patternOrPatterns + : [ + patternOrPatterns + ]; + + // https://github.com/mrmlnc/fast-glob#pattern-syntax + const fixedPatterns = patterns.map(pattern => pattern.replace(/\\/g, '/')); + + const filePaths = globby.sync(fixedPatterns); const normalizedFilePaths = filePaths.map(filePath => path.normalize(filePath)); diff --git a/source/variables.ts b/source/variables.ts index d96246a..d529022 100644 --- a/source/variables.ts +++ b/source/variables.ts @@ -3,6 +3,7 @@ import * as path from 'path'; export const relativePackageJsonPath = path.normalize('./package.json'); export const relativeTsconfigJsonPath = path.normalize('./tsconfig.json'); +export const relativeGeneratedTsconfigJsonPath = path.normalize('./tsconfig.generated.json'); export const relativeTslintJsonPath = path.normalize('./tslint.json'); export const relativeLicensePath = path.normalize('./LICENSE'); export const relativeReadmeMarkdownPath = path.normalize('./README.md'); @@ -23,10 +24,9 @@ export const absoluteCurrentDirectory = __dirname.includes('node_modules') export const absoluteRootSourceDirectory = RootPath.resolve(relativeSourceDirectory); -export const absoluteRootSourceDeclarationFileGlob = `${absoluteRootSourceDirectory}/**/*.d.ts`; -export const absoluteRootSourceTestFilesGlob = `${absoluteRootSourceDirectory}/**/*.spec.ts`; -export const absoluteRootSourceLintFilesGlobs = `${absoluteRootSourceDirectory}/**/*.ts`; -export const absoluteRootSourceTsconfigJsonPath = path.join(absoluteRootSourceDirectory, relativeTsconfigJsonPath); +export const absoluteRootSourceTestFilesGlob = path.join(absoluteRootSourceDirectory, '/**/*.spec.ts'); +export const absoluteRootSourceTypescriptFilesGlob = path.join(absoluteRootSourceDirectory, '/**/*.ts'); +export const absoluteRootSourceDeclarationFileGlob = path.join(absoluteRootSourceDirectory, '/**/*.d.ts'); // Build @@ -44,15 +44,20 @@ export const absoluteRootDefaultDirectory = RootPath.resolve(relativeDefaultDire export const absoluteRootDefaultFilesGlob = `${absoluteRootDefaultDirectory}/**/*`; -// Essential +// Root -export const absoluteRootEssentialDirectory = RootPath.path; +export const absoluteRootDirectory = RootPath.path; -export const absoluteRootPackageJsonPath = path.join(absoluteRootEssentialDirectory, relativePackageJsonPath); -export const absoluteRootTsconfigJsonPath = path.join(absoluteRootEssentialDirectory, relativeTsconfigJsonPath); -export const absoluteRootTslintJsonPath = path.join(absoluteRootEssentialDirectory, relativeTslintJsonPath); -export const absoluteRootLicensePath = path.join(absoluteRootEssentialDirectory, relativeLicensePath); -export const absoluteRootReadmeMarkdownPath = path.join(absoluteRootEssentialDirectory, relativeReadmeMarkdownPath); +export const absoluteRootPackageJsonPath = path.join(absoluteRootDirectory, relativePackageJsonPath); +export const absoluteRootTsconfigJsonPath = path.join(absoluteRootDirectory, relativeTsconfigJsonPath); +// tslint:disable-next-line: max-line-length +export const absoluteRootGeneratedTsconfigJsonPath = path.join( + absoluteRootDirectory, + relativeGeneratedTsconfigJsonPath +); +export const absoluteRootTslintJsonPath = path.join(absoluteRootDirectory, relativeTslintJsonPath); +export const absoluteRootLicensePath = path.join(absoluteRootDirectory, relativeLicensePath); +export const absoluteRootReadmeMarkdownPath = path.join(absoluteRootDirectory, relativeReadmeMarkdownPath); export const absoluteRootEssentialFilesGlobs = [ absoluteRootPackageJsonPath, diff --git a/tsconfig.generated.json b/tsconfig.generated.json new file mode 100644 index 0000000..6639b17 --- /dev/null +++ b/tsconfig.generated.json @@ -0,0 +1,43 @@ +{ + "compilerOptions": { + "alwaysStrict": true, + "baseUrl": ".", + "declaration": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "importHelpers": true, + "module": "commonjs", + "moduleResolution": "node", + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "paths": { + "*": [ + "node_modules/*", + "@types/*" + ] + }, + "strict": true, + "strictBindCallApply": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "strictPropertyInitialization": true, + "target": "es6" + }, + "files": [ + "d:\\Github\\Colonise\\Config\\source\\build.ts", + "d:\\Github\\Colonise\\Config\\source\\clean.ts", + "d:\\Github\\Colonise\\Config\\source\\cli.ts", + "d:\\Github\\Colonise\\Config\\source\\coverage.ts", + "d:\\Github\\Colonise\\Config\\source\\distribute.ts", + "d:\\Github\\Colonise\\Config\\source\\helpers.ts", + "d:\\Github\\Colonise\\Config\\source\\index.ts", + "d:\\Github\\Colonise\\Config\\source\\install.ts", + "d:\\Github\\Colonise\\Config\\source\\lint.ts", + "d:\\Github\\Colonise\\Config\\source\\semantic-release.ts", + "d:\\Github\\Colonise\\Config\\source\\test.ts", + "d:\\Github\\Colonise\\Config\\source\\variables.ts" + ] +} \ No newline at end of file