Best Python code snippet using hypothesis
i18n.js
Source:i18n.js  
1define(["./_base/kernel", "require", "./has", "./_base/array", "./_base/config", "./_base/lang", "./has!host-browser?./_base/xhr", "./json", "module"],2	function(dojo, require, has, array, config, lang, xhr, json, module){3	// module:4	//		dojo/i18n5	has.add("dojo-preload-i18n-Api",6		// if true, define the preload localizations machinery7		18	);9	has.add("dojo-v1x-i18n-Api",10		// if true, define the v1.x i18n functions11		112	);13	var14		thisModule = dojo.i18n =15			{16				// summary:17				//		This module implements the dojo/i18n! plugin and the v1.6- i18n API18				// description:19				//		We choose to include our own plugin to leverage functionality already contained in dojo20				//		and thereby reduce the size of the plugin compared to various loader implementations. Also, this21				//		allows foreign AMD loaders to be used without their plugins.22			},23		nlsRe =24			// regexp for reconstructing the master bundle name from parts of the regexp match25			// nlsRe.exec("foo/bar/baz/nls/en-ca/foo") gives:26			// ["foo/bar/baz/nls/en-ca/foo", "foo/bar/baz/nls/", "/", "/", "en-ca", "foo"]27			// nlsRe.exec("foo/bar/baz/nls/foo") gives:28			// ["foo/bar/baz/nls/foo", "foo/bar/baz/nls/", "/", "/", "foo", ""]29			// so, if match[5] is blank, it means this is the top bundle definition.30			// courtesy of http://requirejs.org31			/(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/,32		getAvailableLocales = function(33			root,34			locale,35			bundlePath,36			bundleName37		){38			// summary:39			//		return a vector of module ids containing all available locales with respect to the target locale40			//		For example, assuming:41			//42			//		- the root bundle indicates specific bundles for "fr" and "fr-ca",43			//		-  bundlePath is "myPackage/nls"44			//		- bundleName is "myBundle"45			//46			//		Then a locale argument of "fr-ca" would return47			//48			//			["myPackage/nls/myBundle", "myPackage/nls/fr/myBundle", "myPackage/nls/fr-ca/myBundle"]49			//50			//		Notice that bundles are returned least-specific to most-specific, starting with the root.51			//52			//		If root===false indicates we're working with a pre-AMD i18n bundle that doesn't tell about the available locales;53			//		therefore, assume everything is available and get 404 errors that indicate a particular localization is not available54			for(var result = [bundlePath + bundleName], localeParts = locale.split("-"), current = "", i = 0; i<localeParts.length; i++){55				current += (current ? "-" : "") + localeParts[i];56				if(!root || root[current]){57					result.push(bundlePath + current + "/" + bundleName);58					result.specificity = current;59				}60			}61			return result;62		},63		cache = {},64		getBundleName = function(moduleName, bundleName, locale){65			locale = locale ? locale.toLowerCase() : dojo.locale;66			moduleName = moduleName.replace(/\./g, "/");67			bundleName = bundleName.replace(/\./g, "/");68			return (/root/i.test(locale)) ?69				(moduleName + "/nls/" + bundleName) :70				(moduleName + "/nls/" + locale + "/" + bundleName);71		},72		getL10nName = dojo.getL10nName = function(moduleName, bundleName, locale){73			return moduleName = module.id + "!" + getBundleName(moduleName, bundleName, locale);74		},75		doLoad = function(require, bundlePathAndName, bundlePath, bundleName, locale, load){76			// summary:77			//		get the root bundle which instructs which other bundles are required to construct the localized bundle78			require([bundlePathAndName], function(root){79				var current = lang.clone(root.root || root.ROOT),// 1.6 built bundle defined ROOT80					availableLocales = getAvailableLocales(!root._v1x && root, locale, bundlePath, bundleName);81				require(availableLocales, function(){82					for (var i = 1; i<availableLocales.length; i++){83						current = lang.mixin(lang.clone(current), arguments[i]);84					}85					// target may not have been resolve (e.g., maybe only "fr" exists when "fr-ca" was requested)86					var target = bundlePathAndName + "/" + locale;87					cache[target] = current;88					current.$locale = availableLocales.specificity;89					load();90				});91			});92		},93		normalize = function(id, toAbsMid){94			// summary:95			//		id may be relative.96			//		preload has form `*preload*<path>/nls/<module>*<flattened locales>` and97			//		therefore never looks like a relative98			return /^\./.test(id) ? toAbsMid(id) : id;99		},100		getLocalesToLoad = function(targetLocale){101			var list = config.extraLocale || [];102			list = lang.isArray(list) ? list : [list];103			list.push(targetLocale);104			return list;105		},106		load = function(id, require, load){107			// summary:108			//		id is in one of the following formats109			//110			//		1. <path>/nls/<bundle>111			//			=> load the bundle, localized to config.locale; load all bundles localized to112			//			config.extraLocale (if any); return the loaded bundle localized to config.locale.113			//114			//		2. <path>/nls/<locale>/<bundle>115			//			=> load then return the bundle localized to <locale>116			//117			//		3. *preload*<path>/nls/<module>*<JSON array of available locales>118			//			=> for config.locale and all config.extraLocale, load all bundles found119			//			in the best-matching bundle rollup. A value of 1 is returned, which120			//			is meaningless other than to say the plugin is executing the requested121			//			preloads122			//123			//		In cases 1 and 2, <path> is always normalized to an absolute module id upon entry; see124			//		normalize. In case 3, it <path> is assumed to be absolute; this is arranged by the builder.125			//126			//		To load a bundle means to insert the bundle into the plugin's cache and publish the bundle127			//		value to the loader. Given <path>, <bundle>, and a particular <locale>, the cache key128			//129			//			<path>/nls/<bundle>/<locale>130			//131			//		will hold the value. Similarly, then plugin will publish this value to the loader by132			//133			//			define("<path>/nls/<bundle>/<locale>", <bundle-value>);134			//135			//		Given this algorithm, other machinery can provide fast load paths be preplacing136			//		values in the plugin's cache, which is public. When a load is demanded the137			//		cache is inspected before starting any loading. Explicitly placing values in the plugin138			//		cache is an advanced/experimental feature that should not be needed; use at your own risk.139			//140			//		For the normal AMD algorithm, the root bundle is loaded first, which instructs the141			//		plugin what additional localized bundles are required for a particular locale. These142			//		additional locales are loaded and a mix of the root and each progressively-specific143			//		locale is returned. For example:144			//145			//		1. The client demands "dojo/i18n!some/path/nls/someBundle146			//147			//		2. The loader demands load(some/path/nls/someBundle)148			//149			//		3. This plugin require's "some/path/nls/someBundle", which is the root bundle.150			//151			//		4. Assuming config.locale is "ab-cd-ef" and the root bundle indicates that localizations152			//		are available for "ab" and "ab-cd-ef" (note the missing "ab-cd", then the plugin153			//		requires "some/path/nls/ab/someBundle" and "some/path/nls/ab-cd-ef/someBundle"154			//155			//		5. Upon receiving all required bundles, the plugin constructs the value of the bundle156			//		ab-cd-ef as...157			//158			//				mixin(mixin(mixin({}, require("some/path/nls/someBundle"),159			//		  			require("some/path/nls/ab/someBundle")),160			//					require("some/path/nls/ab-cd-ef/someBundle"));161			//162			//		This value is inserted into the cache and published to the loader at the163			//		key/module-id some/path/nls/someBundle/ab-cd-ef.164			//165			//		The special preload signature (case 3) instructs the plugin to stop servicing all normal requests166			//		(further preload requests will be serviced) until all ongoing preloading has completed.167			//168			//		The preload signature instructs the plugin that a special rollup module is available that contains169			//		one or more flattened, localized bundles. The JSON array of available locales indicates which locales170			//		are available. Here is an example:171			//172			//			*preload*some/path/nls/someModule*["root", "ab", "ab-cd-ef"]173			//174			//		This indicates the following rollup modules are available:175			//176			//			some/path/nls/someModule_ROOT177			//			some/path/nls/someModule_ab178			//			some/path/nls/someModule_ab-cd-ef179			//180			//		Each of these modules is a normal AMD module that contains one or more flattened bundles in a hash.181			//		For example, assume someModule contained the bundles some/bundle/path/someBundle and182			//		some/bundle/path/someOtherBundle, then some/path/nls/someModule_ab would be expressed as follows:183			//184			//			define({185			//				some/bundle/path/someBundle:<value of someBundle, flattened with respect to locale ab>,186			//				some/bundle/path/someOtherBundle:<value of someOtherBundle, flattened with respect to locale ab>,187			//			});188			//189			//		E.g., given this design, preloading for locale=="ab" can execute the following algorithm:190			//191			//			require(["some/path/nls/someModule_ab"], function(rollup){192			//				for(var p in rollup){193			//					var id = p + "/ab",194			//					cache[id] = rollup[p];195			//					define(id, rollup[p]);196			//				}197			//			});198			//199			//		Similarly, if "ab-cd" is requested, the algorithm can determine that "ab" is the best available and200			//		load accordingly.201			//202			//		The builder will write such rollups for every layer if a non-empty localeList  profile property is203			//		provided. Further, the builder will include the following cache entry in the cache associated with204			//		any layer.205			//206			//			"*now":function(r){r(['dojo/i18n!*preload*<path>/nls/<module>*<JSON array of available locales>']);}207			//208			//		The *now special cache module instructs the loader to apply the provided function to context-require209			//		with respect to the particular layer being defined. This causes the plugin to hold all normal service210			//		requests until all preloading is complete.211			//212			//		Notice that this algorithm is rarely better than the standard AMD load algorithm. Consider the normal case213			//		where the target locale has a single segment and a layer depends on a single bundle:214			//215			//		Without Preloads:216			//217			//		1. Layer loads root bundle.218			//		2. bundle is demanded; plugin loads single localized bundle.219			//220			//		With Preloads:221			//222			//		1. Layer causes preloading of target bundle.223			//		2. bundle is demanded; service is delayed until preloading complete; bundle is returned.224			//225			//		In each case a single transaction is required to load the target bundle. In cases where multiple bundles226			//		are required and/or the locale has multiple segments, preloads still requires a single transaction whereas227			//		the normal path requires an additional transaction for each additional bundle/locale-segment. However all228			//		of these additional transactions can be done concurrently. Owing to this analysis, the entire preloading229			//		algorithm can be discard during a build by setting the has feature dojo-preload-i18n-Api to false.230			var match = nlsRe.exec(id),231				bundlePath = match[1] + "/",232				bundleName = match[5] || match[4],233				bundlePathAndName = bundlePath + bundleName,234				localeSpecified = (match[5] && match[4]),235				targetLocale =	localeSpecified || dojo.locale || "",236				loadTarget = bundlePathAndName + "/" + targetLocale,237				loadList = localeSpecified ? [targetLocale] : getLocalesToLoad(targetLocale),238				remaining = loadList.length,239				finish = function(){240					if(!--remaining){241						load(lang.delegate(cache[loadTarget]));242					}243				},244				split = id.split("*"),245				preloadDemand = split[1] == "preload";246			if(has("dojo-preload-i18n-Api")){247				if(preloadDemand){248					if(!cache[id]){249						// use cache[id] to prevent multiple preloads of the same preload; this shouldn't happen, but250						// who knows what over-aggressive human optimizers may attempt251						cache[id] = 1;252						preloadL10n(split[2], json.parse(split[3]), 1, require);253					}254					// don't stall the loader!255					load(1);256				}257				if(preloadDemand || (waitForPreloads(id, require, load) && !cache[loadTarget])){258					return;259				}260			}261			else if (preloadDemand) {262				// If a build is created with nls resources and 'dojo-preload-i18n-Api' has not been set to false,263				// the built file will include a preload in the cache (which looks about like so:)264				// '*now':function(r){r(['dojo/i18n!*preload*dojo/nls/dojo*["ar","ca","cs","da","de","el","en-gb","en-us","es-es","fi-fi","fr-fr","he-il","hu","it-it","ja-jp","ko-kr","nl-nl","nb","pl","pt-br","pt-pt","ru","sk","sl","sv","th","tr","zh-tw","zh-cn","ROOT"]']);}265				// If the consumer of the build sets 'dojo-preload-i18n-Api' to false in the Dojo config, the cached266				// preload will not be parsed and will result in an attempt to call 'require' passing it the unparsed267				// preload, which is not a valid module id.268				// In this case we should skip this request.269				load(1);270				return;271			}272			array.forEach(loadList, function(locale){273				var target = bundlePathAndName + "/" + locale;274				if(has("dojo-preload-i18n-Api")){275					checkForLegacyModules(target);276				}277				if(!cache[target]){278					doLoad(require, bundlePathAndName, bundlePath, bundleName, locale, finish);279				}else{280					finish();281				}282			});283		};284	if(has("dojo-preload-i18n-Api") || has("dojo-v1x-i18n-Api")){285		var normalizeLocale = thisModule.normalizeLocale = function(locale){286				var result = locale ? locale.toLowerCase() : dojo.locale;287				return result == "root" ? "ROOT" : result;288			},289			isXd = function(mid, contextRequire){290				return (has("dojo-sync-loader") && has("dojo-v1x-i18n-Api")) ?291					contextRequire.isXdUrl(require.toUrl(mid + ".js")) :292					true;293			},294			preloading = 0,295			preloadWaitQueue = [],296			preloadL10n = thisModule._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated, /*boolean?*/ guaranteedAmdFormat, /*function?*/ contextRequire){297				// summary:298				//		Load available flattened resource bundles associated with a particular module for dojo/locale and all dojo/config.extraLocale (if any)299				// description:300				//		Only called by built layer files. The entire locale hierarchy is loaded. For example,301				//		if locale=="ab-cd", then ROOT, "ab", and "ab-cd" are loaded. This is different than v1.6-302				//		in that the v1.6- would only load ab-cd...which was *always* flattened.303				//304				//		If guaranteedAmdFormat is true, then the module can be loaded with require thereby circumventing the detection algorithm305				//		and the extra possible extra transaction.306				// If this function is called from legacy code, then guaranteedAmdFormat and contextRequire will be undefined. Since the function307				// needs a require in order to resolve module ids, fall back to the context-require associated with this dojo/i18n module, which308				// itself may have been mapped.309				contextRequire = contextRequire || require;310				function doRequire(mid, callback){311					if(isXd(mid, contextRequire) || guaranteedAmdFormat){312						contextRequire([mid], callback);313					}else{314						syncRequire([mid], callback, contextRequire);315					}316				}317				function forEachLocale(locale, func){318					// given locale= "ab-cd-ef", calls func on "ab-cd-ef", "ab-cd", "ab", "ROOT"; stops calling the first time func returns truthy319					var parts = locale.split("-");320					while(parts.length){321						if(func(parts.join("-"))){322							return;323						}324						parts.pop();325					}326					func("ROOT");327				}328					function preloadingAddLock(){329						preloading++;330					}331					function preloadingRelLock(){332						--preloading;333						while(!preloading && preloadWaitQueue.length){334							load.apply(null, preloadWaitQueue.shift());335						}336					}337					function cacheId(path, name, loc, require){338						// path is assumed to have a trailing "/"339						return require.toAbsMid(path + name + "/" + loc)340					}341					function preload(locale){342						locale = normalizeLocale(locale);343						forEachLocale(locale, function(loc){344							if(array.indexOf(localesGenerated, loc) >= 0){345								var mid = bundlePrefix.replace(/\./g, "/") + "_" + loc;346								preloadingAddLock();347								doRequire(mid, function(rollup){348									for(var p in rollup){349										var bundle = rollup[p],350											match = p.match(/(.+)\/([^\/]+)$/),351											bundleName, bundlePath;352											353											// If there is no match, the bundle is not a regular bundle from an AMD layer.354											if (!match){continue;}355											bundleName = match[2];356											bundlePath = match[1] + "/";357										// backcompat358										if(!bundle._localized){continue;}359										var localized;360										if(loc === "ROOT"){361											var root = localized = bundle._localized;362											delete bundle._localized;363											root.root = bundle;364											cache[require.toAbsMid(p)] = root;365										}else{366											localized = bundle._localized;367											cache[cacheId(bundlePath, bundleName, loc, require)] = bundle;368										}369										if(loc !== locale){370											// capture some locale variables371											function improveBundle(bundlePath, bundleName, bundle, localized){372												// locale was not flattened and we've fallen back to a less-specific locale that was flattened373												// for example, we had a flattened 'fr', a 'fr-ca' is available for at least this bundle, and374												// locale==='fr-ca'; therefore, we must improve the bundle as retrieved from the rollup by375												// manually loading the fr-ca version of the bundle and mixing this into the already-retrieved 'fr'376												// version of the bundle.377												//378												// Remember, different bundles may have different sets of locales available.379												//380												// we are really falling back on the regular algorithm here, but--hopefully--starting with most381												// of the required bundles already on board as given by the rollup and we need to "manually" load382												// only one locale from a few bundles...or even better...we won't find anything better to load.383												// This algorithm ensures there is nothing better to load even when we can only load a less-specific rollup.384												//385												// note: this feature is only available in async mode386												// inspect the loaded bundle that came from the rollup to see if something better is available387												// for any bundle in a rollup, more-specific available locales are given at localized.388												var requiredBundles = [],389													cacheIds = [];390												forEachLocale(locale, function(loc){391													if(localized[loc]){392														requiredBundles.push(require.toAbsMid(bundlePath + loc + "/" + bundleName));393														cacheIds.push(cacheId(bundlePath, bundleName, loc, require));394													}395												});396												if(requiredBundles.length){397													preloadingAddLock();398													contextRequire(requiredBundles, function(){399														// requiredBundles was constructed by forEachLocale so it contains locales from 400														// less specific to most specific. 401														// the loop starts with the most specific locale, the last one.402														for(var i = requiredBundles.length - 1; i >= 0 ; i--){403															bundle = lang.mixin(lang.clone(bundle), arguments[i]);404															cache[cacheIds[i]] = bundle;405														}406														// this is the best possible (maybe a perfect match, maybe not), accept it407														cache[cacheId(bundlePath, bundleName, locale, require)] = lang.clone(bundle);408														preloadingRelLock();409													});410												}else{411													// this is the best possible (definitely not a perfect match), accept it412													cache[cacheId(bundlePath, bundleName, locale, require)] = bundle;413												}414											}415											improveBundle(bundlePath, bundleName, bundle, localized);416										}417									}418									preloadingRelLock();419								});420								return true;421							}422							return false;423						});424					}425				preload();426				array.forEach(dojo.config.extraLocale, preload);427			},428			waitForPreloads = function(id, require, load){429				if(preloading){430					preloadWaitQueue.push([id, require, load]);431				}432				return preloading;433			},434			checkForLegacyModules = function()435				{};436	}437	if(has("dojo-v1x-i18n-Api")){438		// this code path assumes the dojo loader and won't work with a standard AMD loader439		var amdValue = {},440			evalBundle,441			syncRequire = function(deps, callback, require){442				var results = [];443				array.forEach(deps, function(mid){444					var url = require.toUrl(mid + ".js");445					function load(text){446						if (!evalBundle) {447							// use the function ctor to keep the minifiers away (also come close to global scope, but this is secondary)448							evalBundle = new Function(449								"__bundle",				   // the bundle to evalutate450								"__checkForLegacyModules", // a function that checks if __bundle defined __mid in the global space451								"__mid",				   // the mid that __bundle is intended to define452								"__amdValue",453								// returns one of:454								//		1 => the bundle was an AMD bundle455								//		a legacy bundle object that is the value of __mid456								//		instance of Error => could not figure out how to evaluate bundle457								// used to detect when __bundle calls define458								"var define = function(mid, factory){define.called = 1; __amdValue.result = factory || mid;},"459								+ "	   require = function(){define.called = 1;};"460								+ "try{"461								+		"define.called = 0;"462								+		"eval(__bundle);"463								+		"if(define.called==1)"464											// bundle called define; therefore signal it's an AMD bundle465								+			"return __amdValue;"466								+		"if((__checkForLegacyModules = __checkForLegacyModules(__mid)))"467											// bundle was probably a v1.6- built NLS flattened NLS bundle that defined __mid in the global space468								+			"return __checkForLegacyModules;"469								+ "}catch(e){}"470								// evaulating the bundle was *neither* an AMD *nor* a legacy flattened bundle471								// either way, re-eval *after* surrounding with parentheses472								+ "try{"473								+		"return eval('('+__bundle+')');"474								+ "}catch(e){"475								+		"return e;"476								+ "}"477							);478						}479						var result = evalBundle(text, checkForLegacyModules, mid, amdValue);480						if(result===amdValue){481							// the bundle was an AMD module; re-inject it through the normal AMD path482							// we gotta do this since it could be an anonymous module and simply evaluating483							// the text here won't provide the loader with the context to know what484							// module is being defined()'d. With browser caching, this should be free; further485							// this entire code path can be circumvented by using the AMD format to begin with486							results.push(cache[url] = amdValue.result);487						}else{488							if(result instanceof Error){489								console.error("failed to evaluate i18n bundle; url=" + url, result);490								result = {};491							}492							// nls/<locale>/<bundle-name> indicates not the root.493							results.push(cache[url] = (/nls\/[^\/]+\/[^\/]+$/.test(url) ? result : {root:result, _v1x:1}));494						}495					}496					if(cache[url]){497						results.push(cache[url]);498					}else{499						var bundle = require.syncLoadNls(mid);500						// need to check for legacy module here because there might be a legacy module for a501						// less specific locale (which was not looked up during the first checkForLegacyModules502						// call in load()).503						// Also need to reverse the locale and the module name in the mid because syncRequire504						// deps parameters uses the AMD style package/nls/locale/module while legacy code uses505						// package/nls/module/locale.506						if(!bundle){507							bundle = checkForLegacyModules(mid.replace(/nls\/([^\/]*)\/([^\/]*)$/, "nls/$2/$1"));508						}509						if(bundle){510							results.push(bundle);511						}else{512							if(!xhr){513								try{514									require.getText(url, true, load);515								}catch(e){516									results.push(cache[url] = {});517								}518							}else{519								xhr.get({520									url:url,521									sync:true,522									load:load,523									error:function(){524										results.push(cache[url] = {});525									}526								});527							}528						}529					}530				});531				callback && callback.apply(null, results);532			};533		checkForLegacyModules = function(target){534			// legacy code may have already loaded [e.g] the raw bundle x/y/z at x.y.z; when true, push into the cache535			for(var result, names = target.split("/"), object = dojo.global[names[0]], i = 1; object && i<names.length-1; object = object[names[i++]]){}536			if(object){537				result = object[names[i]];538				if(!result){539					// fallback for incorrect bundle build of 1.6540					result = object[names[i].replace(/-/g,"_")];541				}542				if(result){543					cache[target] = result;544				}545			}546			return result;547		};548		thisModule.getLocalization = function(moduleName, bundleName, locale){549			var result,550				l10nName = getBundleName(moduleName, bundleName, locale);551			load(552				l10nName,553				// isXd() and syncRequire() need a context-require in order to resolve the mid with respect to a reference module.554				// Since this legacy function does not have the concept of a reference module, resolve with respect to this555				// dojo/i18n module, which, itself may have been mapped.556				(!isXd(l10nName, require) ? function(deps, callback){ syncRequire(deps, callback, require); } : require),557				function(result_){ result = result_; }558			);559			return result;560		};561	}562	return lang.mixin(thisModule, {563		dynamic:true,564		normalize:normalize,565		load:load,566		cache:cache,567		getL10nName: getL10nName568	});...i18n.js.uncompressed.js
Source:i18n.js.uncompressed.js  
1define("dojo/i18n", ["./_base/kernel", "require", "./has", "./_base/array", "./_base/config", "./_base/lang", "./_base/xhr", "./json", "module"],2	function(dojo, require, has, array, config, lang, xhr, json, module){3	// module:4	//		dojo/i18n5	has.add("dojo-preload-i18n-Api",6		// if true, define the preload localizations machinery7		18	);9	 1 || has.add("dojo-v1x-i18n-Api",10		// if true, define the v1.x i18n functions11		112	);13	var14		thisModule = dojo.i18n =15			{16				// summary:17				//		This module implements the dojo/i18n! plugin and the v1.6- i18n API18				// description:19				//		We choose to include our own plugin to leverage functionality already contained in dojo20				//		and thereby reduce the size of the plugin compared to various loader implementations. Also, this21				//		allows foreign AMD loaders to be used without their plugins.22			},23		nlsRe =24			// regexp for reconstructing the master bundle name from parts of the regexp match25			// nlsRe.exec("foo/bar/baz/nls/en-ca/foo") gives:26			// ["foo/bar/baz/nls/en-ca/foo", "foo/bar/baz/nls/", "/", "/", "en-ca", "foo"]27			// nlsRe.exec("foo/bar/baz/nls/foo") gives:28			// ["foo/bar/baz/nls/foo", "foo/bar/baz/nls/", "/", "/", "foo", ""]29			// so, if match[5] is blank, it means this is the top bundle definition.30			// courtesy of http://requirejs.org31			/(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/,32		getAvailableLocales = function(33			root,34			locale,35			bundlePath,36			bundleName37		){38			// summary:39			//		return a vector of module ids containing all available locales with respect to the target locale40			//		For example, assuming:41			//42			//		- the root bundle indicates specific bundles for "fr" and "fr-ca",43			//		-  bundlePath is "myPackage/nls"44			//		- bundleName is "myBundle"45			//46			//		Then a locale argument of "fr-ca" would return47			//48			//			["myPackage/nls/myBundle", "myPackage/nls/fr/myBundle", "myPackage/nls/fr-ca/myBundle"]49			//50			//		Notice that bundles are returned least-specific to most-specific, starting with the root.51			//52			//		If root===false indicates we're working with a pre-AMD i18n bundle that doesn't tell about the available locales;53			//		therefore, assume everything is available and get 404 errors that indicate a particular localization is not available54			for(var result = [bundlePath + bundleName], localeParts = locale.split("-"), current = "", i = 0; i<localeParts.length; i++){55				current += (current ? "-" : "") + localeParts[i];56				if(!root || root[current]){57					result.push(bundlePath + current + "/" + bundleName);58					result.specificity = current;59				}60			}61			return result;62		},63		cache = {},64		getBundleName = function(moduleName, bundleName, locale){65			locale = locale ? locale.toLowerCase() : dojo.locale;66			moduleName = moduleName.replace(/\./g, "/");67			bundleName = bundleName.replace(/\./g, "/");68			return (/root/i.test(locale)) ?69				(moduleName + "/nls/" + bundleName) :70				(moduleName + "/nls/" + locale + "/" + bundleName);71		},72		getL10nName = dojo.getL10nName = function(moduleName, bundleName, locale){73			return moduleName = module.id + "!" + getBundleName(moduleName, bundleName, locale);74		},75		doLoad = function(require, bundlePathAndName, bundlePath, bundleName, locale, load){76			// summary:77			//		get the root bundle which instructs which other bundles are required to construct the localized bundle78			require([bundlePathAndName], function(root){79				var current = lang.clone(root.root || root.ROOT),// 1.6 built bundle defined ROOT80					availableLocales = getAvailableLocales(!root._v1x && root, locale, bundlePath, bundleName);81				require(availableLocales, function(){82					for (var i = 1; i<availableLocales.length; i++){83						current = lang.mixin(lang.clone(current), arguments[i]);84					}85					// target may not have been resolve (e.g., maybe only "fr" exists when "fr-ca" was requested)86					var target = bundlePathAndName + "/" + locale;87					cache[target] = current;88					current.$locale = availableLocales.specificity;89					load();90				});91			});92		},93		normalize = function(id, toAbsMid){94			// summary:95			//		id may be relative.96			//		preload has form `*preload*<path>/nls/<module>*<flattened locales>` and97			//		therefore never looks like a relative98			return /^\./.test(id) ? toAbsMid(id) : id;99		},100		getLocalesToLoad = function(targetLocale){101			var list = config.extraLocale || [];102			list = lang.isArray(list) ? list : [list];103			list.push(targetLocale);104			return list;105		},106		load = function(id, require, load){107			// summary:108			//		id is in one of the following formats109			//110			//		1. <path>/nls/<bundle>111			//			=> load the bundle, localized to config.locale; load all bundles localized to112			//			config.extraLocale (if any); return the loaded bundle localized to config.locale.113			//114			//		2. <path>/nls/<locale>/<bundle>115			//			=> load then return the bundle localized to <locale>116			//117			//		3. *preload*<path>/nls/<module>*<JSON array of available locales>118			//			=> for config.locale and all config.extraLocale, load all bundles found119			//			in the best-matching bundle rollup. A value of 1 is returned, which120			//			is meaningless other than to say the plugin is executing the requested121			//			preloads122			//123			//		In cases 1 and 2, <path> is always normalized to an absolute module id upon entry; see124			//		normalize. In case 3, it <path> is assumed to be absolute; this is arranged by the builder.125			//126			//		To load a bundle means to insert the bundle into the plugin's cache and publish the bundle127			//		value to the loader. Given <path>, <bundle>, and a particular <locale>, the cache key128			//129			//			<path>/nls/<bundle>/<locale>130			//131			//		will hold the value. Similarly, then plugin will publish this value to the loader by132			//133			//			define("<path>/nls/<bundle>/<locale>", <bundle-value>);134			//135			//		Given this algorithm, other machinery can provide fast load paths be preplacing136			//		values in the plugin's cache, which is public. When a load is demanded the137			//		cache is inspected before starting any loading. Explicitly placing values in the plugin138			//		cache is an advanced/experimental feature that should not be needed; use at your own risk.139			//140			//		For the normal AMD algorithm, the root bundle is loaded first, which instructs the141			//		plugin what additional localized bundles are required for a particular locale. These142			//		additional locales are loaded and a mix of the root and each progressively-specific143			//		locale is returned. For example:144			//145			//		1. The client demands "dojo/i18n!some/path/nls/someBundle146			//147			//		2. The loader demands load(some/path/nls/someBundle)148			//149			//		3. This plugin require's "some/path/nls/someBundle", which is the root bundle.150			//151			//		4. Assuming config.locale is "ab-cd-ef" and the root bundle indicates that localizations152			//		are available for "ab" and "ab-cd-ef" (note the missing "ab-cd", then the plugin153			//		requires "some/path/nls/ab/someBundle" and "some/path/nls/ab-cd-ef/someBundle"154			//155			//		5. Upon receiving all required bundles, the plugin constructs the value of the bundle156			//		ab-cd-ef as...157			//158			//				mixin(mixin(mixin({}, require("some/path/nls/someBundle"),159			//		  			require("some/path/nls/ab/someBundle")),160			//					require("some/path/nls/ab-cd-ef/someBundle"));161			//162			//		This value is inserted into the cache and published to the loader at the163			//		key/module-id some/path/nls/someBundle/ab-cd-ef.164			//165			//		The special preload signature (case 3) instructs the plugin to stop servicing all normal requests166			//		(further preload requests will be serviced) until all ongoing preloading has completed.167			//168			//		The preload signature instructs the plugin that a special rollup module is available that contains169			//		one or more flattened, localized bundles. The JSON array of available locales indicates which locales170			//		are available. Here is an example:171			//172			//			*preload*some/path/nls/someModule*["root", "ab", "ab-cd-ef"]173			//174			//		This indicates the following rollup modules are available:175			//176			//			some/path/nls/someModule_ROOT177			//			some/path/nls/someModule_ab178			//			some/path/nls/someModule_ab-cd-ef179			//180			//		Each of these modules is a normal AMD module that contains one or more flattened bundles in a hash.181			//		For example, assume someModule contained the bundles some/bundle/path/someBundle and182			//		some/bundle/path/someOtherBundle, then some/path/nls/someModule_ab would be expressed as follows:183			//184			//			define({185			//				some/bundle/path/someBundle:<value of someBundle, flattened with respect to locale ab>,186			//				some/bundle/path/someOtherBundle:<value of someOtherBundle, flattened with respect to locale ab>,187			//			});188			//189			//		E.g., given this design, preloading for locale=="ab" can execute the following algorithm:190			//191			//			require(["some/path/nls/someModule_ab"], function(rollup){192			//				for(var p in rollup){193			//					var id = p + "/ab",194			//					cache[id] = rollup[p];195			//					define(id, rollup[p]);196			//				}197			//			});198			//199			//		Similarly, if "ab-cd" is requested, the algorithm can determine that "ab" is the best available and200			//		load accordingly.201			//202			//		The builder will write such rollups for every layer if a non-empty localeList  profile property is203			//		provided. Further, the builder will include the following cache entry in the cache associated with204			//		any layer.205			//206			//			"*now":function(r){r(['dojo/i18n!*preload*<path>/nls/<module>*<JSON array of available locales>']);}207			//208			//		The *now special cache module instructs the loader to apply the provided function to context-require209			//		with respect to the particular layer being defined. This causes the plugin to hold all normal service210			//		requests until all preloading is complete.211			//212			//		Notice that this algorithm is rarely better than the standard AMD load algorithm. Consider the normal case213			//		where the target locale has a single segment and a layer depends on a single bundle:214			//215			//		Without Preloads:216			//217			//		1. Layer loads root bundle.218			//		2. bundle is demanded; plugin loads single localized bundle.219			//220			//		With Preloads:221			//222			//		1. Layer causes preloading of target bundle.223			//		2. bundle is demanded; service is delayed until preloading complete; bundle is returned.224			//225			//		In each case a single transaction is required to load the target bundle. In cases where multiple bundles226			//		are required and/or the locale has multiple segments, preloads still requires a single transaction whereas227			//		the normal path requires an additional transaction for each additional bundle/locale-segment. However all228			//		of these additional transactions can be done concurrently. Owing to this analysis, the entire preloading229			//		algorithm can be discard during a build by setting the has feature dojo-preload-i18n-Api to false.230			var match = nlsRe.exec(id),231				bundlePath = match[1] + "/",232				bundleName = match[5] || match[4],233				bundlePathAndName = bundlePath + bundleName,234				localeSpecified = (match[5] && match[4]),235				targetLocale =	localeSpecified || dojo.locale || "",236				loadTarget = bundlePathAndName + "/" + targetLocale,237				loadList = localeSpecified ? [targetLocale] : getLocalesToLoad(targetLocale),238				remaining = loadList.length,239				finish = function(){240					if(!--remaining){241						load(lang.delegate(cache[loadTarget]));242					}243				},244				split = id.split("*"),245				preloadDemand = split[1] == "preload";246			if(has("dojo-preload-i18n-Api")){247				if(preloadDemand){248					if(!cache[id]){249						// use cache[id] to prevent multiple preloads of the same preload; this shouldn't happen, but250						// who knows what over-aggressive human optimizers may attempt251						cache[id] = 1;252						preloadL10n(split[2], json.parse(split[3]), 1, require);253					}254					// don't stall the loader!255					load(1);256				}257				if(preloadDemand || (waitForPreloads(id, require, load) && !cache[loadTarget])){258					return;259				}260			}261			else if (preloadDemand) {262				// If a build is created with nls resources and 'dojo-preload-i18n-Api' has not been set to false,263				// the built file will include a preload in the cache (which looks about like so:)264				// '*now':function(r){r(['dojo/i18n!*preload*dojo/nls/dojo*["ar","ca","cs","da","de","el","en-gb","en-us","es-es","fi-fi","fr-fr","he-il","hu","it-it","ja-jp","ko-kr","nl-nl","nb","pl","pt-br","pt-pt","ru","sk","sl","sv","th","tr","zh-tw","zh-cn","ROOT"]']);}265				// If the consumer of the build sets 'dojo-preload-i18n-Api' to false in the Dojo config, the cached266				// preload will not be parsed and will result in an attempt to call 'require' passing it the unparsed267				// preload, which is not a valid module id.268				// In this case we should skip this request.269				load(1);270				return;271			}272			array.forEach(loadList, function(locale){273				var target = bundlePathAndName + "/" + locale;274				if(has("dojo-preload-i18n-Api")){275					checkForLegacyModules(target);276				}277				if(!cache[target]){278					doLoad(require, bundlePathAndName, bundlePath, bundleName, locale, finish);279				}else{280					finish();281				}282			});283		};284	if(has("dojo-preload-i18n-Api") ||  1 ){285		var normalizeLocale = thisModule.normalizeLocale = function(locale){286				var result = locale ? locale.toLowerCase() : dojo.locale;287				return result == "root" ? "ROOT" : result;288			},289			isXd = function(mid, contextRequire){290				return ( 1  &&  1 ) ?291					contextRequire.isXdUrl(require.toUrl(mid + ".js")) :292					true;293			},294			preloading = 0,295			preloadWaitQueue = [],296			preloadL10n = thisModule._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated, /*boolean?*/ guaranteedAmdFormat, /*function?*/ contextRequire){297				// summary:298				//		Load available flattened resource bundles associated with a particular module for dojo/locale and all dojo/config.extraLocale (if any)299				// description:300				//		Only called by built layer files. The entire locale hierarchy is loaded. For example,301				//		if locale=="ab-cd", then ROOT, "ab", and "ab-cd" are loaded. This is different than v1.6-302				//		in that the v1.6- would only load ab-cd...which was *always* flattened.303				//304				//		If guaranteedAmdFormat is true, then the module can be loaded with require thereby circumventing the detection algorithm305				//		and the extra possible extra transaction.306				// If this function is called from legacy code, then guaranteedAmdFormat and contextRequire will be undefined. Since the function307				// needs a require in order to resolve module ids, fall back to the context-require associated with this dojo/i18n module, which308				// itself may have been mapped.309				contextRequire = contextRequire || require;310				function doRequire(mid, callback){311					if(isXd(mid, contextRequire) || guaranteedAmdFormat){312						contextRequire([mid], callback);313					}else{314						syncRequire([mid], callback, contextRequire);315					}316				}317				function forEachLocale(locale, func){318					// given locale= "ab-cd-ef", calls func on "ab-cd-ef", "ab-cd", "ab", "ROOT"; stops calling the first time func returns truthy319					var parts = locale.split("-");320					while(parts.length){321						if(func(parts.join("-"))){322							return;323						}324						parts.pop();325					}326					func("ROOT");327				}328					function preloadingAddLock(){329						preloading++;330					}331					function preloadingRelLock(){332						--preloading;333						while(!preloading && preloadWaitQueue.length){334							load.apply(null, preloadWaitQueue.shift());335						}336					}337					function cacheId(path, name, loc, require){338						// path is assumed to have a trailing "/"339						return require.toAbsMid(path + name + "/" + loc)340					}341					function preload(locale){342						locale = normalizeLocale(locale);343						forEachLocale(locale, function(loc){344							if(array.indexOf(localesGenerated, loc) >= 0){345								var mid = bundlePrefix.replace(/\./g, "/") + "_" + loc;346								preloadingAddLock();347								doRequire(mid, function(rollup){348									for(var p in rollup){349										var bundle = rollup[p],350											match = p.match(/(.+)\/([^\/]+)$/),351											bundleName, bundlePath;352											353											// If there is no match, the bundle is not a regular bundle from an AMD layer.354											if (!match){continue;}355											bundleName = match[2];356											bundlePath = match[1] + "/";357										// backcompat358										if(!bundle._localized){continue;}359										var localized;360										if(loc === "ROOT"){361											var root = localized = bundle._localized;362											delete bundle._localized;363											root.root = bundle;364											cache[require.toAbsMid(p)] = root;365										}else{366											localized = bundle._localized;367											cache[cacheId(bundlePath, bundleName, loc, require)] = bundle;368										}369										if(loc !== locale){370											// capture some locale variables371											function improveBundle(bundlePath, bundleName, bundle, localized){372												// locale was not flattened and we've fallen back to a less-specific locale that was flattened373												// for example, we had a flattened 'fr', a 'fr-ca' is available for at least this bundle, and374												// locale==='fr-ca'; therefore, we must improve the bundle as retrieved from the rollup by375												// manually loading the fr-ca version of the bundle and mixing this into the already-retrieved 'fr'376												// version of the bundle.377												//378												// Remember, different bundles may have different sets of locales available.379												//380												// we are really falling back on the regular algorithm here, but--hopefully--starting with most381												// of the required bundles already on board as given by the rollup and we need to "manually" load382												// only one locale from a few bundles...or even better...we won't find anything better to load.383												// This algorithm ensures there is nothing better to load even when we can only load a less-specific rollup.384												//385												// note: this feature is only available in async mode386												// inspect the loaded bundle that came from the rollup to see if something better is available387												// for any bundle in a rollup, more-specific available locales are given at localized.388												var requiredBundles = [],389													cacheIds = [];390												forEachLocale(locale, function(loc){391													if(localized[loc]){392														requiredBundles.push(require.toAbsMid(bundlePath + loc + "/" + bundleName));393														cacheIds.push(cacheId(bundlePath, bundleName, loc, require));394													}395												});396												if(requiredBundles.length){397													preloadingAddLock();398													contextRequire(requiredBundles, function(){399														// requiredBundles was constructed by forEachLocale so it contains locales from 400														// less specific to most specific. 401														// the loop starts with the most specific locale, the last one.402														for(var i = requiredBundles.length - 1; i >= 0 ; i--){403															bundle = lang.mixin(lang.clone(bundle), arguments[i]);404															cache[cacheIds[i]] = bundle;405														}406														// this is the best possible (maybe a perfect match, maybe not), accept it407														cache[cacheId(bundlePath, bundleName, locale, require)] = lang.clone(bundle);408														preloadingRelLock();409													});410												}else{411													// this is the best possible (definitely not a perfect match), accept it412													cache[cacheId(bundlePath, bundleName, locale, require)] = bundle;413												}414											}415											improveBundle(bundlePath, bundleName, bundle, localized);416										}417									}418									preloadingRelLock();419								});420								return true;421							}422							return false;423						});424					}425				preload();426				array.forEach(dojo.config.extraLocale, preload);427			},428			waitForPreloads = function(id, require, load){429				if(preloading){430					preloadWaitQueue.push([id, require, load]);431				}432				return preloading;433			},434			checkForLegacyModules = function()435				{};436	}437	if( 1 ){438		// this code path assumes the dojo loader and won't work with a standard AMD loader439		var amdValue = {},440			evalBundle,441			syncRequire = function(deps, callback, require){442				var results = [];443				array.forEach(deps, function(mid){444					var url = require.toUrl(mid + ".js");445					function load(text){446						if (!evalBundle) {447							// use the function ctor to keep the minifiers away (also come close to global scope, but this is secondary)448							evalBundle = new Function(449								"__bundle",				   // the bundle to evalutate450								"__checkForLegacyModules", // a function that checks if __bundle defined __mid in the global space451								"__mid",				   // the mid that __bundle is intended to define452								"__amdValue",453								// returns one of:454								//		1 => the bundle was an AMD bundle455								//		a legacy bundle object that is the value of __mid456								//		instance of Error => could not figure out how to evaluate bundle457								// used to detect when __bundle calls define458								"var define = function(mid, factory){define.called = 1; __amdValue.result = factory || mid;},"459								+ "	   require = function(){define.called = 1;};"460								+ "try{"461								+		"define.called = 0;"462								+		"eval(__bundle);"463								+		"if(define.called==1)"464											// bundle called define; therefore signal it's an AMD bundle465								+			"return __amdValue;"466								+		"if((__checkForLegacyModules = __checkForLegacyModules(__mid)))"467											// bundle was probably a v1.6- built NLS flattened NLS bundle that defined __mid in the global space468								+			"return __checkForLegacyModules;"469								+ "}catch(e){}"470								// evaulating the bundle was *neither* an AMD *nor* a legacy flattened bundle471								// either way, re-eval *after* surrounding with parentheses472								+ "try{"473								+		"return eval('('+__bundle+')');"474								+ "}catch(e){"475								+		"return e;"476								+ "}"477							);478						}479						var result = evalBundle(text, checkForLegacyModules, mid, amdValue);480						if(result===amdValue){481							// the bundle was an AMD module; re-inject it through the normal AMD path482							// we gotta do this since it could be an anonymous module and simply evaluating483							// the text here won't provide the loader with the context to know what484							// module is being defined()'d. With browser caching, this should be free; further485							// this entire code path can be circumvented by using the AMD format to begin with486							results.push(cache[url] = amdValue.result);487						}else{488							if(result instanceof Error){489								console.error("failed to evaluate i18n bundle; url=" + url, result);490								result = {};491							}492							// nls/<locale>/<bundle-name> indicates not the root.493							results.push(cache[url] = (/nls\/[^\/]+\/[^\/]+$/.test(url) ? result : {root:result, _v1x:1}));494						}495					}496					if(cache[url]){497						results.push(cache[url]);498					}else{499						var bundle = require.syncLoadNls(mid);500						// need to check for legacy module here because there might be a legacy module for a501						// less specific locale (which was not looked up during the first checkForLegacyModules502						// call in load()).503						// Also need to reverse the locale and the module name in the mid because syncRequire504						// deps parameters uses the AMD style package/nls/locale/module while legacy code uses505						// package/nls/module/locale.506						if(!bundle){507							bundle = checkForLegacyModules(mid.replace(/nls\/([^\/]*)\/([^\/]*)$/, "nls/$2/$1"));508						}509						if(bundle){510							results.push(bundle);511						}else{512							if(!xhr){513								try{514									require.getText(url, true, load);515								}catch(e){516									results.push(cache[url] = {});517								}518							}else{519								xhr.get({520									url:url,521									sync:true,522									load:load,523									error:function(){524										results.push(cache[url] = {});525									}526								});527							}528						}529					}530				});531				callback && callback.apply(null, results);532			};533		checkForLegacyModules = function(target){534			// legacy code may have already loaded [e.g] the raw bundle x/y/z at x.y.z; when true, push into the cache535			for(var result, names = target.split("/"), object = dojo.global[names[0]], i = 1; object && i<names.length-1; object = object[names[i++]]){}536			if(object){537				result = object[names[i]];538				if(!result){539					// fallback for incorrect bundle build of 1.6540					result = object[names[i].replace(/-/g,"_")];541				}542				if(result){543					cache[target] = result;544				}545			}546			return result;547		};548		thisModule.getLocalization = function(moduleName, bundleName, locale){549			var result,550				l10nName = getBundleName(moduleName, bundleName, locale);551			load(552				l10nName,553				// isXd() and syncRequire() need a context-require in order to resolve the mid with respect to a reference module.554				// Since this legacy function does not have the concept of a reference module, resolve with respect to this555				// dojo/i18n module, which, itself may have been mapped.556				(!isXd(l10nName, require) ? function(deps, callback){ syncRequire(deps, callback, require); } : require),557				function(result_){ result = result_; }558			);559			return result;560		};561	}562	return lang.mixin(thisModule, {563		dynamic:true,564		normalize:normalize,565		load:load,566		cache:cache,567		getL10nName: getL10nName568	});...build.js
Source:build.js  
1'use strict';2const {rollup} = require('rollup');3const babel = require('rollup-plugin-babel');4const closure = require('./plugins/closure-plugin');5const commonjs = require('rollup-plugin-commonjs');6const prettier = require('rollup-plugin-prettier');7const replace = require('rollup-plugin-replace');8const stripBanner = require('rollup-plugin-strip-banner');9const chalk = require('chalk');10const path = require('path');11const resolve = require('rollup-plugin-node-resolve');12const fs = require('fs');13const argv = require('minimist')(process.argv.slice(2));14const Modules = require('./modules');15const Bundles = require('./bundles');16const Stats = require('./stats');17const Sync = require('./sync');18const sizes = require('./plugins/sizes-plugin');19const useForks = require('./plugins/use-forks-plugin');20const stripUnusedImports = require('./plugins/strip-unused-imports');21const extractErrorCodes = require('../error-codes/extract-errors');22const Packaging = require('./packaging');23const {asyncCopyTo, asyncRimRaf} = require('./utils');24const codeFrame = require('babel-code-frame');25const Wrappers = require('./wrappers');26// Errors in promises should be fatal.27let loggedErrors = new Set();28process.on('unhandledRejection', err => {29  if (loggedErrors.has(err)) {30    // No need to print it twice.31    process.exit(1);32  }33  throw err;34});35const {36  UMD_DEV,37  UMD_PROD,38  UMD_PROFILING,39  NODE_DEV,40  NODE_PROD,41  NODE_PROFILING,42  FB_WWW_DEV,43  FB_WWW_PROD,44  FB_WWW_PROFILING,45  RN_OSS_DEV,46  RN_OSS_PROD,47  RN_OSS_PROFILING,48  RN_FB_DEV,49  RN_FB_PROD,50  RN_FB_PROFILING,51} = Bundles.bundleTypes;52function parseRequestedNames(names, toCase) {53  let result = [];54  for (let i = 0; i < names.length; i++) {55    let splitNames = names[i].split(',');56    for (let j = 0; j < splitNames.length; j++) {57      let name = splitNames[j].trim();58      if (!name) {59        continue;60      }61      if (toCase === 'uppercase') {62        name = name.toUpperCase();63      } else if (toCase === 'lowercase') {64        name = name.toLowerCase();65      }66      result.push(name);67    }68  }69  return result;70}71const requestedBundleTypes = argv.type72  ? parseRequestedNames([argv.type], 'uppercase')73  : [];74const requestedBundleNames = parseRequestedNames(argv._, 'lowercase');75const forcePrettyOutput = argv.pretty;76const syncFBSourcePath = argv['sync-fbsource'];77const syncWWWPath = argv['sync-www'];78const shouldExtractErrors = argv['extract-errors'];79const errorCodeOpts = {80  errorMapFilePath: 'scripts/error-codes/codes.json',81};82const closureOptions = {83  compilation_level: 'SIMPLE',84  language_in: 'ECMASCRIPT5_STRICT',85  language_out: 'ECMASCRIPT5_STRICT',86  env: 'CUSTOM',87  warning_level: 'QUIET',88  apply_input_source_maps: false,89  use_types_for_optimization: false,90  process_common_js_modules: false,91  rewrite_polyfills: false,92};93function getBabelConfig(updateBabelOptions, bundleType, filename) {94  let options = {95    exclude: '/**/node_modules/**',96    presets: [],97    plugins: [],98  };99  if (updateBabelOptions) {100    options = updateBabelOptions(options);101  }102  switch (bundleType) {103    case FB_WWW_DEV:104    case FB_WWW_PROD:105    case FB_WWW_PROFILING:106      return Object.assign({}, options, {107        plugins: options.plugins.concat([108          // Minify invariant messages109          require('../error-codes/minify-error-messages'),110          // Wrap warning() calls in a __DEV__ check so they are stripped from production.111          require('../babel/wrap-warning-with-env-check'),112        ]),113      });114    case RN_OSS_DEV:115    case RN_OSS_PROD:116    case RN_OSS_PROFILING:117    case RN_FB_DEV:118    case RN_FB_PROD:119    case RN_FB_PROFILING:120      return Object.assign({}, options, {121        plugins: options.plugins.concat([122          // Wrap warning() calls in a __DEV__ check so they are stripped from production.123          require('../babel/wrap-warning-with-env-check'),124        ]),125      });126    case UMD_DEV:127    case UMD_PROD:128    case UMD_PROFILING:129    case NODE_DEV:130    case NODE_PROD:131    case NODE_PROFILING:132      return Object.assign({}, options, {133        plugins: options.plugins.concat([134          // Use object-assign polyfill in open source135          path.resolve('./scripts/babel/transform-object-assign-require'),136          // Minify invariant messages137          require('../error-codes/minify-error-messages'),138          // Wrap warning() calls in a __DEV__ check so they are stripped from production.139          require('../babel/wrap-warning-with-env-check'),140        ]),141      });142    default:143      return options;144  }145}146function getRollupOutputOptions(147  outputPath,148  format,149  globals,150  globalName,151  bundleType152) {153  const isProduction = isProductionBundleType(bundleType);154  return Object.assign(155    {},156    {157      file: outputPath,158      format,159      globals,160      freeze: !isProduction,161      interop: false,162      name: globalName,163      sourcemap: false,164    }165  );166}167function getFormat(bundleType) {168  switch (bundleType) {169    case UMD_DEV:170    case UMD_PROD:171    case UMD_PROFILING:172      return `umd`;173    case NODE_DEV:174    case NODE_PROD:175    case NODE_PROFILING:176    case FB_WWW_DEV:177    case FB_WWW_PROD:178    case FB_WWW_PROFILING:179    case RN_OSS_DEV:180    case RN_OSS_PROD:181    case RN_OSS_PROFILING:182    case RN_FB_DEV:183    case RN_FB_PROD:184    case RN_FB_PROFILING:185      return `cjs`;186  }187}188function getFilename(name, globalName, bundleType) {189  // we do this to replace / to -, for react-dom/server190  name = name.replace('/', '-');191  switch (bundleType) {192    case UMD_DEV:193      return `${name}.development.js`;194    case UMD_PROD:195      return `${name}.production.min.js`;196    case UMD_PROFILING:197      return `${name}.profiling.min.js`;198    case NODE_DEV:199      return `${name}.development.js`;200    case NODE_PROD:201      return `${name}.production.min.js`;202    case NODE_PROFILING:203      return `${name}.profiling.min.js`;204    case FB_WWW_DEV:205    case RN_OSS_DEV:206    case RN_FB_DEV:207      return `${globalName}-dev.js`;208    case FB_WWW_PROD:209    case RN_OSS_PROD:210    case RN_FB_PROD:211      return `${globalName}-prod.js`;212    case FB_WWW_PROFILING:213    case RN_FB_PROFILING:214    case RN_OSS_PROFILING:215      return `${globalName}-profiling.js`;216  }217}218function isProductionBundleType(bundleType) {219  switch (bundleType) {220    case UMD_DEV:221    case NODE_DEV:222    case FB_WWW_DEV:223    case RN_OSS_DEV:224    case RN_FB_DEV:225      return false;226    case UMD_PROD:227    case NODE_PROD:228    case UMD_PROFILING:229    case NODE_PROFILING:230    case FB_WWW_PROD:231    case FB_WWW_PROFILING:232    case RN_OSS_PROD:233    case RN_OSS_PROFILING:234    case RN_FB_PROD:235    case RN_FB_PROFILING:236      return true;237    default:238      throw new Error(`Unknown type: ${bundleType}`);239  }240}241function isProfilingBundleType(bundleType) {242  switch (bundleType) {243    case FB_WWW_DEV:244    case FB_WWW_PROD:245    case NODE_DEV:246    case NODE_PROD:247    case RN_FB_DEV:248    case RN_FB_PROD:249    case RN_OSS_DEV:250    case RN_OSS_PROD:251    case UMD_DEV:252    case UMD_PROD:253      return false;254    case FB_WWW_PROFILING:255    case NODE_PROFILING:256    case RN_FB_PROFILING:257    case RN_OSS_PROFILING:258    case UMD_PROFILING:259      return true;260    default:261      throw new Error(`Unknown type: ${bundleType}`);262  }263}264function forbidFBJSImports() {265  return {266    name: 'forbidFBJSImports',267    resolveId(importee, importer) {268      if (/^fbjs\//.test(importee)) {269        throw new Error(270          `Don't import ${importee} (found in ${importer}). ` +271            `Use the utilities in packages/shared/ instead.`272        );273      }274    },275  };276}277function getPlugins(278  entry,279  externals,280  updateBabelOptions,281  filename,282  packageName,283  bundleType,284  globalName,285  moduleType,286  pureExternalModules287) {288  const findAndRecordErrorCodes = extractErrorCodes(errorCodeOpts);289  const forks = Modules.getForks(bundleType, entry, moduleType);290  const isProduction = isProductionBundleType(bundleType);291  const isProfiling = isProfilingBundleType(bundleType);292  const isUMDBundle =293    bundleType === UMD_DEV ||294    bundleType === UMD_PROD ||295    bundleType === UMD_PROFILING;296  const isFBBundle =297    bundleType === FB_WWW_DEV ||298    bundleType === FB_WWW_PROD ||299    bundleType === FB_WWW_PROFILING;300  const isRNBundle =301    bundleType === RN_OSS_DEV ||302    bundleType === RN_OSS_PROD ||303    bundleType === RN_OSS_PROFILING ||304    bundleType === RN_FB_DEV ||305    bundleType === RN_FB_PROD ||306    bundleType === RN_FB_PROFILING;307  const shouldStayReadable = isFBBundle || isRNBundle || forcePrettyOutput;308  return [309    // Extract error codes from invariant() messages into a file.310    shouldExtractErrors && {311      transform(source) {312        findAndRecordErrorCodes(source);313        return source;314      },315    },316    // Shim any modules that need forking in this environment.317    useForks(forks),318    // Ensure we don't try to bundle any fbjs modules.319    forbidFBJSImports(),320    // Use Node resolution mechanism.321    resolve({322      skip: externals,323    }),324    // Remove license headers from individual modules325    stripBanner({326      exclude: 'node_modules/**/*',327    }),328    // Compile to ES5.329    babel(getBabelConfig(updateBabelOptions, bundleType)),330    // Remove 'use strict' from individual source files.331    {332      transform(source) {333        return source.replace(/['"]use strict['"']/g, '');334      },335    },336    // Turn __DEV__ and process.env checks into constants.337    replace({338      __DEV__: isProduction ? 'false' : 'true',339      __PROFILE__: isProfiling || !isProduction ? 'true' : 'false',340      __UMD__: isUMDBundle ? 'true' : 'false',341      'process.env.NODE_ENV': isProduction ? "'production'" : "'development'",342    }),343    // We still need CommonJS for external deps like object-assign.344    commonjs(),345    // Apply dead code elimination and/or minification.346    isProduction &&347      closure(348        Object.assign({}, closureOptions, {349          // Don't let it create global variables in the browser.350          // https://github.com/facebook/react/issues/10909351          assume_function_wrapper: !isUMDBundle,352          // Works because `google-closure-compiler-js` is forked in Yarn lockfile.353          // We can remove this if GCC merges my PR:354          // https://github.com/google/closure-compiler/pull/2707355          // and then the compiled version is released via `google-closure-compiler-js`.356          renaming: !shouldStayReadable,357        })358      ),359    // HACK to work around the fact that Rollup isn't removing unused, pure-module imports.360    // Note that this plugin must be called after closure applies DCE.361    isProduction && stripUnusedImports(pureExternalModules),362    // Add the whitespace back if necessary.363    shouldStayReadable && prettier({parser: 'babylon'}),364    // License and haste headers, top-level `if` blocks.365    {366      transformBundle(source) {367        return Wrappers.wrapBundle(368          source,369          bundleType,370          globalName,371          filename,372          moduleType373        );374      },375    },376    // Record bundle size.377    sizes({378      getSize: (size, gzip) => {379        const currentSizes = Stats.currentBuildResults.bundleSizes;380        const recordIndex = currentSizes.findIndex(381          record =>382            record.filename === filename && record.bundleType === bundleType383        );384        const index = recordIndex !== -1 ? recordIndex : currentSizes.length;385        currentSizes[index] = {386          filename,387          bundleType,388          packageName,389          size,390          gzip,391        };392      },393    }),394  ].filter(Boolean);395}396function shouldSkipBundle(bundle, bundleType) {397  const shouldSkipBundleType = bundle.bundleTypes.indexOf(bundleType) === -1;398  if (shouldSkipBundleType) {399    return true;400  }401  if (requestedBundleTypes.length > 0) {402    const isAskingForDifferentType = requestedBundleTypes.every(403      requestedType => bundleType.indexOf(requestedType) === -1404    );405    if (isAskingForDifferentType) {406      return true;407    }408  }409  if (requestedBundleNames.length > 0) {410    const isAskingForDifferentNames = requestedBundleNames.every(411      // If the name ends with `something/index` we only match if the412      // entry ends in something. Such as `react-dom/index` only matches413      // `react-dom` but not `react-dom/server`. Everything else is fuzzy414      // search.415      requestedName =>416        (bundle.entry + '/index.js').indexOf(requestedName) === -1417    );418    if (isAskingForDifferentNames) {419      return true;420    }421  }422  return false;423}424async function createBundle(bundle, bundleType) {425  if (shouldSkipBundle(bundle, bundleType)) {426    return;427  }428  const filename = getFilename(bundle.entry, bundle.global, bundleType);429  const logKey =430    chalk.white.bold(filename) + chalk.dim(` (${bundleType.toLowerCase()})`);431  const format = getFormat(bundleType);432  const packageName = Packaging.getPackageName(bundle.entry);433  let resolvedEntry = require.resolve(bundle.entry);434  if (435    bundleType === FB_WWW_DEV ||436    bundleType === FB_WWW_PROD ||437    bundleType === FB_WWW_PROFILING438  ) {439    const resolvedFBEntry = resolvedEntry.replace('.js', '.fb.js');440    if (fs.existsSync(resolvedFBEntry)) {441      resolvedEntry = resolvedFBEntry;442    }443  }444  const shouldBundleDependencies =445    bundleType === UMD_DEV ||446    bundleType === UMD_PROD ||447    bundleType === UMD_PROFILING;448  const peerGlobals = Modules.getPeerGlobals(bundle.externals, bundleType);449  let externals = Object.keys(peerGlobals);450  if (!shouldBundleDependencies) {451    const deps = Modules.getDependencies(bundleType, bundle.entry);452    externals = externals.concat(deps);453  }454  const importSideEffects = Modules.getImportSideEffects();455  const pureExternalModules = Object.keys(importSideEffects).filter(456    module => !importSideEffects[module]457  );458  const rollupConfig = {459    input: resolvedEntry,460    treeshake: {461      pureExternalModules,462    },463    external(id) {464      const containsThisModule = pkg => id === pkg || id.startsWith(pkg + '/');465      const isProvidedByDependency = externals.some(containsThisModule);466      if (!shouldBundleDependencies && isProvidedByDependency) {467        return true;468      }469      return !!peerGlobals[id];470    },471    onwarn: handleRollupWarning,472    plugins: getPlugins(473      bundle.entry,474      externals,475      bundle.babel,476      filename,477      packageName,478      bundleType,479      bundle.global,480      bundle.moduleType,481      pureExternalModules482    ),483    // We can't use getters in www.484    legacy:485      bundleType === FB_WWW_DEV ||486      bundleType === FB_WWW_PROD ||487      bundleType === FB_WWW_PROFILING,488  };489  const [mainOutputPath, ...otherOutputPaths] = Packaging.getBundleOutputPaths(490    bundleType,491    filename,492    packageName493  );494  const rollupOutputOptions = getRollupOutputOptions(495    mainOutputPath,496    format,497    peerGlobals,498    bundle.global,499    bundleType500  );501  console.log(`${chalk.bgYellow.black(' BUILDING ')} ${logKey}`);502  try {503    const result = await rollup(rollupConfig);504    await result.write(rollupOutputOptions);505  } catch (error) {506    console.log(`${chalk.bgRed.black(' OH NOES! ')} ${logKey}\n`);507    handleRollupError(error);508    throw error;509  }510  for (let i = 0; i < otherOutputPaths.length; i++) {511    await asyncCopyTo(mainOutputPath, otherOutputPaths[i]);512  }513  console.log(`${chalk.bgGreen.black(' COMPLETE ')} ${logKey}\n`);514}515function handleRollupWarning(warning) {516  if (warning.code === 'UNUSED_EXTERNAL_IMPORT') {517    const match = warning.message.match(/external module '([^']+)'/);518    if (!match || typeof match[1] !== 'string') {519      throw new Error(520        'Could not parse a Rollup warning. ' + 'Fix this method.'521      );522    }523    const importSideEffects = Modules.getImportSideEffects();524    const externalModule = match[1];525    if (typeof importSideEffects[externalModule] !== 'boolean') {526      throw new Error(527        'An external module "' +528          externalModule +529          '" is used in a DEV-only code path ' +530          'but we do not know if it is safe to omit an unused require() to it in production. ' +531          'Please add it to the `importSideEffects` list in `scripts/rollup/modules.js`.'532      );533    }534    // Don't warn. We will remove side effectless require() in a later pass.535    return;536  }537  if (typeof warning.code === 'string') {538    // This is a warning coming from Rollup itself.539    // These tend to be important (e.g. clashes in namespaced exports)540    // so we'll fail the build on any of them.541    console.error();542    console.error(warning.message || warning);543    console.error();544    process.exit(1);545  } else {546    // The warning is from one of the plugins.547    // Maybe it's not important, so just print it.548    console.warn(warning.message || warning);549  }550}551function handleRollupError(error) {552  loggedErrors.add(error);553  if (!error.code) {554    console.error(error);555    return;556  }557  console.error(558    `\x1b[31m-- ${error.code}${error.plugin ? ` (${error.plugin})` : ''} --`559  );560  console.error(error.stack);561  if (error.loc && error.loc.file) {562    const {file, line, column} = error.loc;563    // This looks like an error from Rollup, e.g. missing export.564    // We'll use the accurate line numbers provided by Rollup but565    // use Babel code frame because it looks nicer.566    const rawLines = fs.readFileSync(file, 'utf-8');567    // column + 1 is required due to rollup counting column start position from 0568    // whereas babel-code-frame counts from 1569    const frame = codeFrame(rawLines, line, column + 1, {570      highlightCode: true,571    });572    console.error(frame);573  } else if (error.codeFrame) {574    // This looks like an error from a plugin (e.g. Babel).575    // In this case we'll resort to displaying the provided code frame576    // because we can't be sure the reported location is accurate.577    console.error(error.codeFrame);578  }579}580async function buildEverything() {581  await asyncRimRaf('build');582  // Run them serially for better console output583  // and to avoid any potential race conditions.584  // eslint-disable-next-line no-for-of-loops/no-for-of-loops585  for (const bundle of Bundles.bundles) {586    await createBundle(bundle, UMD_DEV);587    await createBundle(bundle, UMD_PROD);588    await createBundle(bundle, UMD_PROFILING);589    await createBundle(bundle, NODE_DEV);590    await createBundle(bundle, NODE_PROD);591    await createBundle(bundle, NODE_PROFILING);592    await createBundle(bundle, FB_WWW_DEV);593    await createBundle(bundle, FB_WWW_PROD);594    await createBundle(bundle, FB_WWW_PROFILING);595    await createBundle(bundle, RN_OSS_DEV);596    await createBundle(bundle, RN_OSS_PROD);597    await createBundle(bundle, RN_OSS_PROFILING);598    await createBundle(bundle, RN_FB_DEV);599    await createBundle(bundle, RN_FB_PROD);600    await createBundle(bundle, RN_FB_PROFILING);601  }602  await Packaging.copyAllShims();603  await Packaging.prepareNpmPackages();604  if (syncFBSourcePath) {605    await Sync.syncReactNative(syncFBSourcePath);606  } else if (syncWWWPath) {607    await Sync.syncReactDom('build/facebook-www', syncWWWPath);608  }609  console.log(Stats.printResults());610  if (!forcePrettyOutput) {611    Stats.saveResults();612  }613  if (shouldExtractErrors) {614    console.warn(615      '\nWarning: this build was created with --extract-errors enabled.\n' +616        'this will result in extremely slow builds and should only be\n' +617        'used when the error map needs to be rebuilt.\n'618    );619  }620}...alias.js
Source:alias.js  
1/**2 * There are basically two kinds of alias in CLDR:3 * 1. locale alias e.g.4 *    in xml, <alias source="locale" path="......"/>,5 *    in gernated JSON bunle, xxxx@localeAlias:{'target':'xxx', 'bundle':'xxxx'}6 * 2. other locale alias e.g.7 *    in xml, currently only like <alias source="fr" path="//ldml"/>8 * #1 is supported by this 'alias.js',9 * #2 is covered by 'specialLocale.js' and may need enhancement for future CLDR versions.10 */11djConfig={baseUrl: "../../../dojo/", paths: {"dojo/_base/xhr": "../util/buildscripts/cldr/xhr"}};12load("../../../dojo/dojo.js");13load("../jslib/logger.js");14load("../jslib/fileUtil.js");15load("cldrUtil.js");16dojo.require("dojo.i18n");17var dir/*String*/ = arguments[0];// ${dojo}/dojo/cldr/nls18var logDir = arguments[1];19var logStr = "";20//Add new bundles to the list so that they will be aliased according to the ldml spec.21var BUNDLES = ['gregorian','hebrew','islamic','islamic-civil','buddhist','persian'];22var LOCALE_ALIAS_MARK = '@localeAlias';23var LOCALE_ALIAS_SOURCE_PROPERTY = 'source';24var LOCALE_ALIAS_TARGET_PROPERTY = 'target';25var LOCALE_ALIAS_TARGET_BUNDLE = 'bundle';26var localeAliasPaths = [];/**/27var records = {};/*{property : boolean}, record whether a property has been calculated for alias path*/28var updated = false;29print('alias.js...');30for(var i = 0; i < BUNDLES.length; i++){31	var regExp = new RegExp('\/' + BUNDLES[i] + '\.js$'); //e.g. new RegExp('\/gregorian\.js$')32	var fileList = fileUtil.getFilteredFileList(dir, regExp, true);33	34	for(var j = 0; j < fileList.length; j++){35		var jsFileName = new String(fileList[j]); //Java String36		var jsFilePath = jsFileName.split("/");37		var locale = jsFilePath[jsFilePath.length-2];38		if(locale=="nls"){continue;} // no need for root bundle39		try{40//			dojo.i18n._requireLocalization('dojo.cldr', BUNDLES[i], locale); //declare bundle41			var bundle = dojo.i18n.getLocalization('dojo.cldr', BUNDLES[i], locale); //get bundle42			var nativeSrcBundle = getNativeBundle(jsFileName);//bundle not flattened43		}catch(e){/*logStr += "alias: an exception occurred: "+e;/* simply ignore if no bundle found*/}44		45		if(!bundle) continue;46		47		updated = false;48		//logStr += locale + ":" + BUNDLES[i] + "=========================================================================\n";49		50		_calculateAliasPath(bundle, BUNDLES[i]);51		//logStr += "all alias paths=" + dojo.toJson(localeAliasPaths) + "\n";52				53		_processLocaleAlias(localeAliasPaths, bundle, nativeSrcBundle,locale);54		55		if(updated){56			fileUtil.saveUtf8File(jsFileName, "(" + dojo.toJson(nativeSrcBundle, true) + ")");57		}58		//logStr += '\n';59	}60	cleanLocaleAlias(fileList);61}62//fileUtil.saveUtf8File(logDir + '/alias.log',logStr+'\n');63//print('CLDR finished, please refer to logs at ' + logDir + ' for more details.');64function _calculateAliasPath(bundle, name/*String*/){65	for(p in bundle){66		var index = p.indexOf(LOCALE_ALIAS_MARK);67		if(index >= 0 /*p like 'xxx@localeAlias6'*/){68			var localeAliasSource/*String*/ = p.substring(0,index);69			if(records[localeAliasSource]/*calculated*/){70				//logStr += p + " has been calculated, ignored\n"71				continue;72			}73			74			var path = [];75			var aliasIndex = new Number(p.substring(index + LOCALE_ALIAS_MARK.length));76			//logStr += "aliasIndex for " + p + " is " + aliasIndex + "\n";77			var i = aliasIndex;78			while(bundle[localeAliasSource + LOCALE_ALIAS_MARK + (--i)]){}79			80			var src = localeAliasSource;81			while(bundle[localeAliasSource + LOCALE_ALIAS_MARK + (++i)]){82				var mapping = {};83				mapping[LOCALE_ALIAS_SOURCE_PROPERTY] = src;84				mapping[LOCALE_ALIAS_TARGET_PROPERTY] = bundle[localeAliasSource + LOCALE_ALIAS_MARK + i][LOCALE_ALIAS_TARGET_PROPERTY];85				mapping[LOCALE_ALIAS_TARGET_BUNDLE] = bundle[localeAliasSource + LOCALE_ALIAS_MARK + i][LOCALE_ALIAS_TARGET_BUNDLE];86				//whether aliased to the bundle itself87				mapping.inSelf = mapping[LOCALE_ALIAS_TARGET_BUNDLE] === name;88				path.push(mapping);89				records[src] = true;90				src = bundle[localeAliasSource + LOCALE_ALIAS_MARK + i][LOCALE_ALIAS_TARGET_PROPERTY];91			}92			path = path.reverse();93			//logStr += "alias path calucated for " + localeAliasSource + "=" + dojo.toJson(path) + "\n";94			localeAliasPaths.push(path);95		}96	}97}98function _processLocaleAlias(localeAliasPaths/*Array*/, bundle/*JSON Obj*/, nativeSrcBundle/*JSON Obj*/,locale/*String*/){99	// summary:100	//		Update all properties as defined by 'locale' alias mapping101	//		E.g.'months-format-abbr@localeAlias6':{'target':"months-format-wide", 'bundle':"gregorian"},102	//		means the array values of 'months-format-abbr' in current bundle should be103	//		merged with(inherit or overwrite) that of 'months-format-wide' in 'gregorian' bundle104	//105	//		Note:	   Currently no bundle recognition, always assume 'gregorian'.106	var processed = {};107	for(var i = 0; i < localeAliasPaths.length; i++){108		var path = localeAliasPaths[i];109		for(var j = 0; j < path.length; j++){110			var mapping = path[j];111			if(mapping.inSelf && mapping[LOCALE_ALIAS_SOURCE_PROPERTY] != mapping[LOCALE_ALIAS_TARGET_PROPERTY]112			   && bundle[mapping[LOCALE_ALIAS_TARGET_PROPERTY]]/*target existed*/){113				//e.g. {'source':'months-format-abbr','target':"months-format-wide",'bundle':"gregorian"},114				//currently source and target bundles are the same - gregorian115				if(processed[mapping[LOCALE_ALIAS_SOURCE_PROPERTY]]){/*haven't been processed*/116					//logStr += "!" + mapping[LOCALE_ALIAS_SOURCE_PROPERTY] +" has been processed for alias, escaped\n";117					continue;118				}119				_updateLocaleAlias(bundle, mapping[LOCALE_ALIAS_SOURCE_PROPERTY], bundle,120								   mapping[LOCALE_ALIAS_TARGET_PROPERTY], nativeSrcBundle);121				processed[mapping[LOCALE_ALIAS_SOURCE_PROPERTY]] =  true;122			}else if(!mapping.inSelf){123				//For other non-gregorian calendars. e.g. "hebrew" etc.124				//Get the bundle according to the locale.125				var targetBundle = dojo.i18n.getLocalization('dojo.cldr', mapping[LOCALE_ALIAS_TARGET_BUNDLE], locale);126				if(processed[mapping[LOCALE_ALIAS_SOURCE_PROPERTY]]){//If being processed, continue;127					continue;128				}129				_updateNoneGregAlias(bundle, mapping[LOCALE_ALIAS_SOURCE_PROPERTY], targetBundle,130								   mapping[LOCALE_ALIAS_TARGET_PROPERTY], nativeSrcBundle);131				processed[mapping[LOCALE_ALIAS_SOURCE_PROPERTY]] =  true;132			}133		}134	}135}136/*137* This function will flatten the source bundle for non-gregorian ones by searching in the bundle files generated from the ldml spec which have terms like:138* "'months-standAlone-abbr@localeAlias131':{'target':"months-format-abbr",'bundle':"hebrew"},".139*   Parameters:140*   	sourceBundle: The bundles which need to be aliased.141*   	aliasSource:  The source mark string. 'months-standAlone-abbr' for example.142*   	targetBundle: The aliased bundle. 'hebrew' for example.143*   	aliasTarget:  The target mark string. 'months-format-abbr' for example.144*   	nativeSrcBundle: The final flattened bundle file.145* According to the dojo way of fetching resource bundle, this function will firstly check the bundle under the appointed146* locale. If the wanted calendar bundle is not under the locale, the root calendar bundle will be fetched. If the non-gregorian147* bundle in the root can not be found, dojo will finally get the root gregorian bundle.148*/149function _updateNoneGregAlias(sourceBundle/*JSON Obj*/, aliasSource/*String*/, targetBundle/*JSON Obj*/, aliasTarget/*String*/, nativeSrcBundle/*JSON Obj*/){150    for (var sKey in sourceBundle) {151        var target = targetBundle[sKey],152	    source = sourceBundle[sKey],153	    nativeSrc = nativeSrcBundle[sKey];154	if (sKey.indexOf(aliasSource) == 0 && !nativeSrc && target && !compare(source, target)) {155            nativeSrcBundle[sKey] = target;156            sourceBundle[sKey] = target;157            updated = true;158        } else {159            if (sKey.indexOf(aliasSource) == 0 && nativeSrc && dojo.isArray(source) && dojo.isArray(target)) {160                for (var i = 0; i < source.length; i++) {161                    if (source[i] === undefined) {162                        source[i] = target[i];163                        updated = true;164                    }165                }166                if (source.length < target.length) {167                    source = sourceBundle[sKey] = source.concat(target.slice(source.length));168                    updated = true;169                }170                if (updated) {171                    nativeSrcBundle[sKey] = source;172                }173            }174        }175    }176}177function _updateLocaleAlias(sourceBundle/*JSON Obj*/,aliasSource/*String*/, targetBundle/*JSON Obj*/,178							aliasTarget/*String*/, nativeSrcBundle/*JSON Obj*/){179		//single property180		if(!nativeSrcBundle[aliasSource] && nativeSrcBundle[aliasTarget]//no this property in current locale181		   && !compare(sourceBundle[aliasSource], targetBundle[aliasTarget])){182			// then should inherit from alias target (as defined by 'locale' alias)183			//logStr += '1 '+aliasSource + "=" + sourceBundle[aliasSource] + " is replaced with " + aliasTarget + "=" + targetBundle[aliasTarget]+'\n';184			//sourceBundle[aliasSource] =  targetBundle[aliasTarget];185			nativeSrcBundle[aliasSource] =  targetBundle[aliasTarget];186			sourceBundle[aliasSource] = nativeSrcBundle[aliasSource];187			updated = true;188		}else if(nativeSrcBundle[aliasSource] && dojo.isArray(sourceBundle[aliasSource])189		         && dojo.isArray(targetBundle[aliasTarget])){190			if(sourceBundle[aliasSource].length > targetBundle[aliasTarget].length){191				//logStr +="Error:" + aliasSource + ".length > " +  aliasTarget + ".length \n";192			}193			//array property, see if need inherit194			for(var i = 0; i < sourceBundle[aliasSource].length; i++){195				if(sourceBundle[aliasSource][i] == undefined){//need inherit196					//logStr += '2 ' + aliasSource + "["+i+"]=" +sourceBundle[aliasSource][i]+" is replaced with " + aliasTarget+"["+i+"]="+targetBundle[aliasTarget][i]+'\n';197					sourceBundle[aliasSource][i] =  targetBundle[aliasTarget][i];198					updated = true;199				}// otherwise no change and use current value200			}201			if(sourceBundle[aliasSource].length < targetBundle[aliasTarget].length){202				//logStr +='3 ' + aliasSource +' from ' + sourceBundle[aliasSource].length +' to '203				//		  + (targetBundle[aliasTarget].length-1) + ' are copied from '204				//		  +aliasTarget + '='+ targetBundle[aliasTarget] +'\n';205				sourceBundle[aliasSource] = sourceBundle[aliasSource].concat(206											targetBundle[aliasTarget].slice(sourceBundle[aliasSource].length));207				updated = true;208			}209			if(updated){210				nativeSrcBundle[aliasSource] = sourceBundle[aliasSource];211			}212		}213}214function cleanLocaleAlias(fileList/*Array*/){215	for(var i = 0; i < fileList.length; i++){216		var fileName = new String(fileList[i]); //Java String217		try{218			var bundle = getNativeBundle(fileName);//bundle not flattened219		}catch(e){print(e);/* simply ignore if no bundle found*/}220		221		var newBundle = {};222		var needUpdate = false;223		for(p in bundle){224			if(p.indexOf(LOCALE_ALIAS_MARK) < 0){225				newBundle[p] = bundle[p];226			}else{227				needUpdate = true;228			}229		}230		if(needUpdate){231			fileUtil.saveUtf8File(fileName, "(" + dojo.toJson(newBundle, true) + ")");232			//logStr += "cleaned @localAlias for " + fileName + "\n";233		}234	}...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
