roslyn-loader
Version:
Use roslyn to compile C# to TypeScript in Webpack
75 lines (68 loc) • 3.2 kB
JavaScript
/**
* Apache 2.0 License https://www.apache.org/licenses/LICENSE-2.0.html
* Author: Cole Chamberlain
*/
const path = require('path');
const fs = require('fs');
const cache = [];
module.exports = function (source) {
this.cacheable && this.cacheable();
const callback = this.async();
if (this.resourcePath.indexOf('node_modules') !== -1) {
// [ "/my/project/", "/moment/", "/moment-dependency/index.js" ]
var nodeModuleSplit = this.resourcePath.split('node_modules');
// "/my/project/node_modules/moment/node_modules/"
var packageNodeModulesDir = path.join(nodeModuleSplit.slice(0, nodeModuleSplit.length - 1).join('node_modules'), 'node_modules');
// "moment-dependency/index.js"
var relativeFilePath = nodeModuleSplit[nodeModuleSplit.length - 1].replace(/^[/\\]*/, '');
// "moment-dependency"
var relativePackageDir = relativeFilePath.replace(/[/\\].*$/i, '');
// "index.js"
var relativeSubFilePath = relativeFilePath.replace(/[/\\].*$/i, '');
/*
// "/my/project/node_modules/moment/node_modules/moment-dependency"
var packageDir = path.resolve(packageNodeModulesDir, relativePackageDir);
var packageJSON = require(path.join(packageDir, 'package.json'));
const fingerprint = `${packageJSON.name}:${packageJSON.version}`
if(cache.indexOf(fingerprint) !== -1)
return callback(null, source);
cache.push(fingerprint);
fs.readdir(packageDir, (err, files) => {
if(err) return callback(err);
let handled = false;
for(var licenseFileName of licenseFileNames) {
if(files.indexOf(licenseFileName) !== -1) {
var licensePath = path.resolve(packageDir, licenseFileName);
fs.readFile(licensePath, { encoding: 'utf8' }, (licenseErr, licenseText) => {
if(licenseErr) callback(licenseErr);
else callback(null, `${licenseComment(packageJSON, `==${packageJSON.name}/${licenseFileName}==\n${licenseText}`)}\n${source}`);
})
handled = true;
break;
}
}
// No license found, use whatever is in package.json
if(!handled) callback(null, `${licenseComment(packageJSON)}\n${source}`);
})
*/
} else {
callback(null, source);
}
}
function licenseComment (packageJSON, licenseText) {
if(licenseText && licenseText[licenseText.length - 1] === '\n')
licenseText = licenseText.substring(0, licenseText.length - 1);
var _licenseText = licenseText ? `\n * ${licenseText.replace(/\n+$/).replace(/(\*\/)/g, '').replace(/\n/g, '\n * ')}` : '';
var license = packageJSON.license ? sanitizeLicense(packageJSON.license) : packageJSON.licenses ? packageJSON.licenses.map(sanitizeLicense).join(', ') : null;
return `/*!
* ${packageJSON.name} (https://npmjs.com/package/${packageJSON.name})
* @license${license ? ` ${license}` : ''}
* @version ${packageJSON.version}${_licenseText}
*/`;
}
function sanitizeLicense(license) {
if(typeof license === 'string') return license;
if(license && license.type && license.url)
return `${license.type} (${license.url})`;
return license && license.type ? license.type : '';
}