packages/gen-idea-libs/generate.js (67 lines of code) (raw):
'use strict';
const path = require('path');
const fs = require('fs');
/* sample usage:
const generate = require('@jetbrains/gen-idea-libs')
generate({
'kotlin-extensions': require.resolve('@jetbrains/kotlin-extensions'),
'kotlin-react': require.resolve('@jetbrains/kotlin-react'),
'kotlin-react-dom': require.resolve('@jetbrains/kotlin-react-dom'),
'kotlinx-html-js': require.resolve('kotlinx-html')
}, '.')
*/
const findIml = function (directory) {
const imlList = fs.readdirSync(directory).filter((element) => {
var extName = path.extname(element);
return extName === '.iml';
});
return (imlList.length > 0 && imlList[0]) || null;
};
module.exports = function generate(packages, projectDir, imlPath) {
const libTemplate = fs.readFileSync(
path.join(__dirname, './libTemplate.xml'),
'utf8'
);
const depTemplate =
'<orderEntry type="library" name="%name%" level="project" />';
let iml;
let _imlPath = imlPath;
if (_imlPath) {
iml = fs.readFileSync(_imlPath, 'utf8');
} else {
try {
const ideaDir = path.join(projectDir, '.idea');
let imlFileName = findIml(ideaDir);
_imlPath = path.join(ideaDir, imlFileName);
iml = fs.readFileSync(_imlPath, 'utf8');
} catch (e) {
_imlPath = path.join(
projectDir,
`${path.basename(path.resolve(projectDir))}.iml`
);
try {
let imlFileName = findIml(projectDir);
_imlPath = path.join(projectDir, imlFileName);
iml = fs.readFileSync(_imlPath, 'utf8');
} catch (err) {
console.warn(
'gen-idea-libs failed to find %project-name%.iml file, skipping generation'
);
return;
}
}
}
Object.keys(packages).forEach((name) => {
const pkg = packages[name];
const classes = path.relative(projectDir, path.join(pkg, '..'));
fs.writeFile(
path.join(projectDir, `.idea/libraries/${name.replace(/-/g, '_')}.xml`),
libTemplate.replace(/%name%/g, name).replace(/%classes%/g, classes),
(err) => {
if (err) {
throw err;
}
}
);
const dep = depTemplate.replace(/%name%/g, name);
if (!iml.includes(dep)) {
iml = iml.replace(/(\n\s+)<\/component>/, `$1 ${dep}$&`);
}
});
fs.writeFile(_imlPath, iml, (err) => {
if (err) {
throw err;
}
});
};