better-mock
Version:
Forked from Mockjs. Generate random data & Intercept ajax request. Support miniprogram.
1,687 lines (1,657 loc) • 266 kB
JavaScript
/*!
* better-mock v0.3.7 (mock.browser.js)
* (c) 2019-2023 lavyun@163.com
* Released under the MIT License.
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = global || self, global.Mock = factory());
}(this, (function () { 'use strict';
var constant = {
GUID: 1,
RE_KEY: /(.+)\|(?:\+(\d+)|([\+\-]?\d+-?[\+\-]?\d*)?(?:\.(\d+-?\d*))?)/,
RE_TRANSFER_TYPE: /#(.*)$/,
RE_RANGE: /([\+\-]?\d+)-?([\+\-]?\d+)?/,
RE_PLACEHOLDER: /\\*@([^@#%&()\?\s]+)(?:\((.*?)\))?/g
};
/* type-coverage:ignore-next-line */
var type = function (value) {
return isDef(value)
? Object.prototype.toString.call(value).match(/\[object (\w+)\]/)[1].toLowerCase()
: String(value);
};
var isDef = function (value) {
return value !== undefined && value !== null;
};
var isString = function (value) {
return type(value) === 'string';
};
var isNumber = function (value) {
return type(value) === 'number';
};
var isObject = function (value) {
return type(value) === 'object';
};
var isArray = function (value) {
return type(value) === 'array';
};
var isRegExp = function (value) {
return type(value) === 'regexp';
};
var isFunction = function (value) {
return type(value) === 'function';
};
var keys = function (obj) {
var keys = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
keys.push(key);
}
}
return keys;
};
var values = function (obj) {
var values = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
values.push(obj[key]);
}
}
return values;
};
/**
* Mock.heredoc(fn)
* 以直观、安全的方式书写(多行)HTML 模板。
* http://stackoverflow.com/questions/805107/creating-multiline-strings-in-javascript
*/
var heredoc = function (fn) {
// 1. 移除起始的 function(){ /*!
// 2. 移除末尾的 */ }
// 3. 移除起始和末尾的空格
return fn
.toString()
.replace(/^[^\/]+\/\*!?/, '')
.replace(/\*\/[^\/]+$/, '')
.replace(/^[\s\xA0]+/, '')
.replace(/[\s\xA0]+$/, ''); // .trim()
};
var noop = function () { };
var assert = function (condition, error) {
if (!condition) {
throw new Error('[better-mock] ' + error);
}
};
/**
* 创建一个自定义事件,兼容 IE
* @param type 一个字符串,表示事件名称。
* @param bubbles 一个布尔值,表示该事件能否冒泡。
* @param cancelable 一个布尔值,表示该事件是否可以取消。
* @param detail 一个任意类型,传递给事件的自定义数据。
*/
var createCustomEvent = function (type, bubbles, cancelable, detail) {
if (bubbles === void 0) { bubbles = false; }
if (cancelable === void 0) { cancelable = false; }
try {
return new CustomEvent(type, { bubbles: bubbles, cancelable: cancelable, detail: detail });
}
catch (e) {
var event_1 = document.createEvent('CustomEvent');
event_1.initCustomEvent(type, bubbles, cancelable, detail);
return event_1;
}
};
var Util = /*#__PURE__*/Object.freeze({
__proto__: null,
type: type,
isDef: isDef,
isString: isString,
isNumber: isNumber,
isObject: isObject,
isArray: isArray,
isRegExp: isRegExp,
isFunction: isFunction,
keys: keys,
values: values,
heredoc: heredoc,
noop: noop,
assert: assert,
createCustomEvent: createCustomEvent
});
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __awaiter(thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
}
function __spreadArrays() {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
}
var MAX_NATURE_NUMBER = 9007199254740992;
var MIN_NATURE_NUMBER = -9007199254740992;
// 返回一个随机的布尔值。
var boolean = function (min, max, current) {
if (min === void 0) { min = 1; }
if (max === void 0) { max = 1; }
if (isDef(current)) {
if (isDef(min)) {
min = !isNaN(min) ? parseInt(min.toString(), 10) : 1;
}
if (isDef(max)) {
max = !isNaN(max) ? parseInt(max.toString(), 10) : 1;
}
return Math.random() > 1.0 / (min + max) * min ? !current : current;
}
return Math.random() >= 0.5;
};
var bool = boolean;
// 返回一个随机的自然数(大于等于 0 的整数)。
var natural = function (min, max) {
if (min === void 0) { min = 0; }
if (max === void 0) { max = MAX_NATURE_NUMBER; }
min = parseInt(min.toString(), 10);
max = parseInt(max.toString(), 10);
return Math.round(Math.random() * (max - min)) + min;
};
// 返回一个随机的整数。
var integer = function (min, max) {
if (min === void 0) { min = MIN_NATURE_NUMBER; }
if (max === void 0) { max = MAX_NATURE_NUMBER; }
min = parseInt(min.toString(), 10);
max = parseInt(max.toString(), 10);
return Math.round(Math.random() * (max - min)) + min;
};
var int = integer;
// 返回一个随机的浮点数。
var float = function (min, max, dmin, dmax) {
dmin = isDef(dmin) ? dmin : 0;
dmin = Math.max(Math.min(dmin, 17), 0);
dmax = isDef(dmax) ? dmax : 17;
dmax = Math.max(Math.min(dmax, 17), 0);
var ret = integer(min, max) + '.';
for (var i = 0, dcount = natural(dmin, dmax); i < dcount; i++) {
// 最后一位不能为 0:如果最后一位为 0,会被 JS 引擎忽略掉。
var num = i < dcount - 1 ? character('number') : character('123456789');
ret += num;
}
return parseFloat(ret);
};
// 返回一个随机字符。
var character = function (pool) {
if (pool === void 0) { pool = ''; }
var lower = 'abcdefghijklmnopqrstuvwxyz';
var upper = lower.toUpperCase();
var number = '0123456789';
var symbol = '!@#$%^&*()[]';
var pools = {
lower: lower,
upper: upper,
number: number,
symbol: symbol,
alpha: lower + upper
};
if (!pool) {
pool = lower + upper + number + symbol;
}
else {
pool = pools[pool.toLowerCase()] || pool;
}
return pool.charAt(natural(0, pool.length - 1));
};
var char = character;
// 返回一个随机字符串。
var string = function (pool, min, max) {
var len;
switch (arguments.length) {
case 0: // ()
len = natural(3, 7);
break;
case 1: // ( length )
len = pool;
pool = undefined;
break;
case 2:
// ( pool, length )
if (typeof arguments[0] === 'string') {
len = min;
}
else {
// ( min, max )
len = natural(pool, min);
pool = undefined;
}
break;
case 3:
len = natural(min, max);
break;
}
var text = '';
for (var i = 0; i < len; i++) {
text += character(pool);
}
return text;
};
var str = string;
// 返回一个整型数组。
var range = function (start, stop, step) {
if (step === void 0) { step = 1; }
// range( stop )
if (arguments.length <= 1) {
stop = start || 0;
start = 0;
}
start = +start;
stop = +stop;
step = +step;
var idx = 0;
var len = Math.max(Math.ceil((stop - start) / step), 0);
var range = new Array(len);
while (idx < len) {
range[idx++] = start;
start += step;
}
return range;
};
var basic = /*#__PURE__*/Object.freeze({
__proto__: null,
boolean: boolean,
bool: bool,
natural: natural,
integer: integer,
int: int,
float: float,
character: character,
char: char,
string: string,
str: str,
range: range
});
// Date
var _padZero = function (value) {
return value < 10 ? '0' + value : value.toString();
};
var patternLetters = {
yyyy: 'getFullYear',
yy: function (date) {
return date.getFullYear().toString().slice(2);
},
y: 'yy',
MM: function (date) {
return _padZero(date.getMonth() + 1);
},
M: function (date) {
return (date.getMonth() + 1).toString();
},
dd: function (date) {
return _padZero(date.getDate());
},
d: 'getDate',
HH: function (date) {
return _padZero(date.getHours());
},
H: 'getHours',
hh: function (date) {
return _padZero(date.getHours() % 12);
},
h: function (date) {
return (date.getHours() % 12).toString();
},
mm: function (date) {
return _padZero(date.getMinutes());
},
m: 'getMinutes',
ss: function (date) {
return _padZero(date.getSeconds());
},
s: 'getSeconds',
SS: function (date) {
var ms = date.getMilliseconds();
return ms < 10 && '00' + ms || ms < 100 && '0' + ms || ms.toString();
},
S: 'getMilliseconds',
A: function (date) {
return date.getHours() < 12 ? 'AM' : 'PM';
},
a: function (date) {
return date.getHours() < 12 ? 'am' : 'pm';
},
T: 'getTime'
};
var _createFormatRE = function () {
var re = keys(patternLetters);
return '(' + re.join('|') + ')';
};
var _formatDate = function (date, format) {
var formatRE = new RegExp(_createFormatRE(), 'g');
return format.replace(formatRE, function createNewSubString($0, flag) {
return typeof patternLetters[flag] === 'function'
? patternLetters[flag](date)
: patternLetters[flag] in patternLetters
? createNewSubString($0, patternLetters[flag])
: date[patternLetters[flag]]();
});
};
// 生成一个随机的 Date 对象。
var _randomDate = function (min, max) {
if (min === void 0) { min = new Date(0); }
if (max === void 0) { max = new Date(); }
var randomTS = Math.random() * (max.getTime() - min.getTime());
return new Date(randomTS);
};
// 返回一个随机的日期字符串。
var date = function (format) {
if (format === void 0) { format = 'yyyy-MM-dd'; }
return _formatDate(_randomDate(), format);
};
// 返回一个随机的时间字符串。
var time = function (format) {
if (format === void 0) { format = 'HH:mm:ss'; }
return _formatDate(_randomDate(), format);
};
// 返回一个随机的日期和时间字符串。
var datetime = function (format) {
if (format === void 0) { format = 'yyyy-MM-dd HH:mm:ss'; }
return _formatDate(_randomDate(), format);
};
// 返回一个随机的时间戳
var timestamp = function () {
return Number(_formatDate(_randomDate(), 'T'));
};
// 返回当前的日期和时间字符串。
var now = function (unit, format) {
// now(unit) now(format)
if (arguments.length === 1) {
// now(format)
if (!/year|month|day|hour|minute|second|week/.test(unit)) {
format = unit;
unit = '';
}
}
unit = (unit || '').toLowerCase();
format = format || 'yyyy-MM-dd HH:mm:ss';
var date = new Date();
// 参考自 http://momentjs.cn/docs/#/manipulating/start-of/
switch (unit) {
case 'year':
date.setMonth(0);
break;
case 'month':
date.setDate(1);
break;
case 'week':
date.setDate(date.getDate() - date.getDay());
break;
case 'day':
date.setHours(0);
break;
case 'hour':
date.setMinutes(0);
break;
case 'minute':
date.setSeconds(0);
break;
case 'second':
date.setMilliseconds(0);
}
return _formatDate(date, format);
};
var date$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
date: date,
time: time,
datetime: datetime,
timestamp: timestamp,
now: now
});
// 把字符串的第一个字母转换为大写。
var capitalize = function (word) {
word = word + '';
return word.charAt(0).toUpperCase() + word.substr(1);
};
// 把字符串转换为大写。
var upper = function (str) {
return (str + '').toUpperCase();
};
// 把字符串转换为小写。
var lower = function (str) {
return (str + '').toLowerCase();
};
// 从数组中随机选择一个
var pickOne = function (arr) {
return arr[natural(0, arr.length - 1)];
};
function pick(arr, min, max) {
if (min === void 0) { min = 1; }
// pick( item1, item2 ... )
if (!isArray(arr)) {
return pickOne(Array.from(arguments));
}
// pick( [ item1, item2 ... ], count )
if (!isDef(max)) {
max = min;
}
if (min === 1 && max === 1) {
return pickOne(arr);
}
// pick( [ item1, item2 ... ], min, max )
return shuffle(arr, min, max);
}
// 从map中随机选择一个
var pickMap = function (map) {
return pick(values(map));
};
// 打乱数组中元素的顺序,并按照 min - max 返回。
var shuffle = function (arr, min, max) {
if (!Array.isArray(arr)) {
return [];
}
var copy = arr.slice();
var length = arr.length;
for (var i = 0; i < length; i++) {
var swapIndex = natural(0, length - 1);
var swapValue = copy[swapIndex];
copy[swapIndex] = copy[i];
copy[i] = swapValue;
}
if (min && max) {
return copy.slice(0, natural(min, max));
}
if (min) {
return copy.slice(0, min);
}
return copy;
};
var helper = /*#__PURE__*/Object.freeze({
__proto__: null,
capitalize: capitalize,
upper: upper,
lower: lower,
pickOne: pickOne,
pick: pick,
pickMap: pickMap,
shuffle: shuffle
});
// image
// 常见图片尺寸
var imageSize = [
'150x100', '300x200', '400x300', '600x450', '800x600',
'100x150', '200x300', '300x400', '450x600', '600x800',
'100x100', '200x200', '300x300', '450x450', '600x600'
];
/**
* 随机生成一个图片,使用:http://iph.href.lu,例如:
* https://iph.href.lu/600x400?fg=cc00cc&bg=470047&text=hello
* @param size 图片大小
* @param background 背景色
* @param foreground 文字颜色
* @param format 图片格式
* @param text 文字
*/
var image = function (size, background, foreground, format, text) {
if (size === void 0) { size = ''; }
if (background === void 0) { background = ''; }
if (foreground === void 0) { foreground = ''; }
if (format === void 0) { format = ''; }
if (text === void 0) { text = ''; }
// Random.image( size, background, foreground, text )
if (arguments.length === 4) {
text = format;
format = '';
}
// Random.image( size, background, text )
if (arguments.length === 3) {
text = foreground;
foreground = '';
}
// Random.image( size, text )
if (arguments.length === 2) {
text = background;
background = '';
}
// Random.image()
size = size || pick(imageSize);
if (background && ~background.indexOf('#')) {
background = background.slice(1);
}
if (foreground && ~foreground.indexOf('#')) {
foreground = foreground.slice(1);
}
return format
? ('https://dummyimage.com/' +
size +
(background ? '/' + background : '') +
(foreground ? '/' + foreground : '') +
(format ? '.' + format : '') +
(text ? '?text=' + encodeURIComponent(text) : ''))
: "https://iph.href.lu/" + size + "?bg=" + background + "&fg=" + foreground + "&text=" + text;
};
var img = image;
/**
* 生成一个随机的base64图片
* @param size 图片宽高
* @param text 图片上的文字
*/
var dataImage = function (size, text) {
size = size || pick(imageSize);
text = text || size;
var background = pick([
'#171515', '#e47911', '#183693', '#720e9e', '#c4302b', '#dd4814',
'#00acee', '#0071c5', '#3d9ae8', '#ec6231', '#003580', '#e51937'
]);
var sizes = size.split('x');
var width = parseInt(sizes[0], 10);
var height = parseInt(sizes[1], 10);
assert(isNumber(width) && isNumber(height), 'Invalid size, expected INTxINT, e.g. 300x400');
{
return createBrowserDataImage(width, height, background, text);
}
};
// browser 端生成 base64 图片
function createBrowserDataImage(width, height, background, text) {
var canvas = document.createElement('canvas');
var ctx = canvas && canvas.getContext && canvas.getContext('2d');
if (!canvas || !ctx) {
return '';
}
canvas.width = width;
canvas.height = height;
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillStyle = background;
ctx.fillRect(0, 0, width, height);
ctx.fillStyle = '#FFFFFF';
ctx.font = 'bold 14px sans-serif';
ctx.fillText(text, width / 2, height / 2, width);
return canvas.toDataURL('image/png');
}
var image$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
image: image,
img: img,
dataImage: dataImage
});
// 颜色空间RGB与HSV(HSL)的转换
var hsv2rgb = function hsv2rgb(hsv) {
var h = hsv[0] / 60;
var s = hsv[1] / 100;
var v = hsv[2] / 100;
var hi = Math.floor(h) % 6;
var f = h - Math.floor(h);
var p = 255 * v * (1 - s);
var q = 255 * v * (1 - (s * f));
var t = 255 * v * (1 - (s * (1 - f)));
v = 255 * v;
switch (hi) {
case 0:
return [v, t, p];
case 1:
return [q, v, p];
case 2:
return [p, v, t];
case 3:
return [p, q, v];
case 4:
return [t, p, v];
case 5:
return [v, p, q];
}
};
var hsv2hsl = function hsv2hsl(hsv) {
var h = hsv[0], s = hsv[1] / 100, v = hsv[2] / 100, sl, l;
l = (2 - s) * v;
sl = s * v;
sl /= (l <= 1) ? l : 2 - l;
l /= 2;
return [h, sl * 100, l * 100];
};
// http://www.140byt.es/keywords/color
var rgb2hex = function (a, // red, as a number from 0 to 255
b, // green, as a number from 0 to 255
c // blue, as a number from 0 to 255
) {
return "#" + ((256 + a << 8 | b) << 8 | c).toString(16).slice(1);
};
// 颜色相关
var colorMap = {
navy: '#001F3F',
blue: '#0074D9',
aqua: '#7FDBFF',
teal: '#39CCCC',
olive: '#3D9970',
green: '#2ECC40',
lime: '#01FF70',
yellow: '#FFDC00',
orange: '#FF851B',
red: '#FF4136',
maroon: '#85144B',
fuchsia: '#F012BE',
purple: '#B10DC9',
silver: '#DDDDDD',
gray: '#AAAAAA',
black: '#111111',
white: '#FFFFFF'
};
// 随机生成一个有吸引力的颜色,格式为 '#RRGGBB'。
var color = function (name) {
if (name === void 0) { name = ''; }
if (name && colorMap[name]) {
return colorMap[name];
}
return hex();
};
// #DAC0DE
var hex = function () {
var hsv = _goldenRatioColor();
var rgb = hsv2rgb(hsv);
return rgb2hex(rgb[0], rgb[1], rgb[2]);
};
// rgb(128,255,255)
var rgb = function () {
var hsv = _goldenRatioColor();
var rgb = hsv2rgb(hsv);
return 'rgb(' +
parseInt(rgb[0].toString(), 10) + ', ' +
parseInt(rgb[1].toString(), 10) + ', ' +
parseInt(rgb[2].toString(), 10) + ')';
};
// rgba(128,255,255,0.3)
var rgba = function () {
var hsv = _goldenRatioColor();
var rgb = hsv2rgb(hsv);
return 'rgba(' +
parseInt(rgb[0].toString(), 10) + ', ' +
parseInt(rgb[1].toString(), 10) + ', ' +
parseInt(rgb[2].toString(), 10) + ', ' +
Math.random().toFixed(2) + ')';
};
// hsl(300,80%,90%)
var hsl = function () {
var hsv = _goldenRatioColor();
var hsl = hsv2hsl(hsv);
return 'hsl(' +
parseInt(hsl[0], 10) + ', ' +
parseInt(hsl[1], 10) + ', ' +
parseInt(hsl[2], 10) + ')';
};
// http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
// https://github.com/devongovett/color-generator/blob/master/index.js
// 随机生成一个有吸引力的颜色。
var _hue = 0;
var _goldenRatioColor = function (saturation, value) {
var _goldenRatio = 0.618033988749895;
_hue = _hue || Math.random();
_hue += _goldenRatio;
_hue %= 1;
if (typeof saturation !== "number")
saturation = 0.5;
if (typeof value !== "number")
value = 0.95;
return [
_hue * 360,
saturation * 100,
value * 100
];
};
var color$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
color: color,
hex: hex,
rgb: rgb,
rgba: rgba,
hsl: hsl
});
/** Used to compose unicode character classes. */
var rsAstralRange = '\\ud800-\\udfff';
var rsComboMarksRange = '\\u0300-\\u036f';
var reComboHalfMarksRange = '\\ufe20-\\ufe2f';
var rsComboSymbolsRange = '\\u20d0-\\u20ff';
var rsComboMarksExtendedRange = '\\u1ab0-\\u1aff';
var rsComboMarksSupplementRange = '\\u1dc0-\\u1dff';
var rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange + rsComboMarksExtendedRange + rsComboMarksSupplementRange;
var rsVarRange = '\\ufe0e\\ufe0f';
/** Used to compose unicode capture groups. */
var rsZWJ = '\\u200d';
var rsAstral = "[" + rsAstralRange + "]";
var rsCombo = "[" + rsComboRange + "]";
var rsFitz = '\\ud83c[\\udffb-\\udfff]';
var rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")";
var rsNonAstral = "[^" + rsAstralRange + "]";
var rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}';
var rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]';
/** Used to compose unicode regexes. */
var reOptMod = rsModifier + "?";
var rsOptVar = "[" + rsVarRange + "]?";
var rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ")" + (rsOptVar + reOptMod) + ")*";
var rsSeq = rsOptVar + reOptMod + rsOptJoin;
var rsNonAstralCombo = "" + rsNonAstral + rsCombo + "?";
var rsSymbol = "(?:" + [rsNonAstralCombo, rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ")";
/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + (rsSymbol + rsSeq), 'g');
/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
var reHasUnicode = RegExp("[" + (rsZWJ + rsAstralRange + rsComboRange + rsVarRange) + "]");
/**
* Checks if `string` contains Unicode symbols.
*
* @private
* @param {string} string The string to inspect.
* @returns {boolean} Returns `true` if a symbol is found, else `false`.
*/
function hasUnicode(string) {
return reHasUnicode.test(string);
}
/**
* Converts an ASCII `string` to an array.
*
* @private
* @param {string} string The string to convert.
* @returns {Array} Returns the converted array.
*/
function asciiToArray(string) {
return string.split('');
}
/**
* Converts a Unicode `string` to an array.
*
* @private
* @param {string} string The string to convert.
* @returns {Array} Returns the converted array.
*/
function unicodeToArray(string) {
return string.match(reUnicode) || [];
}
/**
* Converts `string` to an array.
*
* @private
* @param {string} string The string to convert.
* @returns {Array} Returns the converted array.
*/
/* istanbul ignore next */
function stringToArray(string) {
return hasUnicode(string)
? unicodeToArray(string)
: asciiToArray(string);
}
var _range = function (defaultMin, defaultMax, min, max) {
return !isDef(min)
? natural(defaultMin, defaultMax)
: !isDef(max)
? min
: natural(parseInt(min.toString(), 10), parseInt(max.toString(), 10)); // ( min, max )
};
// 随机生成一段文本。
var paragraph = function (min, max) {
var len = _range(3, 7, min, max);
var result = [];
for (var i = 0; i < len; i++) {
result.push(sentence());
}
return result.join(' ');
};
var cparagraph = function (min, max) {
var len = _range(3, 7, min, max);
var result = [];
for (var i = 0; i < len; i++) {
result.push(csentence());
}
return result.join('');
};
// 随机生成一个句子,第一个单词的首字母大写。
var sentence = function (min, max) {
var len = _range(12, 18, min, max);
var result = [];
for (var i = 0; i < len; i++) {
result.push(word());
}
return capitalize(result.join(' ')) + '.';
};
// 随机生成一个中文句子。
var csentence = function (min, max) {
var len = _range(12, 18, min, max);
var result = [];
for (var i = 0; i < len; i++) {
result.push(cword());
}
return result.join('') + '。';
};
// 随机生成一个单词。
var word = function (min, max) {
var len = _range(3, 10, min, max);
var result = '';
for (var i = 0; i < len; i++) {
result += character('lower');
}
return result;
};
// 随机生成一个或多个汉字。
var cword = function (pool, min, max) {
if (pool === void 0) { pool = ''; }
// 最常用的 500 个汉字 http://baike.baidu.com/view/568436.htm
var cnWords = '的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞';
var len;
switch (arguments.length) {
case 0: // ()
pool = cnWords;
len = 1;
break;
case 1: // ( pool )
if (typeof arguments[0] === 'string') {
len = 1;
}
else {
// ( length )
len = pool;
pool = cnWords;
}
break;
case 2:
// ( pool, length )
if (typeof arguments[0] === 'string') {
len = min;
}
else {
// ( min, max )
len = natural(parseInt(pool, 10), min);
pool = cnWords;
}
break;
case 3:
len = natural(min, max);
break;
}
var result = '';
for (var i = 0; i < len; i++) {
result += pool.charAt(natural(0, pool.length - 1));
}
return result;
};
// 随机生成一个或多个 emoji 符号
var emoji = function (pool, min, max) {
if (!['string', 'number', 'undefined'].includes(typeof pool)) {
return '';
}
// 常用的 338 个emoji符号 http://www.fhdq.net/emoji.html
var emojis = '😀😁😂😃😄😅😆😉😊😋😎😍😘😗😙😚☺😇😐😑😶😏😣😥😮😯😪😫😴😌😛😜😝😒😓😔😕😲😷😖😞😟😤😢😭😦😧😨😬😰😱😳😵😡😠😈👿👹👺💀👻👽👦👧👨👩👴👵👶👱👮👲👳👷👸💂🎅👰👼💆💇🙍🙎🙅🙆💁🙋🙇🙌🙏👤👥🚶🏃👯💃👫👬👭💏💑👪💪👈👉☝👆👇✌✋👌👍👎✊👊👋👏👐✍👣👀👂👃👅👄💋👓👔👕👖👗👘👙👚👛👜👝🎒💼👞👟👠👡👢👑👒🎩🎓💄💅💍🌂🙈🙉🙊🐵🐒🐶🐕🐩🐺🐱😺😸😹😻😼😽🙀😿😾🐈🐯🐅🐆🐴🐎🐮🐂🐃🐄🐷🐖🐗🐽🐏🐑🐐🐪🐫🐘🐭🐁🐀🐹🐰🐇🐻🐨🐼🐾🐔🐓🐣🐤🐥🐦🐧🐸🐊🐢🐍🐲🐉🐳🐋🐬🐟🐠🐡🐙🐚🐌🐛🐜🐝🐞💐🌸💮🌹🌺🌻🌼🌷🌱🌲🌳🌴🌵🌾🌿🍀🍁🍂🍃🌍🌎🌏🌐🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜☀🌝🌞⭐🌟🌠☁⛅☔⚡❄🔥💧🌊💩🍇🍈🍉🍊🍋🍌🍍🍎🍏🍐🍑🍒🍓🍅🍆🌽🍄🌰🍞🍖🍗🍔🍟🍕🍳🍲🍱🍘🍙🍚🍛🍜🍝🍠🍢🍣🍤🍥🍡🍦🍧🍨🍩🍪🎂🍰🍫🍬🍭🍮🍯🍼☕🍵🍶🍷🍸🍹🍺🍻🍴';
var array = stringToArray(emojis);
if (typeof pool === 'string') { // emoji("😀😁😂"), emoji("😀😂", 2), emoji("😀😂", 2, 3)
array = stringToArray(pool);
}
else if (typeof pool === 'number') { // emoji(2), emoji(2, 3)
max = min;
min = pool;
}
if (min === undefined || min < 2) { // emoji("😀😁😂"), emoji()
return pick(array); // pick(['1', '2']) => "2", pick(['1', '2'], 1) => "2"
}
return pick(array, min, max).join('');
};
// 随机生成一句标题,其中每个单词的首字母大写。
var title = function (min, max) {
var len = _range(3, 7, min, max);
var result = [];
for (var i = 0; i < len; i++) {
result.push(capitalize(word()));
}
return result.join(' ');
};
// 随机生成一句中文标题。
var ctitle = function (min, max) {
var len = _range(3, 7, min, max);
var result = [];
for (var i = 0; i < len; i++) {
result.push(cword());
}
return result.join('');
};
var text = /*#__PURE__*/Object.freeze({
__proto__: null,
paragraph: paragraph,
cparagraph: cparagraph,
sentence: sentence,
csentence: csentence,
word: word,
cword: cword,
emoji: emoji,
title: title,
ctitle: ctitle
});
// 随机生成一个常见的英文名。
var first = function () {
var male = [
"James", "John", "Robert", "Michael", "William",
"David", "Richard", "Charles", "Joseph", "Thomas",
"Christopher", "Daniel", "Paul", "Mark", "Donald",
"George", "Kenneth", "Steven", "Edward", "Brian",
"Ronald", "Anthony", "Kevin", "Jason", "Matthew",
"Gary", "Timothy", "Jose", "Larry", "Jeffrey",
"Frank", "Scott", "Eric"
];
var female = [
"Mary", "Patricia", "Linda", "Barbara", "Elizabeth",
"Jennifer", "Maria", "Susan", "Margaret", "Dorothy",
"Lisa", "Nancy", "Karen", "Betty", "Helen",
"Sandra", "Donna", "Carol", "Ruth", "Sharon",
"Michelle", "Laura", "Sarah", "Kimberly", "Deborah",
"Jessica", "Shirley", "Cynthia", "Angela", "Melissa",
"Brenda", "Amy", "Anna"
];
return pick(__spreadArrays(male, female));
};
// 随机生成一个常见的英文姓。
var last = function () {
var names = [
"Smith", "Johnson", "Williams", "Brown", "Jones",
"Miller", "Davis", "Garcia", "Rodriguez", "Wilson",
"Martinez", "Anderson", "Taylor", "Thomas", "Hernandez",
"Moore", "Martin", "Jackson", "Thompson", "White",
"Lopez", "Lee", "Gonzalez", "Harris", "Clark",
"Lewis", "Robinson", "Walker", "Perez", "Hall",
"Young", "Allen"
];
return pick(names);
};
// 随机生成一个常见的英文姓名。
var name = function (middle) {
if (middle === void 0) { middle = false; }
return first() + ' ' + (middle ? first() + ' ' : '') + last();
};
// 随机生成一个常见的中文姓。
// [世界常用姓氏排行](http://baike.baidu.com/view/1719115.htm)
// [玄派网 - 网络小说创作辅助平台](http://xuanpai.sinaapp.com/)
var cfirst = function () {
var names = [
"王", "李", "张", "刘", "陈", "杨", "赵", "黄",
"周", "吴", "徐", "孙", "胡", "朱", "高", "林",
"何", "郭", "马", "罗", "梁", "宋", "郑", "谢",
"韩", "唐", "冯", "于", "董", "萧", "程", "曹",
"袁", "邓", "许", "傅", "沈", "曾", "彭", "吕",
"苏", "卢", "蒋", "蔡", "贾", "丁", "魏", "薛",
"叶", "阎", "余", "潘", "杜", "戴", "夏", "锺",
"汪", "田", "任", "姜", "范", "方", "石", "姚",
"谭", "廖", "邹", "熊", "金", "陆", "郝", "孔",
"白", "崔", "康", "毛", "邱", "秦", "江", "史",
"顾", "侯", "邵", "孟", "龙", "万", "段", "雷",
"钱", "汤", "尹", "黎", "易", "常", "武", "乔",
"贺", "赖", "龚", "文"
];
return pick(names);
};
// 随机生成一个常见的中文名。
// [中国最常见名字前50名_三九算命网](http://www.name999.net/xingming/xingshi/20131004/48.html)
var clast = function () {
var names = [
"伟", "芳", "娜", "秀英", "敏", "静", "丽", "强",
"磊", "军", "洋", "勇", "艳", "杰", "娟", "涛",
"明", "超", "秀兰", "霞", "平", "刚", "桂英"
];
return pick(names);
};
// 随机生成一个常见的中文姓名。
var cname = function () {
return cfirst() + clast();
};
var name$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
first: first,
last: last,
name: name,
cfirst: cfirst,
clast: clast,
cname: cname
});
// 随机生成一个 URL。
var url = function (_protocol, host) {
if (_protocol === void 0) { _protocol = protocol(); }
if (host === void 0) { host = domain(); }
return _protocol + "://" + host + "/" + word();
};
// 随机生成一个 URL 协议。
var protocol = function () {
// 协议簇
var protocols = [
'http', 'ftp', 'gopher', 'mailto', 'mid', 'cid', 'news', 'nntp',
'prospero', 'telnet', 'rlogin', 'tn3270', 'wais'
];
return pick(protocols);
};
// 随机生成一个域名。
var domain = function (_tld) {
if (_tld === void 0) { _tld = tld(); }
return word() + '.' + _tld;
};
// 随机生成一个顶级域名。
// [域名后缀大全](http://www.163ns.com/zixun/post/4417.html)
var tld = function () {
var tlds = (
// 域名后缀
'com net org edu gov int mil cn ' +
// 国内域名
'com.cn net.cn gov.cn org.cn ' +
// 中文国内域名
'中国 中国互联.公司 中国互联.网络 ' +
// 新国际域名
'tel biz cc tv info name hk mobi asia cd travel pro museum coop aero ' +
// 世界各国域名后缀
'ad ae af ag ai al am an ao aq ar as at au aw az ba bb bd be bf bg bh bi bj bm bn bo br bs bt bv bw by bz ca cc cf cg ch ci ck cl cm cn co cq cr cu cv cx cy cz de dj dk dm do dz ec ee eg eh es et ev fi fj fk fm fo fr ga gb gd ge gf gh gi gl gm gn gp gr gt gu gw gy hk hm hn hr ht hu id ie il in io iq ir is it jm jo jp ke kg kh ki km kn kp kr kw ky kz la lb lc li lk lr ls lt lu lv ly ma mc md mg mh ml mm mn mo mp mq mr ms mt mv mw mx my mz na nc ne nf ng ni nl no np nr nt nu nz om qa pa pe pf pg ph pk pl pm pn pr pt pw py re ro ru rw sa sb sc sd se sg sh si sj sk sl sm sn so sr st su sy sz tc td tf tg th tj tk tm tn to tp tr tt tv tw tz ua ug uk us uy va vc ve vg vn vu wf ws ye yu za zm zr zw').split(' ');
return pick(tlds);
};
// 随机生成一个邮件地址。
var email = function (_domain) {
if (_domain === void 0) { _domain = domain(); }
return character('lower') + '.' + word() + '@' + _domain;
};
// 随机生成一个 IP 地址。
var ip = function () {
return natural(0, 255) + '.' +
natural(0, 255) + '.' +
natural(0, 255) + '.' +
natural(0, 255);
};
var web = /*#__PURE__*/Object.freeze({
__proto__: null,
url: url,
protocol: protocol,
domain: domain,
tld: tld,
email: email,
ip: ip
});
var location$1 = {
"110000": {
code: "110000",
name: "北京市",
cities: {
"110000": {
code: "110000",
name: "北京市",
districts: {
"110101": "东城区",
"110102": "西城区",
"110105": "朝阳区",
"110106": "丰台区",
"110107": "石景山区",
"110108": "海淀区",
"110109": "门头沟区",
"110111": "房山区",
"110112": "通州区",
"110113": "顺义区",
"110114": "昌平区",
"110115": "大兴区",
"110116": "怀柔区",
"110117": "平谷区",
"110118": "密云区",
"110119": "延庆区"
}
}
}
},
"120000": {
code: "120000",
name: "天津市",
cities: {
"120000": {
code: "120000",
name: "天津市",
districts: {
"120101": "和平区",
"120102": "河东区",
"120103": "河西区",
"120104": "南开区",
"120105": "河北区",
"120106": "红桥区",
"120110": "东丽区",
"120111": "西青区",
"120112": "津南区",
"120113": "北辰区",
"120114": "武清区",
"120115": "宝坻区",
"120116": "滨海新区",
"120117": "宁河区",
"120118": "静海区",
"120119": "蓟州区"
}
}
}
},
"130000": {
code: "130000",
name: "河北省",
cities: {
"130100": {
code: "130100",
name: "石家庄市",
districts: {
"130102": "长安区",
"130104": "桥西区",
"130105": "新华区",
"130107": "井陉矿区",
"130108": "裕华区",
"130109": "藁城区",
"130110": "鹿泉区",
"130111": "栾城区",
"130121": "井陉县",
"130123": "正定县",
"130125": "行唐县",
"130126": "灵寿县",
"130127": "高邑县",
"130128": "深泽县",
"130129": "赞皇县",
"130130": "无极县",
"130131": "平山县",
"130132": "元氏县",
"130133": "赵县",
"130181": "辛集市",
"130183": "晋州市",
"130184": "新乐市"
}
},
"130200": {
code: "130200",
name: "唐山市",
districts: {
"130202": "路南区",
"130203": "路北区",
"130204": "古冶区",
"130205": "开平区",
"130207": "丰南区",
"130208": "丰润区",
"130209": "曹妃甸区",
"130224": "滦南县",
"130225": "乐亭县",
"130227": "迁西县",
"130229": "玉田县",
"130281": "遵化市",
"130283": "迁安市",
"130284": "滦州市"
}
},
"130300": {
code: "130300",
name: "秦皇岛市",
districts: {
"130302": "海港区",
"130303": "山海关区",
"130304": "北戴河区",
"130306": "抚宁区",
"130321": "青龙满族自治县",
"130322": "昌黎县",
"130324": "卢龙县"
}
},
"130400": {
code: "130400",
name: "邯郸市",
districts: {
"130402": "邯山区",
"130403": "丛台区",
"130404": "复兴区",
"130406": "峰峰矿区",
"130407": "肥乡区",
"130408": "永年区",
"130423": "临漳县",
"130424": "成安县",
"130425": "大名县",
"130426": "涉县",
"130427": "磁县",
"130430": "邱县",
"130431": "鸡泽县",
"130432": "广平县",
"130433": "馆陶县",
"130434": "魏县",
"130435": "曲周县",
"130481": "武安市"
}
},
"130500": {
code: "130500",
name: "邢台市",
districts: {
"130502": "桥东区",
"130503": "桥西区",
"130521": "邢台县",
"130522": "临城县",
"130523": "内丘县",
"130524": "柏乡县",
"130525": "隆尧县",
"130526": "任县",
"130527": "南和县",
"130528": "宁晋县",
"130529": "巨鹿县",
"130530": "新河县",
"130531": "广宗县",
"130532": "平乡县",
"130533": "威县",
"130534": "清河县",
"130535": "临西县",
"130581": "南宫市",
"130582": "沙河市"
}
},
"130600": {
code: "130600",
name: "保定市",
districts: {
"130602": "竞秀区",
"130606": "莲池区",
"130607": "满城区",
"130608": "清苑区",
"130609": "徐水区",
"130623": "涞水县",
"130624": "阜平县",
"130626": "定兴县",
"130627": "唐县",
"130628": "高阳县",
"130629": "容城县",
"130630": "涞源县",
"130631": "望都县",
"130632": "安新县",
"130633": "易县",
"130634": "曲阳县",
"130635": "蠡县",
"130636": "顺平县",
"130637": "博野县",
"130638": "雄县",
"130681": "涿州市",
"130682": "定州市",
"130683": "安国市",
"130684": "高碑店市"
}
},
"130700": {
code: "130700",
name: "张家口市",
districts: {
"130702": "桥东区",
"130703": "桥西区",
"130705": "宣化区",
"130706": "下花园区",
"130708": "万全区",
"130709": "崇礼区",
"130722": "张北县",
"130723": "康保县",
"130724": "沽源县",
"130725": "尚义县",
"130726": "蔚县",
"130727": "阳原县",
"130728": "怀安县",
"130730": "怀来县",
"130731": "涿鹿县",
"130732": "赤城县"
}
},
"130800": {
code: "130800",
name: "承德市",
districts: {
"130802": "双桥区",
"130803": "双滦区",
"130804": "鹰手营子矿区",
"130821": "承德县",
"130822": "兴隆县",
"130824": "滦平县",
"130825": "隆化县",
"130826": "丰宁满族自治县",
"130827": "宽城满族自治县",
"130828": "围场满族蒙古族自治县",
"130881": "平泉市"
}
},
"130900": {
code: "130900",
name: "沧州市",
districts: {
"130902": "新华区",
"130903": "运河区",
"130921": "沧县",
"130922": "青县",
"130923": "东光县",
"130924": "海兴县",
"130925": "盐山县",
"130926": "肃宁县",
"130927": "南皮县",
"130928": "吴桥县",
"130929": "献县",
"130930": "孟村回族自治县",
"130981": "泊头市",
"130982": "任丘市",
"130983": "黄骅市",
"130984": "河间市"
}
},
"131000": {
code: "131000",
name: "廊坊市",
districts: {
"131002": "安次区",
"131003": "广阳区",
"131022": "固安县",
"131023": "永清县",
"131024": "香河县",
"131025": "大城县",
"131026": "文安县",
"131028": "大厂回族自治县",
"131081": "霸州市",
"131082": "三河市"
}
},
"131100": {
code: "131100",
name: "衡水市",
districts: {
"131102": "桃城区",
"131103": "冀州区",
"131121": "枣强县",
"131122": "武邑县",
"131123": "武强县",
"131124": "饶阳县",
"131125": "安平县",
"131126": "故城县",
"131127": "景县",
"131128": "阜城县",
"131182": "深州市"
}
}
}
},
"140000": {
code: "140000",
name: "山西省",
cities: {
"140100": {
code: "140100",
name: "太原市",
districts: {
"140105": "小店区",
"140106": "迎泽区",
"140107": "杏花岭区",
"140108": "尖草坪区",
"140109": "万柏林区",
"140110": "晋源区",
"140121": "清徐县",
"140122": "阳曲县",
"140123": "娄烦县",
"140181": "古交市"
}
},
"140200": {
code: "140200",
name: "大同市",
districts: {
"140212": "新荣区",
"140213": "平城区",
"140214": "云冈区",
"140215": "云州区",
"140221": "阳高县",
"140222": "天镇县",
"140223": "广灵县",
"140224": "灵丘县",
"140225": "浑源县",
"140226": "左云县"
}
},
"140300": {
code: "140300",
name: "阳泉市",
districts: {
"140302": "城区",
"140303": "矿区",
"140311": "郊区",
"140321": "平定县",
"140322": "盂县"
}
},
"140400": {
code: "140400",
name: "长治市",
districts: {
"140403": "潞州区",
"140404": "上党区",
"140405": "屯留区",
"140406": "潞城区",
"140423": "襄垣县",
"140425": "平顺县",
"140426": "黎城县",
"140427": "壶关县",
"140428": "长子县",
"140429": "武乡县",
"140430": "沁县",
"140431": "沁源县"
}
},
"140500": {
code: "140500",
name: "晋城市",
districts: {
"140502": "城区",
"140521": "沁水县",
"140522": "阳城县",
"140524": "陵川县",
"140525": "泽州县",
"140581": "高平市"
}
},
"140600": {
code: "140600",
name: "朔州市",
districts: {
"140602": "朔城区",
"140603": "平鲁区",
"140621": "山阴县",
"140622": "应县",
"140623": "右玉县",
"140681": "怀仁市"
}
},
"140700": {
code: "140700",
name: "晋中市",
districts: {
"140702": "榆次区",
"140721": "榆社县",
"140722": "左权县",
"140723": "和顺县",
"140724": "昔阳县",
"140725": "寿阳县",
"140726": "太谷县",
"140727": "祁县",
"140728": "平遥县",
"140729": "灵石县",
"140781": "介休市"
}
},
"140800": {
code: "140800",
name: "运城市",
districts: {
"140802": "盐湖区",
"140821": "临猗县",
"140822": "万荣县",
"140823": "闻喜县",
"140824": "稷山县",
"140825": "新绛县",
"140826": "绛县",
"140827": "垣曲县",
"140828": "夏县",
"140829": "平陆县",
"140830": "芮城县",
"140881": "永济市",
"140882": "河津市"
}
},
"140900": {
code: "140900",
name: "忻州市",
districts: {
"140902": "忻府区",
"140921": "定襄县",
"140922": "五台县",
"140923": "代县",
"140924": "繁峙县",
"140925": "宁武县",
"140926": "静乐县",
"140927": "神池县",
"140928": "五寨县",
"140929": "岢岚县",
"140930": "河曲县",
"140931": "保德县",
"140932": "偏关县",
"140981": "原平市"
}
},
"141000": {
code: "141000",
name: "临汾市",
districts: {
"141002": "尧都区",
"141021": "曲沃县",
"141022": "翼城县",
"141023": "襄汾县",
"141024": "洪洞县",
"141025": "古县",
"141026": "安泽县",
"141027": "浮山县",
"141028": "吉县",
"141029": "乡宁县",
"141030": "大宁县",
"141031": "隰县",
"141032": "永和县",
"141033": "蒲县",
"141034": "汾西县",
"141081": "侯马市",
"141082": "霍州市"
}
},
"141100": {
code: "141100",
name: "吕梁市",
districts: {
"141102": "离石区",
"141121": "文水县",
"141122": "交城县",
"141123": "兴县",
"141124": "临县",
"141125": "柳林县",
"141126": "石楼县",
"141127": "岚县",
"141128": "方山县",
"141129": "中阳县",
"141130": "交口县",
"141181": "孝义市",
"141182": "汾阳市"
}
}
}
},
"150000": {
code: "150000",
name: "内蒙古自治区",
cities: {
"150100": {
code: "150100",
name: "呼和浩特市",
districts: {
"150102": "新城区",
"150103": "回民区",
"150104": "玉泉区",
"150105": "赛罕区",
"150121": "土默特左旗",
"150122": "托克托县",
"150123": "和林格尔县",
"150124": "清水河县",
"150125": "武川县"
}
},
"150200": {
code: "150200",
name: "包头市",
districts: {
"150202": "东河区",
"150203": "昆都仑区",
"150204": "青山区",
"150205": "石拐区",
"150206": "白云鄂博矿区",
"150207": "九原区",
"150221": "土默特右旗",
"150222": "固阳县",
"150223": "达尔罕茂明安联合旗"
}
},
"150300": {
code: "150300",
name: "乌海市",
districts: {
"150302": "海勃湾区",
"150303": "海南区",
"150304": "乌达区"
}
},
"150400": {
code: "150400",
name: "赤峰市",
districts: {
"150402": "红山区",
"150403": "元宝山区",
"150404": "松山区",
"150421": "阿鲁科尔沁旗",
"150422": "巴林左旗",
"150423": "巴林右旗",
"150424": "林西县",
"150425": "克什克腾旗",
"150426": "翁牛特旗",
"150428": "喀喇沁旗",
"150429": "