Best JavaScript code snippet using playwright-internal
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	}...add-to-cart-bundle.js
Source:add-to-cart-bundle.js  
...14			$( '.bundle_form_' + bundle_id + ' .bundle_wrap' ).find('input[name="variation_id['+ bundled_item_id +']"]').val( variation.variation_id ).change();15			for ( attribute in variation.attributes ) {16				$( '.bundle_form_' + bundle_id + ' .bundle_wrap' ).find('input[name="' + attribute + '['+ bundled_item_id +']"]').val( $(this).find('.attribute-options select[name="' + attribute + '"]').val() );17			}18			attempt_show_bundle( bundle_id );19		} )20		.on( 'woocommerce_update_variation_values', function() {21			var bundle_id = $(this).attr('data-bundle-id');22			var bundled_item_id 	= $(this).attr('data-bundled-item-id');23			$(this).find( '.bundled_item_wrap input[name="variation_id"]').each(function(){24				if ( $(this).val() == '' ) {25					$( '.bundle_form_' + bundle_id + ' .bundle_wrap' ).find('input[name="variation_id['+ bundled_item_id +']"]').val('');26					$( '.bundle_form_' + bundle_id + ' .bundle_wrap' ).slideUp('200');27				}28			});29		} );30	function attempt_show_bundle( bundle_id ) {31		var all_set = true;32		$('#product-' + bundle_id + ' .variations select').each(function(){33			if ($(this).val().length == 0) {34				all_set = false;35			}36		});37		if (all_set) {38			var bundle_price_data = window[ "bundle_price_data_" + bundle_id ];39			var bundled_item_quantities = window[ "bundled_item_quantities_" + bundle_id ];40			if ( (bundle_price_data['per_product_pricing'] == false) && (bundle_price_data['total'] == -1) ) return;41			if ( bundle_price_data['per_product_pricing'] == true ) {42				bundle_price_data['total'] = 0;43				bundle_price_data['regular_total'] = 0;44				for ( prod_id in bundle_price_data['prices'] ) {45					bundle_price_data['total'] += bundle_price_data['prices'][prod_id] * bundled_item_quantities[prod_id];46					bundle_price_data['regular_total'] += bundle_price_data['regular_prices'][prod_id] * bundled_item_quantities[prod_id];47				}48			}49			if ( bundle_price_data['total'] == 0 )50				$('.bundle_form_' + bundle_id + ' .bundle_price').html('<p class="price"><span class="total">' + bundle_price_data['total_description'] + '</span>'+ bundle_price_data['free'] +'</p>');51			else {52				var sales_price = number_format ( bundle_price_data['total'], bundle_price_data['woocommerce_price_num_decimals'], bundle_price_data['woocommerce_price_decimal_sep'], bundle_price_data['woocommerce_price_thousand_sep'] );53				var regular_price = number_format ( bundle_price_data['regular_total'], bundle_price_data['woocommerce_price_num_decimals'], bundle_price_data['woocommerce_price_decimal_sep'], bundle_price_data['woocommerce_price_thousand_sep'] );54				var remove = bundle_price_data['woocommerce_price_decimal_sep'];55				if ( bundle_price_data['woocommerce_price_trim_zeros'] == 'yes' && bundle_price_data['woocommerce_price_num_decimals'] > 0 ) {56					for (var i = 0; i < bundle_price_data['woocommerce_price_num_decimals']; i++) { remove = remove + '0'; }57					sales_price = sales_price.replace(remove, '');58					regular_price = regular_price.replace(remove, '');59				}60				var sales_price_format = '';61				var regular_price_format = '';62				if ( bundle_price_data['woocommerce_currency_pos'] == 'left' ) {63					sales_price_format = '<span class="amount">' + bundle_price_data['currency_symbol'] + sales_price + '</span>';64					regular_price_format = '<span class="amount">' + bundle_price_data['currency_symbol'] + regular_price + '</span>'; }65				else if ( bundle_price_data['woocommerce_currency_pos'] == 'right' ) {66					sales_price_format = '<span class="amount">' + sales_price + bundle_price_data['currency_symbol'] +  '</span>';67					regular_price_format = '<span class="amount">' + regular_price + bundle_price_data['currency_symbol'] +  '</span>'; }68				else if ( bundle_price_data['woocommerce_currency_pos'] == 'left_space' ) {69					sales_price_format = '<span class="amount">' + bundle_price_data['currency_symbol'] + ' ' + sales_price + '</span>';70					regular_price_format = '<span class="amount">' + bundle_price_data['currency_symbol'] + ' ' + regular_price + '</span>'; }71				else if ( bundle_price_data['woocommerce_currency_pos'] == 'right_space' ) {72					sales_price_format = '<span class="amount">' + sales_price + ' ' + bundle_price_data['currency_symbol'] +  '</span>';73					regular_price_format = '<span class="amount">' + regular_price + ' ' + bundle_price_data['currency_symbol'] +  '</span>'; }74				if ( bundle_price_data['regular_total'] > bundle_price_data['total'] ) {75					$('.bundle_form_' + bundle_id + ' .bundle_price').html('<p class="price"><span class="total">' + bundle_price_data['total_description'] + '</span><del>' + regular_price_format +'</del> <ins>'+ sales_price_format +'</ins></p>');76				} else {77					$('.bundle_form_' + bundle_id + ' .bundle_price').html('<p class="price"><span class="total">' + bundle_price_data['total_description'] + '</span>'+ sales_price_format +'</p>');78				}79			}80			// reset bundle stock status81			$('.bundle_form_' + bundle_id + ' .bundle_wrap p.stock').replaceWith( bundle_stock_status[bundle_id] );82			// set bundle stock status as out of stock if any selected variation is out of stock83			$('#product-' + bundle_id + ' .variations_form').each(function(){84				if ( $(this).find('.variations').length > 0 ) {85					var $item_stock_p = $(this).find('p.stock');86					if ( $item_stock_p.hasClass('out-of-stock') ) {87						if ( $('.bundle_form_' + bundle_id + ' .bundle_wrap p.stock').length > 0 ) {88							$('.bundle_form_' + bundle_id + ' .bundle_wrap p.stock').replaceWith( $item_stock_p.clone() );89						} else {90							$('.bundle_form_' + bundle_id + ' .bundle_wrap .bundle_price').after( $item_stock_p.clone() );91						}92					}93				}94			});95			$('.bundle_form_' + bundle_id + ' .bundle_wrap').slideDown('200').trigger('show_bundle');96		}97	}98	function check_all_simple( bundle_id ) {99		var bundle_price_data = window[ "bundle_price_data_" + bundle_id ];100		var bundle_variations = window[ "bundle_variations_" + bundle_id ];101		if ( typeof bundle_price_data == 'undefined' ) { return false; }102		if ( bundle_price_data['prices'].length < 1 ) { return false; }103		if ( $( '.bundle_form_' + bundle_id + ' input[value="variable"]' ).length > 0 ) {104			return false;105		}106		return true;107	}108	/**109	 * Initial states and loading110	 */111	var bundle_stock_status = [];112	$('.bundle_form').each( function() {113		var bundle_id = $(this).attr('data-bundle-id');114		if ( $(this).find('.bundle_wrap p.stock').length > 0 )115			bundle_stock_status[bundle_id] = $(this).find('.bundle_wrap p.stock').clone().wrap('<p>').parent().html();116		$('#product-' + bundle_id + ' .variations select').change();117		if ( check_all_simple( bundle_id ) )118			attempt_show_bundle( bundle_id );119	});120	/**121	 * Helper functions for variations122	 */123	function number_format( number, decimals, dec_point, thousands_sep ) {124	    var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;125	    var d = dec_point == undefined ? "," : dec_point;126	    var t = thousands_sep == undefined ? "." : thousands_sep, s = n < 0 ? "-" : "";127	    var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;128	    return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");129	}...ResourceBundle.js
Source:ResourceBundle.js  
1Clazz.load(null,"java.util.ResourceBundle",["java.lang.NullPointerException","java.util.Enumeration","$.MissingResourceException","net.sf.j2s.ajax.HttpRequest"],function(){2c$=Clazz.decorateAsClass(function(){3this.parent=null;4this.locale=null;5this.bundleName=null;6Clazz.instantialize(this,arguments);7},java.util,"ResourceBundle");8Clazz.makeConstructor(c$,9function(){10});11Clazz.defineMethod(c$,"getString",12function(key){13return this.getObject(key);14},"~S");15Clazz.defineMethod(c$,"getStringArray",16function(key){17return this.getObject(key);18},"~S");19Clazz.defineMethod(c$,"getObject",20function(key){21var obj=this.handleGetObject(key);22if(obj==null){23if(this.parent!=null){24obj=this.parent.getObject(key);25}if(obj==null)throw new java.util.MissingResourceException("Can't find resource for bundle "+this.getClass().getName()+", key "+key,this.getClass().getName(),key);26}return obj;27},"~S");28Clazz.defineMethod(c$,"getLocale",29function(){30return this.locale;31});32Clazz.defineMethod(c$,"setParent",33function(parent){34this.parent=parent;35},"java.util.ResourceBundle");36c$.getBundle=Clazz.defineMethod(c$,"getBundle",37function(baseName){38return java.util.ResourceBundle.getBundleImpl(baseName,null,null);39},"~S");40c$.getBundle=Clazz.defineMethod(c$,"getBundle",41function(baseName,locale){42return java.util.ResourceBundle.getBundleImpl(baseName,locale,null);43},"~S,java.util.Locale");44c$.getBundle=Clazz.defineMethod(c$,"getBundle",45function(baseName,locale,loader){46if(loader==null){47throw new NullPointerException();48}return java.util.ResourceBundle.getBundleImpl(baseName,locale,loader);49},"~S,java.util.Locale,ClassLoader");50c$.getBundleImpl=Clazz.defineMethod(c$,"getBundleImpl",51($fz=function(baseName,locale,loader){52if(baseName==null){53throw new NullPointerException();54}for(var i=0;i<java.util.ResourceBundle.caches.length;i++){55if(java.util.ResourceBundle.caches[i].bundleName===baseName){56return java.util.ResourceBundle.caches[i];57}}58var bundle=new java.util.ResourceBundle.TextResourceBundle(baseName);59java.util.ResourceBundle.caches[java.util.ResourceBundle.caches.length]=bundle;60return bundle;61},$fz.isPrivate=true,$fz),"~S,java.util.Locale,ClassLoader");62c$.registerBundle=Clazz.defineMethod(c$,"registerBundle",63function(baseName,content){64for(var i=0;i<java.util.ResourceBundle.caches.length;i++){65if(java.util.ResourceBundle.caches[i].bundleName===baseName){66return;67}}68java.util.ResourceBundle.caches[java.util.ResourceBundle.caches.length]=new java.util.ResourceBundle.TextResourceBundle(baseName,content);69},"~S,~S");70Clazz.pu$h(self.c$);71c$=Clazz.decorateAsClass(function(){72this.map=null;73this.keys=null;74this.content=null;75this.initialized=false;76Clazz.instantialize(this,arguments);77},java.util.ResourceBundle,"TextResourceBundle",java.util.ResourceBundle);78Clazz.prepareFields(c$,function(){79this.map=new Array(0);80this.keys=new Array(0);81});82Clazz.makeConstructor(c$,83function(a){84Clazz.superConstructor(this,java.util.ResourceBundle.TextResourceBundle,[]);85this.bundleName=a;86},"~S");87Clazz.makeConstructor(c$,88function(a,b){89Clazz.superConstructor(this,java.util.ResourceBundle.TextResourceBundle,[]);90this.bundleName=a;91this.content=b;92},"~S,~S");93Clazz.defineMethod(c$,"evalString",94function(a){95var r=new Array();96var b=false;97var x=0;98for(var i=0;i<a.length;i++){99var c=a.charAt(i);100if(b){101if(c=='f') r[r.length] = '\f';102else if(c=='t') r[r.length] = '\t';103else if(c=='r') r[r.length] = '\r';104else if(c=='n') r[r.length] = '\n';105else if(c=='\'') r[r.length] = '\'';106else if(c=='\"') r[r.length] = '\"';107else if(c=='\\') r[r.length] = '\\';108else if(c=='u'){109r[r.length]=eval("\"\\u"+a.substring(i+1,i+5)+"\"");110i+=4;111}112x=i+1;113b=false;114}else if(c=='\\'){115if(x!=i){116r[r.length]=a.substring(x,i);117}118b=true;119}120}121if(!b){122r[r.length]=a.substring(x,a.length);123}124return r.join('');125},"~S");126Clazz.defineMethod(c$,"initBundle",127($fz=function(){128if(this.initialized){129return;130}this.initialized=true;131var a=null;132var b=this.bundleName;133if(this.content==null){134var n=b.replace(/\./g,'/')+".properties";135var p=Clazz.binaryFolders;136if(p==null){137p=["bin","","j2slib"];138}139var r=new net.sf.j2s.ajax.HttpRequest();140var x=0;141while(a==null&&x<p.length){142var q=p[x];143if(q.length>0&&q.lastIndexOf("/")!=q.length-1){144q+="/";145}146try{147r.open("GET",q+n,false);148r.send();149a=r.getResponseText();150}catch(e){151r=new net.sf.j2s.ajax.HttpRequest();152}153x++;154}155}if(this.content==null){156this.content=a;157}if(this.content==null){158return;159}var c=this.content.$plit("\n");160for(var d=0;d<c.length;d++){161var e=c[d].trim();162if(!e.startsWith("#")){163var f=e.indexOf('=');164if(f!=-1){165var g=e.substring(0,f).trim();166var h=e.substring(f+1).trim();167if(h.indexOf('\\')!=-1){168h=this.evalString(h);169}var i=this.map;170var j=this.keys;171{172if(i[g]==null){173j[j.length]=g;174}175i[g]=h;176}}}}177},$fz.isPrivate=true,$fz));178Clazz.overrideMethod(c$,"getKeys",179function(){180return((Clazz.isClassDefined("java.util.ResourceBundle$TextResourceBundle$1")?0:java.util.ResourceBundle.TextResourceBundle.$ResourceBundle$TextResourceBundle$1$()),Clazz.innerTypeInstance(java.util.ResourceBundle$TextResourceBundle$1,this,null));181});182Clazz.overrideMethod(c$,"handleGetObject",183function(a){184if(!this.initialized){185this.initBundle();186}var b=this.map;187{188return b[a];189}return b;190},"~S");191c$.$ResourceBundle$TextResourceBundle$1$=function(){192Clazz.pu$h(self.c$);193c$=Clazz.decorateAsClass(function(){194Clazz.prepareCallback(this,arguments);195this.index=-1;196Clazz.instantialize(this,arguments);197},java.util,"ResourceBundle$TextResourceBundle$1",null,java.util.Enumeration);198Clazz.overrideMethod(c$,"nextElement",199function(){200this.index++;201return this.b$["java.util.ResourceBundle.TextResourceBundle"].keys[this.index];202});203Clazz.overrideMethod(c$,"hasMoreElements",204function(){205return this.index<this.b$["java.util.ResourceBundle.TextResourceBundle"].keys.length-1;206});207c$=Clazz.p0p();208};209c$=Clazz.p0p();210c$.caches=c$.prototype.caches=new Array(0);
...legacyModule.js
Source:legacyModule.js  
1dojo.provide("i18nTest.legacyModule");2dojo.requireLocalization("i18nTest", "amdBundle");3dojo.requireLocalization("i18nTest", "legacyBundle");4i18nTest.legacyModule = function(){5	var legacyBundle = dojo.i18n.getLocalization("i18nTest", "legacyBundle"),6		amdBundle = dojo.i18n.getLocalization("i18nTest", "amdBundle"),7		result = [];8	if(amdBundle.rootValueOnly!="rootValueOnly"){9		result.push('amdBundle.rootValueOnly!="rootValueOnly"');10	}11	switch(dojo.locale){12		case "ab":13		case "ab-cd":14			if(amdBundle.amdBundle!="amdBundle-ab"){15				result.push('amdBundle.amdBundle!="amdBundle-ab"');16			}17			if(amdBundle.abValueOnly!="abValueOnly"){18				result.push('amdBundle.abValueOnly!="abValueOnly"');19			}20			break;21		case "ab-cd-ef":22			if(amdBundle.amdBundle!="amdBundle-ab-cd-ef"){23				result.push('amdBundle.amdBundle!="amdBundle-ab-cd-ef"');24			}25			if(amdBundle.abValueOnly!="abValueOnly"){26				result.push('amdBundle.abValueOnly!="abValueOnly"');27			}28			if(amdBundle.abCdEfValueOnly!="abCdEfValueOnly"){29				result.push('amdBundle.abCdEfValueOnly!="abCdEfValueOnly"');30			}31			break;32		default:33			if(amdBundle.amdBundle!="amdBundle"){34				result.push('amdBundle.amdBundle!="amdBundle"');35			}36	}37	if(legacyBundle.rootValueOnly!="rootValueOnly"){38		result.push('legacyBundle.rootValueOnly!="rootValueOnly"');39	}40	switch(dojo.locale){41		case "ab":42		case "ab-cd":43			if(legacyBundle.legacyBundle!="legacyBundle-ab"){44				result.push('legacyBundle.legacyBundle!="legacyBundle-ab"');45			}46			if(legacyBundle.abValueOnly!="abValueOnly"){47				result.push('legacyBundle.abValueOnly!="abValueOnly"');48			}49			break;50		case "ab-cd-ef":51			if(legacyBundle.legacyBundle!="legacyBundle-ab-cd-ef"){52				result.push('legacyBundle.legacyBundle!="legacyBundle-ab-cd-ef"');53			}54			if(legacyBundle.abValueOnly!="abValueOnly"){55				result.push('legacyBundle.abValueOnly!="abValueOnly"');56			}57			if(legacyBundle.abCdEfValueOnly!="abCdEfValueOnly"){58				result.push('legacyBundle.abCdEfValueOnly!="abCdEfValueOnly"');59			}60			break;61		default:62			if(legacyBundle.legacyBundle!="legacyBundle"){63				result.push('legacyBundle.legacyBundle!="legacyBundle"');64			}65	}66	var i18n= require("dojo/i18n");67	for(var p in i18n._cache) console.log(p);68	return result.length==0 ? true : result.join(";");...test_bug378839.js
Source:test_bug378839.js  
1/* Tests getting properties from string bundles2 */3const name_file = "file";4const value_file = "File";5const name_loyal = "loyal";6const value_loyal = "\u5fe0\u5fc3"; // tests escaped Unicode7const name_trout = "trout";8const value_trout = "\u9cdf\u9b5a"; // tests UTF-89const name_edit = "edit";10const value_edit = "Edit"; // tests literal leading spaces are stripped11const name_view = "view";12const value_view = "View"; // tests literal trailing spaces are stripped13const name_go = "go";14const value_go = " Go"; // tests escaped leading spaces are not stripped15const name_message = "message";16const value_message = "Message "; // tests escaped trailing spaces are not stripped17const name_hello = "hello";18const var_hello = "World";19const value_hello = "Hello World"; // tests formatStringFromName with parameter20function run_test() {21    var StringBundle = 22	Components.classes["@mozilla.org/intl/stringbundle;1"]23	 .getService(Components.interfaces.nsIStringBundleService);24    var ios = Components.classes["@mozilla.org/network/io-service;1"]25	 .getService(Components.interfaces.nsIIOService);26    var bundleURI = ios.newFileURI(do_get_file("strres.properties"));27    var bundle = StringBundle.createBundle(bundleURI.spec);28    var bundle_file = bundle.GetStringFromName(name_file);29    do_check_eq(bundle_file, value_file);30    var bundle_loyal = bundle.GetStringFromName(name_loyal);31    do_check_eq(bundle_loyal, value_loyal);32    var bundle_trout = bundle.GetStringFromName(name_trout);33    do_check_eq(bundle_trout, value_trout);34    var bundle_edit = bundle.GetStringFromName(name_edit);35    do_check_eq(bundle_edit, value_edit);36    var bundle_view = bundle.GetStringFromName(name_view);37    do_check_eq(bundle_view, value_view);38    var bundle_go = bundle.GetStringFromName(name_go);39    do_check_eq(bundle_go, value_go);40    var bundle_message = bundle.GetStringFromName(name_message);41    do_check_eq(bundle_message, value_message);42    var bundle_hello = bundle.formatStringFromName(name_hello, [var_hello], 1);43    do_check_eq(bundle_hello, value_hello);44}...Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.screenshot({ path: 'google.png' });7  await browser.close();8})();Using AI Code Generation
1const playwright = require('playwright');2(async () => {3  for (const browserType of BROWSER) {4    const browser = await playwright[browserType].launch({ headless: false });5    const context = await browser.newContext();6    const page = await context.newPage();7    await page.screenshot({ path: `example-${browserType}.png` });8    await browser.close();9  }10})();11const playwright = require('playwright');12(async () => {13  const browserServer = await playwright.chromium.launchServer({ headless: false });14  const wsEndpoint = browserServer.wsEndpoint();15  const browser = await playwright.chromium.connect({ wsEndpoint });16  const context = await browser.newContext();17  const page = await context.newPage();18  await page.screenshot({ path: `example.png` });19  await browser.close();20  await browserServer.close();21})();22const playwright = require('playwright');23(async () => {24  const browser = await playwright.chromium.launch({ headless: false });25  const context = await browser.newContext();26  const page = await context.newPage();27  await page.screenshot({ path: `example.png` });28  await browser.close();29})();Using AI Code Generation
1const {chromium} = require('playwright');2(async () => {3  const browser = await chromium.launch({ headless: false });4  const context = await browser.newContext();5  const page = await context.newPage();6  const buffer = await response.body();7  console.log(buffer.toString());8  await browser.close();9})();Using AI Code Generation
1import { chromium } from "playwright";2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.screenshot({ path: "example.png" });7  await browser.close();8})();Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const page = await browser.newPage();5  await page.screenshot({ path: 'google.png' });6  await browser.close();7})();Using AI Code Generation
1const { Playwright } = require('@playwright/test');2const playwright = new Playwright();3const { webkit } = playwright;4const browser = await webkit.launch();5const context = await browser.newContext();6const page = await context.newPage();7await page.screenshot({ path: 'example.png' });8await browser.close();9const { Playwright } = require('@playwright/test');10const playwright = new Playwright();11const { webkit } = playwright;12const browser = await webkit.launch();13const context = await browser.newContext();14const page = await context.newPage();15await page.screenshot({ path: 'example.png' });16await browser.close();17const { Playwright } = require('@playwright/test');18const playwright = new Playwright();19const { webkit } = playwright;20const browser = await webkit.launch();21const context = await browser.newContext();22const page = await context.newPage();23await page.screenshot({ path: 'example.png' });24await browser.close();25const { Playwright } = require('@playwright/test');26const playwright = new Playwright();27const { webkit } = playwright;28const browser = await webkit.launch();29const context = await browser.newContext();30const page = await context.newPage();31await page.screenshot({ path: 'example.png' });32await browser.close();33const { Playwright } = require('@playwright/test');34const playwright = new Playwright();35const { webkit } = playwright;36const browser = await webkit.launch();37const context = await browser.newContext();38const page = await context.newPage();39await page.screenshot({ path: 'example.png' });40await browser.close();41const { Playwright } = require('@playwright/test');42const playwright = new Playwright();43const { webUsing AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  const bundled = await page.evaluate(async () => {7    const bundle = await window.__playwright__._bundle('test.js');8    return bundle;9  });10  const fn = new Function('document', bundled);11  const result = await page.evaluate(fn, document);12  console.log(result);13  await browser.close();14})();Using AI Code Generation
1const playwright = require('playwright');2const path = require('path');3(async () => {4  const browser = await playwright.chromium.launch();5  const context = await browser.newContext();6  const page = await context.newPage();7  const test = await playwright.internal.bundling.bundleTest(path.join(__dirname, 'test.spec.js'));8  await page.goto(test.url());9  await page.waitForSelector('.test-done');10  const results = await page.evaluate(() => window.results);11  console.log(results);12  await browser.close();13})();14const { expect } = chai;15const results = [];16const test = (name, fn) => results.push({ name, result: fn() });17const done = () => window.results = results;18test('should pass', () => {19  expect(true).to.equal(true);20});21test('should fail', () => {22  expect(true).to.equal(false);23});24done();25  { name: 'should pass', result: true },26  { name: 'should fail', result: false }27const { expect } = chai;28const results = [];29const test = (name, fn) => results.push({ name, result: fn() });30const done = () => window.results = results;31test('should pass', () => {32  expect(true).to.equal(true);33});34test('should fail', () => {35  expect(true).to.equal(false);36});37done();38  { name: 'should pass', result: true },39  { name: 'should fail', result: false }LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
