Add script for listing dependencies of projects
This commit is contained in:
parent
a0c36a1299
commit
061960f789
11
packages/scripts/src/getFolders.ts
Normal file
11
packages/scripts/src/getFolders.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { readdirSync, lstatSync } from "fs"
|
||||||
|
import { join } from "path"
|
||||||
|
|
||||||
|
export function getFolders(dir: string): string[] {
|
||||||
|
return readdirSync(dir)
|
||||||
|
.map(file => join(dir, file))
|
||||||
|
.filter(dir => {
|
||||||
|
const stat = lstatSync(dir)
|
||||||
|
return stat.isDirectory()
|
||||||
|
})
|
||||||
|
}
|
||||||
118
packages/scripts/src/scripts/imports.ts
Normal file
118
packages/scripts/src/scripts/imports.ts
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
import * as ts from 'typescript'
|
||||||
|
import {argparse, arg} from '@rondo.dev/argparse'
|
||||||
|
import {info, error} from '../log'
|
||||||
|
import { getFolders } from '../getFolders'
|
||||||
|
|
||||||
|
export function imports(...argv: string[]): string[] {
|
||||||
|
const args = argparse({
|
||||||
|
packages: arg('string', {default: 'packages/', positional: true}),
|
||||||
|
root: arg('string', {default: 'package.json'}),
|
||||||
|
debug: arg('boolean'),
|
||||||
|
help: arg('boolean', {alias: 'h'}),
|
||||||
|
output: arg('string', {alias: 'o', default: '-'}),
|
||||||
|
}).parse(argv)
|
||||||
|
|
||||||
|
function debug(m: string, ...meta: Array<unknown>) {
|
||||||
|
if (args.debug) {
|
||||||
|
info(m, ...meta)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Generate interfaces for all exported classes in a set of .ts files */
|
||||||
|
function collectImports(
|
||||||
|
projectDir: string,
|
||||||
|
tsconfigFileName: string,
|
||||||
|
): string[] {
|
||||||
|
// Build a program using the set of root file names in fileNames
|
||||||
|
// const program = ts.createProgram(fileNames, options)
|
||||||
|
const configPath = ts.findConfigFile(
|
||||||
|
projectDir,
|
||||||
|
ts.sys.fileExists,
|
||||||
|
tsconfigFileName,
|
||||||
|
)
|
||||||
|
if (!configPath) {
|
||||||
|
throw new Error('No tsconfig.json found')
|
||||||
|
}
|
||||||
|
|
||||||
|
const parseConfigHost: ts.ParseConfigHost = {
|
||||||
|
fileExists: ts.sys.fileExists,
|
||||||
|
readFile: ts.sys.readFile,
|
||||||
|
readDirectory: ts.sys.readDirectory,
|
||||||
|
useCaseSensitiveFileNames: true,
|
||||||
|
}
|
||||||
|
const configFile = ts.readConfigFile(configPath, ts.sys.readFile);
|
||||||
|
const parsedCommandLine = ts.parseJsonConfigFileContent(
|
||||||
|
configFile.config,
|
||||||
|
parseConfigHost,
|
||||||
|
projectDir,
|
||||||
|
);
|
||||||
|
|
||||||
|
const program = ts.createProgram(
|
||||||
|
parsedCommandLine.fileNames,
|
||||||
|
parsedCommandLine.options,
|
||||||
|
)
|
||||||
|
|
||||||
|
const modules = new Set<string>()
|
||||||
|
|
||||||
|
// Get the checker, we will use it to find more about classes
|
||||||
|
// const checker = program.getTypeChecker()
|
||||||
|
|
||||||
|
function isInstalledModule(moduleName: string) {
|
||||||
|
return !moduleName.startsWith('.')
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Visit nodes finding exported classes
|
||||||
|
*/
|
||||||
|
function visit(sourceFile: ts.SourceFile, node: ts.Node) {
|
||||||
|
if (ts.isImportDeclaration(node)) {
|
||||||
|
const text = node.moduleSpecifier.getText(sourceFile)
|
||||||
|
const name = text.substring(1, text.length - 1)
|
||||||
|
if (isInstalledModule(name)) {
|
||||||
|
let resolved: string
|
||||||
|
try {
|
||||||
|
resolved = require.resolve(name)
|
||||||
|
} catch (err) {
|
||||||
|
error('Warning require.resolve: %s', err.message)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resolved === name) {
|
||||||
|
// Names of modules provided by NodeJS like "fs" will be the same
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!modules.has(name)) {
|
||||||
|
debug(name)
|
||||||
|
modules.add(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ts.forEachChild(node, visit.bind(null, sourceFile))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const sourceFile of program.getSourceFiles()) {
|
||||||
|
if (!sourceFile.isDeclarationFile) {
|
||||||
|
ts.forEachChild(sourceFile, visit.bind(null, sourceFile))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Array.from(modules)
|
||||||
|
}
|
||||||
|
|
||||||
|
getFolders(args.packages)
|
||||||
|
.forEach(pkgDir => {
|
||||||
|
error('Entering: %s', pkgDir)
|
||||||
|
const modules = collectImports(pkgDir, 'tsconfig.json')
|
||||||
|
})
|
||||||
|
|
||||||
|
if (args.output === '-') {
|
||||||
|
// info(value)
|
||||||
|
} else {
|
||||||
|
// fs.writeFileSync(args.output, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
return []
|
||||||
|
}
|
||||||
@ -2,6 +2,7 @@ export * from './add'
|
|||||||
export * from './build'
|
export * from './build'
|
||||||
export * from './clean'
|
export * from './clean'
|
||||||
export * from './exportDir'
|
export * from './exportDir'
|
||||||
|
export * from './imports'
|
||||||
export * from './intergen'
|
export * from './intergen'
|
||||||
export * from './syncEsmConfig'
|
export * from './syncEsmConfig'
|
||||||
export * from './update'
|
export * from './update'
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import * as fs from 'fs'
|
|||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import {argparse, arg} from '@rondo.dev/argparse'
|
import {argparse, arg} from '@rondo.dev/argparse'
|
||||||
import {info} from '../log'
|
import {info} from '../log'
|
||||||
|
import { getFolders } from '../getFolders'
|
||||||
|
|
||||||
const TSCONFIG_FILENAME = 'tsconfig.json'
|
const TSCONFIG_FILENAME = 'tsconfig.json'
|
||||||
const TSCONFIG_ESM_FILENAME = 'tsconfig.esm.json'
|
const TSCONFIG_ESM_FILENAME = 'tsconfig.esm.json'
|
||||||
@ -19,11 +20,7 @@ export async function syncEsmConfig(...argv: string[]) {
|
|||||||
|
|
||||||
const pkgDir = args.packages
|
const pkgDir = args.packages
|
||||||
|
|
||||||
fs.readdirSync(pkgDir)
|
getFolders(pkgDir)
|
||||||
.filter(file => {
|
|
||||||
const stat = fs.lstatSync(path.join(pkgDir, file))
|
|
||||||
return stat.isDirectory()
|
|
||||||
})
|
|
||||||
.map(file => path.join(pkgDir, file, TSCONFIG_FILENAME))
|
.map(file => path.join(pkgDir, file, TSCONFIG_FILENAME))
|
||||||
.filter(file => fs.existsSync(file))
|
.filter(file => fs.existsSync(file))
|
||||||
.forEach(file => {
|
.forEach(file => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user