UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

157 lines (155 loc) 6.26 kB
'use strict'; 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