Generate metadata for all package.json files

This commit is contained in:
Antonio Scandurra
2016-07-29 13:30:38 +02:00
parent 236897ecb9
commit 88aafe12ef
6 changed files with 1848 additions and 5 deletions

View File

@@ -11,6 +11,7 @@ const transpileCoffeeScriptPaths = require('./lib/transpile-coffee-script-paths'
const transpileCsonPaths = require('./lib/transpile-cson-paths')
const transpilePegJsPaths = require('./lib/transpile-peg-js-paths')
const generateModuleCache = require('./lib/generate-module-cache')
const generateMetadata = require('./lib/generate-metadata')
const packageApplication = require('./lib/package-application')
cleanOutputDirectory()
@@ -20,4 +21,5 @@ transpileCoffeeScriptPaths()
transpileCsonPaths()
transpilePegJsPaths()
generateModuleCache()
generateMetadata()
packageApplication()

File diff suppressed because it is too large Load Diff

View File

@@ -14,8 +14,6 @@ module.exports = function () {
let srcPaths = [
path.join(CONFIG.repositoryRootPath, 'dot-atom'),
path.join(CONFIG.repositoryRootPath, 'exports'),
path.join(CONFIG.repositoryRootPath, 'keymaps'),
path.join(CONFIG.repositoryRootPath, 'menus'),
path.join(CONFIG.repositoryRootPath, 'node_modules'),
path.join(CONFIG.repositoryRootPath, 'package.json'),
path.join(CONFIG.repositoryRootPath, 'static'),

View File

@@ -0,0 +1,132 @@
'use strict'
const path = require('path')
const CSON = require('season')
const fs = require('fs-extra')
const normalizePackageData = require('normalize-package-data')
const semver = require('semver')
const CONFIG = require('../config')
module.exports = function () {
console.log(`Generating metadata for ${path.join(CONFIG.intermediateAppPath, 'package.json')}...`)
CONFIG.appMetadata._atomPackages = buildBundledPackagesMetadata()
CONFIG.appMetadata._atomMenu = buildPlatformMenuMetadata()
CONFIG.appMetadata._atomKeymaps = buildPlatformKeymapsMetadata()
CONFIG.appMetadata._deprecatedPackages = buildDeprecatedPackagesMetadata()
fs.writeFileSync(path.join(CONFIG.intermediateAppPath, 'package.json'), JSON.stringify(CONFIG.appMetadata))
}
function buildBundledPackagesMetadata () {
const packages = {}
for (let packageName of Object.keys(CONFIG.appMetadata.packageDependencies)) {
const packagePath = path.join(CONFIG.intermediateAppPath, 'node_modules', packageName)
const packageMetadataPath = path.join(packagePath, 'package.json')
const packageMetadata = JSON.parse(fs.readFileSync(packageMetadataPath, 'utf8'))
normalizePackageData(packageMetadata, () => {
throw new Error(`Invalid package metadata. ${metadata.name}: ${msg}`)
}, true)
if (packageMetadata.repository && packageMetadata.repository.url && packageMetadata.repository.type === 'git') {
packageMetadata.repository.url = packageMetadata.repository.url.replace(/^git\+/, '')
}
delete packageMetadata['_from']
delete packageMetadata['_id']
delete packageMetadata['dist']
delete packageMetadata['readme']
delete packageMetadata['readmeFilename']
const packageModuleCache = packageMetadata._atomModuleCache || {}
if (packageModuleCache.extensions && packageModuleCache.extensions['.json']) {
const index = packageModuleCache.extensions['.json'].indexOf('package.json')
if (index !== -1) {
packageModuleCache.extensions['.json'].splice(index, 1)
}
}
const packageNewMetadata = {metadata: packageMetadata, keymaps: {}, menus: {}}
if (packageMetadata.main) {
const mainPath = require.resolve(path.resolve(packagePath, packageMetadata.main))
packageNewMetadata.main = path.relative(CONFIG.intermediateAppPath, mainPath)
}
const packageKeymapsPath = path.join(packagePath, 'keymaps')
if (fs.existsSync(packageKeymapsPath)) {
for (let packageKeymapName of fs.readdirSync(packageKeymapsPath)) {
const packageKeymapPath = path.join(packageKeymapsPath, packageKeymapName)
if (packageKeymapPath.endsWith('.cson') || packageKeymapPath.endsWith('.json')) {
const relativePath = path.relative(CONFIG.intermediateAppPath, packageKeymapPath)
packageNewMetadata.keymaps[relativePath] = CSON.readFileSync(packageKeymapPath)
fs.removeSync(packageKeymapPath)
}
}
if (fs.readdirSync(packageKeymapsPath).length === 0) {
fs.removeSync(packageKeymapsPath)
}
}
const packageMenusPath = path.join(packagePath, 'menus')
if (fs.existsSync(packageMenusPath)) {
for (let packageMenuName of fs.readdirSync(packageMenusPath)) {
const packageMenuPath = path.join(packageMenusPath, packageMenuName)
if (packageMenuPath.endsWith('.cson') || packageMenuPath.endsWith('.json')) {
const relativePath = path.relative(CONFIG.intermediateAppPath, packageMenuPath)
packageNewMetadata.menus[relativePath] = CSON.readFileSync(packageMenuPath)
fs.removeSync(packageMenuPath)
}
}
if (fs.readdirSync(packageMenusPath).length === 0) {
fs.removeSync(packageMenusPath)
}
}
packages[packageMetadata.name] = packageNewMetadata
if (packageModuleCache.extensions) {
for (let extension of Object.keys(packageModuleCache.extensions)) {
const paths = packageModuleCache.extensions[extension]
if (paths.length === 0) {
delete packageModuleCache.extensions[extension]
}
}
}
fs.removeSync(packageMetadataPath)
}
return packages
}
function buildPlatformMenuMetadata () {
const menuPath = path.join(CONFIG.repositoryRootPath, 'menus', `${process.platform}.cson`)
if (fs.existsSync(menuPath)) {
return CSON.readFileSync(menuPath)
} else {
return null
}
}
function buildPlatformKeymapsMetadata () {
const invalidPlatforms = ['darwin', 'freebsd', 'linux', 'sunos', 'win32'].filter(p => p !== process.platform)
const keymapsPath = path.join(CONFIG.repositoryRootPath, 'keymaps')
const keymaps = {}
for (let keymapName of fs.readdirSync(keymapsPath)) {
const keymapPath = path.join(keymapsPath, keymapName)
if (keymapPath.endsWith('.cson') || keymapPath.endsWith('.json')) {
const keymapPlatform = path.basename(keymapPath, path.extname(keymapPath))
if (invalidPlatforms.indexOf(keymapPlatform) === -1) {
keymaps[path.basename(keymapPath)] = CSON.readFileSync(keymapPath)
}
}
}
return keymaps
}
function buildDeprecatedPackagesMetadata () {
const deprecatedPackagesMetadata = require('../deprecated-packages')
for (let packageName of Object.keys(deprecatedPackagesMetadata)) {
const packageMetadata = deprecatedPackagesMetadata[packageName]
if (packageMetadata.version && !semver.validRange(packageMetadata.version)) {
throw new Error(`Invalid range: ${version} (${name}).`)
}
}
return deprecatedPackagesMetadata
}

View File

@@ -16,9 +16,6 @@ module.exports = function () {
function getPathsToTranspile () {
let paths = []
paths = paths.concat(glob.sync(path.join(CONFIG.intermediateAppPath, 'menus', '*.cson')))
paths = paths.concat(glob.sync(path.join(CONFIG.intermediateAppPath, 'keymaps', '*.cson')))
paths = paths.concat(glob.sync(path.join(CONFIG.intermediateAppPath, 'static', '**', '*.cson')))
for (let packageName of Object.keys(CONFIG.appMetadata.packageDependencies)) {
paths = paths.concat(glob.sync(
path.join(CONFIG.intermediateAppPath, 'node_modules', packageName, '**', '*.cson'),

View File

@@ -8,6 +8,7 @@
"fs-extra": "0.30.0",
"glob": "7.0.3",
"mkdirp": "0.5.1",
"normalize-package-data": "2.3.5",
"npm": "3.10.5",
"pegjs": "0.9.0"
}