mirror of
https://github.com/vatesfr/xen-orchestra.git
synced 2026-09-10 22:14:48 -05:00
chore(scripts): add .js suffix for better Prettier/ESLint integration
This commit is contained in:
160
scripts/normalize-packages.js
Executable file
160
scripts/normalize-packages.js
Executable file
@@ -0,0 +1,160 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
'use strict'
|
||||
|
||||
const isEmpty = require('lodash/isEmpty')
|
||||
const sortedObject = require('sorted-object')
|
||||
const { dirname, join, relative } = require('path')
|
||||
const { getPackages, noop, readFile, symlink, writeFile, unlink } = require('./utils')
|
||||
|
||||
const BABEL_ESLINTRC_PATH = join(__dirname, 'babel-eslintrc.js')
|
||||
const NPMIGNORE_PATH = join(__dirname, 'npmignore')
|
||||
|
||||
const deleteIfEmpty = (object, property) => {
|
||||
if (isEmpty(object[property])) {
|
||||
delete object[property]
|
||||
}
|
||||
}
|
||||
|
||||
const deleteProperties = (object, property, properties) => {
|
||||
const nestedObject = object[property]
|
||||
if (nestedObject === undefined) {
|
||||
return
|
||||
}
|
||||
properties.forEach(property => {
|
||||
delete nestedObject[property]
|
||||
})
|
||||
deleteIfEmpty(object, property)
|
||||
}
|
||||
|
||||
const generateReadme = require('handlebars').compile(
|
||||
require('fs').readFileSync(join(__dirname, 'README.md.tpl'), 'utf8')
|
||||
)
|
||||
|
||||
const forceRelativeSymlink = async (target, path) => {
|
||||
await unlink(path).catch(noop)
|
||||
return symlink(relative(dirname(path), target), path)
|
||||
}
|
||||
|
||||
require('exec-promise')(() =>
|
||||
getPackages(true).map(({ dir, name, package: pkg, relativeDir }) => {
|
||||
// consider packages as private by default to avoid publishing them by mistake
|
||||
if (!('private' in pkg)) {
|
||||
pkg.private = true
|
||||
}
|
||||
|
||||
pkg.name = name
|
||||
pkg.homepage = `https://github.com/vatesfr/xen-orchestra/tree/master/${relativeDir}`
|
||||
pkg.bugs = `https://github.com/vatesfr/xen-orchestra/issues`
|
||||
pkg.repository = {
|
||||
directory: relativeDir,
|
||||
type: 'git',
|
||||
url: 'https://github.com/vatesfr/xen-orchestra.git',
|
||||
}
|
||||
|
||||
if (!('author' in pkg)) {
|
||||
pkg.author = {
|
||||
name: 'Vates SAS',
|
||||
url: 'https://vates.fr',
|
||||
}
|
||||
}
|
||||
if (!('license' in pkg)) {
|
||||
pkg.license = 'AGPL-3.0-or-later'
|
||||
}
|
||||
if (!('version' in pkg)) {
|
||||
pkg.version = '0.0.0'
|
||||
}
|
||||
pkg.engines = {
|
||||
node: '>=8.10',
|
||||
...pkg.engines,
|
||||
}
|
||||
|
||||
delete pkg.files
|
||||
delete pkg.husky
|
||||
delete pkg.standard
|
||||
delete pkg['lint-staged']
|
||||
|
||||
deleteIfEmpty(pkg, 'bin')
|
||||
deleteIfEmpty(pkg, 'dependencies')
|
||||
deleteIfEmpty(pkg, 'description')
|
||||
deleteIfEmpty(pkg, 'keywords')
|
||||
deleteProperties(pkg, 'config', ['commitizen'])
|
||||
deleteProperties(pkg, 'devDependencies', [
|
||||
'babel-7-jest',
|
||||
'babel-eslint',
|
||||
'babel-jest',
|
||||
'commitizen',
|
||||
'cz-conventional-changelog',
|
||||
'dependency-check',
|
||||
'eslint',
|
||||
'eslint-config-prettier',
|
||||
'eslint-config-standard',
|
||||
'eslint-plugin-import',
|
||||
'eslint-plugin-node',
|
||||
'eslint-plugin-promise',
|
||||
'eslint-plugin-standard',
|
||||
'flow-bin',
|
||||
'ghooks',
|
||||
'husky',
|
||||
'jest',
|
||||
'lint-staged',
|
||||
'prettier',
|
||||
'standard',
|
||||
])
|
||||
deleteProperties(pkg, 'scripts', ['commitmsg', 'cz'])
|
||||
|
||||
let { scripts = {} } = pkg
|
||||
const originalScripts = scripts
|
||||
|
||||
if (!pkg.private && !('postversion' in scripts)) {
|
||||
scripts = { ...scripts, postversion: 'npm publish --access public' }
|
||||
}
|
||||
|
||||
const prepublish = scripts.prepublish
|
||||
if (prepublish !== undefined && !('prepublishOnly' in scripts)) {
|
||||
scripts = {
|
||||
...scripts,
|
||||
prepublishOnly: prepublish,
|
||||
prepublish: undefined,
|
||||
}
|
||||
}
|
||||
|
||||
if (scripts !== originalScripts) {
|
||||
pkg.scripts = sortedObject(scripts)
|
||||
}
|
||||
|
||||
const useBabel =
|
||||
pkg.devDependencies?.['@babel/core'] !== undefined || pkg.dependencies?.['@babel/core'] !== undefined
|
||||
|
||||
return Promise.all([
|
||||
forceRelativeSymlink(NPMIGNORE_PATH, `${dir}/.npmignore`),
|
||||
readFile(`${dir}/.USAGE.md`, 'utf8')
|
||||
.then(content =>
|
||||
writeFile(
|
||||
`${dir}/README.md`,
|
||||
generateReadme({
|
||||
pkg,
|
||||
usage: content.trim(),
|
||||
})
|
||||
)
|
||||
)
|
||||
.catch(error => {
|
||||
if (error.code !== 'ENOENT') {
|
||||
console.error('Error while handling README', error)
|
||||
}
|
||||
}),
|
||||
useBabel ? forceRelativeSymlink(BABEL_ESLINTRC_PATH, `${dir}/.eslintrc.js`) : unlink(`${dir}/.eslintrc.js`),
|
||||
writeFile(`${dir}/package.json`, JSON.stringify(pkg, null, 2) + '\n'),
|
||||
useBabel || unlink(`${dir}/.babelrc.js`),
|
||||
unlink(`${dir}/.editorconfig`),
|
||||
unlink(`${dir}/.flowconfig`),
|
||||
unlink(`${dir}/.gitignore`),
|
||||
unlink(`${dir}/.jshintrc`),
|
||||
unlink(`${dir}/.prettierrc.js`),
|
||||
unlink(`${dir}/.travis.yml`),
|
||||
unlink(`${dir}/ISSUE_TEMPLATE.lock`),
|
||||
unlink(`${dir}/package-lock.json`),
|
||||
unlink(`${dir}/yarn.lock`),
|
||||
])
|
||||
})
|
||||
)
|
||||
Reference in New Issue
Block a user