@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
157 lines (155 loc) • 6.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const buffer_1 = require("buffer");
const fs_1 = tslib_1.__importDefault(require("fs"));
const fancy_log_1 = tslib_1.__importDefault(require("fancy-log"));
const plugin_error_1 = tslib_1.__importDefault(require("plugin-error"));
const through2_1 = tslib_1.__importDefault(require("through2"));
const vinyl_1 = tslib_1.__importDefault(require("vinyl"));
const util = tslib_1.__importStar(require("../utilities"));
const PLUGIN_NAME = 'gulp-manifest-resource';
function gulpManifestResources(options) {
function findResourceKey(node, results) {
const match = 'resources:strings:';
const keys = Object.keys(node);
if (keys && keys.length > 0) {
keys.forEach(key => {
const target = node[key];
if (target) {
if (typeof target === 'string') {
if (target.indexOf(match) === 0) {
const value = target.substring(match.length);
if (results.indexOf(value) < 0) {
results.push(value);
}
}
}
else {
findResourceKey(target, results);
}
}
});
}
}
// override options settings if not specified.
options = Object.assign({
manifest: 'src/manifest.json',
localeOffset: 1
}, options || {});
const resources = {};
return through2_1.default.obj(
/**
* Transform
*/
function (file, encoding, callback) {
let locale = 'default';
if (resources.default) {
// if default is set already, find current locale from the file path.
const pathSegments = file.history[0].split('\\');
locale = pathSegments[pathSegments.length - (2 + options.localeOffset)];
}
resources[locale] = {};
if (resources.default) {
// if default is set already, pre-fill all resource items from default.
for (const resourceId in resources.default) {
if (resources.default.hasOwnProperty(resourceId)) {
resources[locale][resourceId] = resources.default[resourceId];
}
}
}
// remove comments, /* multiline comment */ and // one line comment and "//": "JSON element comment"
const content = file.contents.toString('utf8')
.replace(/(\/\*([^*]|[\n]|(\*+([^*/]|[\n])))*\*\/+)|( +\/\/.*)|( +\"\/\/\".*)/g, '');
const object = JSON.parse(content);
if (object[options.resourceName] && object[options.resourceName]['Manifest']) {
// supports <ResourceName>.Manifest.<KeyName> format.
const items = object[options.resourceName]['Manifest'];
for (const key in items) {
if (items.hasOwnProperty(key)) {
resources[locale][key] = items[key];
}
}
}
else {
// supports <ResourceName>_Manifest_KeyName format.
const resourceManifest = options.resourceName + '_Manifest_';
for (const name in object) {
if (object.hasOwnProperty(name)) {
const index = name.indexOf(resourceManifest);
if (index === 0) {
const value = object[name];
const resourceId2 = name.substring(resourceManifest.length);
resources[locale][resourceId2] = value;
}
}
}
}
return callback();
},
/**
* Flush
*/
function (callback) {
let result = null;
try {
const manifestObject = JSON.parse(fs_1.default.readFileSync(options.manifest, 'utf8'));
const keys = [];
findResourceKey(manifestObject, keys);
const missing = [];
const unused = Object.keys(resources.default);
keys.forEach(function (key) {
const index = unused.indexOf(key);
if (index >= 0) {
unused.splice(index, 1);
}
else {
missing.push(key);
}
});
if (missing.length > 0) {
missing.forEach(item => {
fancy_log_1.default.error('Missing resource: ' + item);
});
throw new Error('Missing resource found in manifest.json!');
}
if (unused.length > 0) {
unused.forEach(item => {
fancy_log_1.default.error('Unused resource: ' + item);
});
throw new Error('Unused resource found in strings.resjson!');
}
const locales = [];
for (const locale in resources) {
if (resources.hasOwnProperty(locale) && locale !== 'default') {
locales.push(locale);
}
}
locales.sort();
locales.unshift('default');
const formattedResources = [];
for (const locale of locales) {
formattedResources.push({
locale: locale,
strings: resources[locale]
});
}
manifestObject.resources = formattedResources;
const manifestFile = new vinyl_1.default({
cwd: './',
path: options.manifest,
contents: buffer_1.Buffer.from(JSON.stringify(manifestObject, null, 2), 'utf8')
});
this.push(manifestFile);
}
catch (e) {
const error = (!e.plugin || (e.plugin !== PLUGIN_NAME)) ?
util.extendError(new plugin_error_1.default({ plugin: PLUGIN_NAME, message: e.message }), e) : e;
fancy_log_1.default.error(error);
result = e;
}
callback(result);
});
}
module.exports = gulpManifestResources;
//# sourceMappingURL=index.js.map