
4 changed files with 285 additions and 9 deletions
@ -0,0 +1,98 @@ |
|||
const fs = require('fs-extra'); |
|||
const path = require('path'); |
|||
const argv = require('yargs') |
|||
.usage('Usage: $0 -d <dist>') |
|||
.option('d', { |
|||
alias: 'dist', |
|||
type: 'string', |
|||
describe: 'The directory where dependencies would be copies to.', |
|||
}) |
|||
.option('r', { |
|||
alias: 'dryrun', |
|||
type: 'boolean', |
|||
describe: 'Find the dependencies and log to the screen only.', |
|||
}) |
|||
.option('v', { |
|||
alias: 'verbose', |
|||
type: 'boolean', |
|||
describe: 'Enable verbose log.', |
|||
}) |
|||
.parse(); |
|||
|
|||
const pkgfile = require('./package'); |
|||
|
|||
function getDependencies(filePath) { |
|||
let allDependencies = []; |
|||
let cssDependencies = []; |
|||
let jsDependencies = []; |
|||
let fontDependencies = []; |
|||
|
|||
let fileDir = path.dirname(filePath); |
|||
let fileContent = fs.readFileSync(filePath, 'utf8'); |
|||
let cssPattern = /<link rel="stylesheet" href="(\.\.\/node_modules\/.*\.css)"\/?>/g; |
|||
let jsPattern = /<script src="(\.\.\/node_modules\/.*\.js)"><\/script>/g; |
|||
let fontPattern = /url\('(\.\.\/fonts\/[a-zA-Z0-9\-]+\.[a-zA-z0-9]+)(\?[a-zA-Z0-9\-_=.#]+)?'\)/g; |
|||
|
|||
for (let match; (match = cssPattern.exec(fileContent)) !== null;) { |
|||
let dependencyPath = path.join(fileDir, match[1]); |
|||
|
|||
if (argv.verbose) { |
|||
console.log('find css dependency ' + dependencyPath); |
|||
} |
|||
|
|||
cssDependencies.push(dependencyPath); |
|||
} |
|||
|
|||
for (let i = 0; i < cssDependencies.length; i++) { |
|||
let cssFilePath = cssDependencies[i]; |
|||
let cssFileDir = path.dirname(cssFilePath); |
|||
let cssFileContent = fs.readFileSync(cssFilePath, 'utf8'); |
|||
|
|||
for (let match; (match = fontPattern.exec(cssFileContent)) !== null;) { |
|||
let dependencyPath = path.join(cssFileDir, match[1]); |
|||
|
|||
if (argv.verbose) { |
|||
console.log('find font dependency (' + cssFilePath + ') ' + dependencyPath); |
|||
} |
|||
|
|||
fontDependencies.push(dependencyPath); |
|||
} |
|||
} |
|||
|
|||
for (let match; (match = jsPattern.exec(fileContent)) !== null;) { |
|||
let dependencyPath = path.join(fileDir, match[1]); |
|||
|
|||
if (argv.verbose) { |
|||
console.log('find js dependency ' + dependencyPath); |
|||
} |
|||
|
|||
jsDependencies.push(dependencyPath); |
|||
} |
|||
|
|||
allDependencies.push(...cssDependencies); |
|||
allDependencies.push(...fontDependencies); |
|||
allDependencies.push(...jsDependencies); |
|||
|
|||
return allDependencies; |
|||
} |
|||
|
|||
function copyDependencies(dependencies, dist) { |
|||
for (let i = 0; i < dependencies.length; i++) { |
|||
let filePath = dependencies[i]; |
|||
let srcFilePath = path.join(__dirname, filePath); |
|||
let distFilePath = path.join(__dirname, dist, filePath); |
|||
let distDir = path.dirname(distFilePath); |
|||
|
|||
if (!fs.existsSync(distDir)) { |
|||
fs.mkdirpSync(distDir); |
|||
} |
|||
|
|||
fs.copyFileSync(srcFilePath, distFilePath); |
|||
} |
|||
} |
|||
|
|||
let dependencies = getDependencies(pkgfile.entry); |
|||
|
|||
if (!argv.dryrun) { |
|||
copyDependencies(dependencies, argv.dist); |
|||
} |
@ -0,0 +1,111 @@ |
|||
const fs = require('fs-extra'); |
|||
const path = require('path'); |
|||
const jsonfile = require('jsonfile'); |
|||
const argv = require('yargs') |
|||
.usage('Usage: $0 -d <dist>') |
|||
.option('s', { |
|||
alias: 'source', |
|||
type: 'string', |
|||
describe: 'The directory where dependencies is.', |
|||
}) |
|||
.option('d', { |
|||
alias: 'dist', |
|||
type: 'string', |
|||
describe: 'The directory where dependencies would be copies to.', |
|||
}) |
|||
.option('r', { |
|||
alias: 'dryrun', |
|||
type: 'boolean', |
|||
describe: 'Find the dependencies and log to the screen only.', |
|||
}) |
|||
.option('v', { |
|||
alias: 'verbose', |
|||
type: 'boolean', |
|||
describe: 'Enable verbose log.', |
|||
}) |
|||
.parse(); |
|||
|
|||
const pkgfile = require('./package'); |
|||
|
|||
function getDependencies(allDependenciesDir, level, sourceDir, dependencies) { |
|||
for (let i = 0; i < dependencies.length; i++) { |
|||
let dependency = dependencies[i]; |
|||
let dependencyDir = path.join(sourceDir, dependency); |
|||
|
|||
if (!fs.existsSync(dependencyDir)) { |
|||
throw new Error('Dependency "' + dependency + '" does not exist!'); |
|||
} |
|||
|
|||
let dependencyPackageFile = path.join(dependencyDir, 'package.json'); |
|||
|
|||
if (!fs.existsSync(dependencyPackageFile)) { |
|||
throw new Error('Dependency "' + dependency + '" package file does not exist!'); |
|||
} |
|||
|
|||
let dependencyPackage = jsonfile.readFileSync(dependencyPackageFile, { throws: false }); |
|||
|
|||
if (!dependencyPackage) { |
|||
throw new Error('Dependency "' + dependency + '" package file loads failed!'); |
|||
} |
|||
|
|||
if (argv.verbose) { |
|||
let logPrefix = ''; |
|||
|
|||
for (let i = 0; i < level * 2; i++) { |
|||
logPrefix += '-'; |
|||
} |
|||
|
|||
console.log(logPrefix + (logPrefix && ' ') + 'find dependency ' + dependency); |
|||
} |
|||
|
|||
if (dependencyPackage.dependencies) { |
|||
let subDependenciesDir = []; |
|||
let subDependencies = []; |
|||
|
|||
for (subDependency in dependencyPackage.dependencies) { |
|||
if (!dependencyPackage.dependencies.hasOwnProperty(subDependency)) { |
|||
continue; |
|||
} |
|||
|
|||
subDependencies.push(subDependency); |
|||
} |
|||
|
|||
subDependenciesDir = getDependencies([], level + 1, sourceDir, subDependencies); |
|||
allDependenciesDir.push(...subDependenciesDir); |
|||
} |
|||
|
|||
allDependenciesDir.push(dependencyDir); |
|||
} |
|||
|
|||
return allDependenciesDir; |
|||
} |
|||
|
|||
function copyDependencies(dependenciesDir, dist) { |
|||
let dependenciesDirSet = {}; |
|||
|
|||
for (let i = 0; i < dependenciesDir.length; i++) { |
|||
let dependencyDir = dependenciesDir[i]; |
|||
dependenciesDirSet[dependencyDir] = true; |
|||
} |
|||
|
|||
for (let dependencyDir in dependenciesDirSet) { |
|||
if (!dependenciesDirSet.hasOwnProperty(dependencyDir)) { |
|||
continue; |
|||
} |
|||
|
|||
let srcDir = path.join(__dirname, dependencyDir); |
|||
let distDir = path.join(__dirname, dist, dependencyDir); |
|||
|
|||
if (!fs.existsSync(distDir)) { |
|||
fs.mkdirpSync(distDir); |
|||
} |
|||
|
|||
fs.copySync(srcDir, distDir); |
|||
} |
|||
} |
|||
|
|||
let dependencies = getDependencies([], 0, argv.source, pkgfile.mainDependencies); |
|||
|
|||
if (!argv.dryrun) { |
|||
copyDependencies(dependencies, argv.dist); |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue