Files
feishu_approval_design/scripts/build-address-regions.js
2026-06-11 15:27:52 +08:00

425 lines
26 KiB
JavaScript

/* eslint-disable */
const fs = require('fs');
const path = require('path');
function mkTree(stateMap) {
const t = {};
Object.keys(stateMap).forEach(function (st) {
t[st] = {};
stateMap[st].forEach(function (c) { t[st][c] = ['—']; });
});
return t;
}
function mkFixed(fixedRegion, cities) {
const t = {};
t[fixedRegion] = {};
Object.keys(cities).forEach(function (city) {
t[fixedRegion][city] = cities[city];
});
return t;
}
function mkFlat(cities) {
const t = {};
cities.forEach(function (c) { t[c] = ['—']; });
return t;
}
const US_STATES = {
Alabama: ['Birmingham', 'Montgomery', 'Mobile', 'Huntsville', 'Tuscaloosa'],
Alaska: ['Anchorage', 'Fairbanks', 'Juneau', 'Sitka', 'Ketchikan'],
Arizona: ['Phoenix', 'Tucson', 'Mesa', 'Chandler', 'Scottsdale'],
Arkansas: ['Little Rock', 'Fort Smith', 'Fayetteville', 'Springdale', 'Jonesboro'],
California: ['Los Angeles', 'San Francisco', 'San Diego', 'San Jose', 'Sacramento', 'Oakland', 'Fresno', 'Long Beach'],
Colorado: ['Denver', 'Colorado Springs', 'Aurora', 'Fort Collins', 'Lakewood'],
Connecticut: ['Bridgeport', 'New Haven', 'Hartford', 'Stamford', 'Waterbury'],
Delaware: ['Wilmington', 'Dover', 'Newark', 'Middletown', 'Smyrna'],
'District of Columbia': ['Washington'],
Florida: ['Jacksonville', 'Miami', 'Tampa', 'Orlando', 'St. Petersburg', 'Fort Lauderdale'],
Georgia: ['Atlanta', 'Augusta', 'Columbus', 'Savannah', 'Athens'],
Hawaii: ['Honolulu', 'Pearl City', 'Hilo', 'Kailua', 'Waipahu'],
Idaho: ['Boise', 'Meridian', 'Nampa', 'Idaho Falls', 'Pocatello'],
Illinois: ['Chicago', 'Aurora', 'Naperville', 'Joliet', 'Rockford', 'Springfield'],
Indiana: ['Indianapolis', 'Fort Wayne', 'Evansville', 'South Bend', 'Carmel'],
Iowa: ['Des Moines', 'Cedar Rapids', 'Davenport', 'Sioux City', 'Iowa City'],
Kansas: ['Wichita', 'Overland Park', 'Kansas City', 'Topeka', 'Olathe'],
Kentucky: ['Louisville', 'Lexington', 'Bowling Green', 'Owensboro', 'Covington'],
Louisiana: ['New Orleans', 'Baton Rouge', 'Shreveport', 'Lafayette', 'Lake Charles'],
Maine: ['Portland', 'Lewiston', 'Bangor', 'South Portland', 'Auburn'],
Maryland: ['Baltimore', 'Frederick', 'Rockville', 'Gaithersburg', 'Bowie'],
Massachusetts: ['Boston', 'Worcester', 'Springfield', 'Cambridge', 'Lowell'],
Michigan: ['Detroit', 'Grand Rapids', 'Warren', 'Sterling Heights', 'Ann Arbor', 'Lansing'],
Minnesota: ['Minneapolis', 'Saint Paul', 'Rochester', 'Duluth', 'Bloomington'],
Mississippi: ['Jackson', 'Gulfport', 'Southaven', 'Hattiesburg', 'Biloxi'],
Missouri: ['Kansas City', 'Saint Louis', 'Springfield', 'Columbia', 'Independence'],
Montana: ['Billings', 'Missoula', 'Great Falls', 'Bozeman', 'Butte'],
Nebraska: ['Omaha', 'Lincoln', 'Bellevue', 'Grand Island', 'Kearney'],
Nevada: ['Las Vegas', 'Henderson', 'Reno', 'North Las Vegas', 'Sparks'],
'New Hampshire': ['Manchester', 'Nashua', 'Concord', 'Dover', 'Rochester'],
'New Jersey': ['Newark', 'Jersey City', 'Paterson', 'Elizabeth', 'Edison', 'Trenton'],
'New Mexico': ['Albuquerque', 'Las Cruces', 'Rio Rancho', 'Santa Fe', 'Roswell'],
'New York': ['New York City', 'Buffalo', 'Rochester', 'Yonkers', 'Syracuse', 'Albany'],
'North Carolina': ['Charlotte', 'Raleigh', 'Greensboro', 'Durham', 'Winston-Salem'],
'North Dakota': ['Fargo', 'Bismarck', 'Grand Forks', 'Minot', 'West Fargo'],
Ohio: ['Columbus', 'Cleveland', 'Cincinnati', 'Toledo', 'Akron', 'Dayton'],
Oklahoma: ['Oklahoma City', 'Tulsa', 'Norman', 'Broken Arrow', 'Lawton'],
Oregon: ['Portland', 'Eugene', 'Salem', 'Gresham', 'Hillsboro'],
Pennsylvania: ['Philadelphia', 'Pittsburgh', 'Allentown', 'Erie', 'Reading', 'Harrisburg'],
'Rhode Island': ['Providence', 'Warwick', 'Cranston', 'Pawtucket', 'East Providence'],
'South Carolina': ['Charleston', 'Columbia', 'North Charleston', 'Mount Pleasant', 'Greenville'],
'South Dakota': ['Sioux Falls', 'Rapid City', 'Aberdeen', 'Brookings', 'Watertown'],
Tennessee: ['Nashville', 'Memphis', 'Knoxville', 'Chattanooga', 'Clarksville'],
Texas: ['Houston', 'San Antonio', 'Dallas', 'Austin', 'Fort Worth', 'El Paso', 'Arlington', 'Corpus Christi'],
Utah: ['Salt Lake City', 'West Valley City', 'Provo', 'West Jordan', 'Orem'],
Vermont: ['Burlington', 'South Burlington', 'Rutland', 'Barre', 'Montpelier'],
Virginia: ['Virginia Beach', 'Norfolk', 'Chesapeake', 'Richmond', 'Newport News', 'Alexandria'],
Washington: ['Seattle', 'Spokane', 'Tacoma', 'Vancouver', 'Bellevue', 'Olympia'],
'West Virginia': ['Charleston', 'Huntington', 'Morgantown', 'Parkersburg', 'Wheeling'],
Wisconsin: ['Milwaukee', 'Madison', 'Green Bay', 'Kenosha', 'Racine'],
Wyoming: ['Cheyenne', 'Casper', 'Laramie', 'Gillette', 'Rock Springs']
};
const CHINA = require('./china-regions-data.json');
const HK = mkFixed('香港特别行政区', {
'香港岛': ['中西区', '湾仔区', '东区', '南区'],
'九龙': ['油尖旺区', '深水埗区', '九龙城区', '黄大仙区', '观塘区'],
'新界': ['荃湾区', '屯门区', '元朗区', '北区', '大埔区', '沙田区', '西贡区', '葵青区', '离岛区']
});
const MO = mkFixed('澳门特别行政区', {
'花地玛堂区': ['—'], '花王堂区': ['—'], '望德堂区': ['—'], '大堂区': ['—'],
'风顺堂区': ['—'], '嘉模堂区': ['—'], '圣方济各堂区': ['—'], '路氹填海区': ['—']
});
const TW = mkFixed('台湾省', {
'台北市': ['中正区', '大同区', '中山区', '松山区', '大安区', '万华区', '信义区', '士林区', '北投区', '内湖区', '南港区', '文山区'],
'新北市': ['板桥区', '三重区', '中和区', '永和区', '新庄区', '新店区', '树林区', '莺歌区', '三峡区', '淡水区', '汐止区', '瑞芳区', '土城区', '芦洲区', '五股区', '泰山区', '林口区'],
'桃园市': ['桃园区', '中坜区', '平镇区', '八德区', '杨梅区', '芦竹区', '大溪区', '龙潭区', '龟山区', '大园区', '观音区', '新屋区', '复兴区'],
'台中市': ['中区', '东区', '南区', '西区', '北区', '北屯区', '西屯区', '南屯区', '太平区', '大里区', '雾峰区', '乌日区', '丰原区', '后里区', '石冈区', '东势区', '和平区', '新社区', '潭子区', '大雅区', '神冈区', '大肚区', '沙鹿区', '龙井区', '梧栖区', '清水区', '大甲区', '外埔区', '大安区'],
'台南市': ['中西区', '东区', '南区', '北区', '安平区', '安南区', '永康区', '归仁区', '新化区', '左镇区', '玉井区', '楠西区', '南化区', '仁德区', '关庙区', '龙崎区', '官田区', '麻豆区', '佳里区', '西港区', '七股区', '将军区', '学甲区', '北门区', '新营区', '后壁区', '白河区', '东山区', '六甲区', '下营区', '柳营区', '盐水区', '大内区', '山上区', '新市区', '安定区'],
'高雄市': ['新兴区', '前金区', '苓雅区', '盐埕区', '鼓山区', '旗津区', '前镇区', '三民区', '楠梓区', '小港区', '左营区', '仁武区', '大社区', '冈山区', '路竹区', '阿莲区', '田寮区', '燕巢区', '桥头区', '梓官区', '弥陀区', '永安区', '湖内区', '凤山区', '大寮区', '林园区', '鸟松区', '大树区', '旗山区', '美浓区', '六龟区', '内门区', '杉林区', '甲仙区', '桃源区', '那玛夏区', '茂林区', '茄萣区'],
'基隆市': ['仁爱区', '信义区', '中正区', '中山区', '安乐区', '暖暖区', '七堵区'],
'新竹市': ['东区', '北区', '香山区'],
'嘉义市': ['东区', '西区'],
'新竹县': ['竹北市', '湖口乡', '新丰乡', '新埔镇', '关西镇', '芎林乡', '宝山乡', '竹东镇', '五峰乡', '横山乡', '尖石乡', '北埔乡', '峨眉乡'],
'苗栗县': ['苗栗市', '苑里镇', '通霄镇', '竹南镇', '头份市', '后龙镇', '卓兰镇', '大湖乡', '公馆乡', '铜锣乡', '南庄乡', '头屋乡', '三义乡', '西湖乡', '造桥乡', '三湾乡', '狮潭乡', '泰安乡'],
'彰化县': ['彰化市', '鹿港镇', '和美镇', '线西乡', '伸港乡', '福兴乡', '秀水乡', '花坛乡', '芬园乡', '员林镇', '溪湖镇', '田中镇', '大村乡', '埔盐乡', '埔心乡', '永靖乡', '社头乡', '二水乡', '北斗镇', '埤头乡', '溪州乡', '竹塘乡', '大城乡', '芳苑乡', '二林镇'],
'南投县': ['南投市', '埔里镇', '草屯镇', '竹山镇', '集集镇', '名间乡', '鹿谷乡', '中寮乡', '鱼池乡', '国姓乡', '水里乡', '信义乡', '仁爱乡'],
'云林县': ['斗六市', '斗南镇', '虎尾镇', '西螺镇', '土库镇', '北港镇', '古坑乡', '大埤乡', '莿桐乡', '林内乡', '二仑乡', '仑背乡', '麦寮乡', '东势乡', '褒忠乡', '台西乡', '元长乡', '四湖乡', '口湖乡', '水林乡'],
'嘉义县': ['太保市', '朴子市', '布袋镇', '大林镇', '民雄乡', '溪口乡', '新港乡', '六脚乡', '东石乡', '义竹乡', '鹿草乡', '水上乡', '中埔乡', '竹崎乡', '梅山乡', '番路乡', '大埔乡', '阿里山乡'],
'屏东县': ['屏东市', '潮州镇', '东港镇', '恒春镇', '万丹乡', '长治乡', '麟洛乡', '九如乡', '里港乡', '盐埔乡', '高树乡', '万峦乡', '内埔乡', '竹田乡', '新埤乡', '枋寮乡', '新园乡', '崁顶乡', '林边乡', '南州乡', '佳冬乡', '琉球乡', '车城乡', '满州乡', '枋山乡', '三地门乡', '雾台乡', '玛家乡', '泰武乡', '来义乡', '春日乡', '狮子乡', '牡丹乡'],
'宜兰县': ['宜兰市', '罗东镇', '苏澳镇', '头城镇', '礁溪乡', '壮围乡', '员山乡', '冬山乡', '五结乡', '三星乡', '大同乡', '南澳乡'],
'花莲县': ['花莲市', '凤林镇', '玉里镇', '新城乡', '吉安乡', '寿丰乡', '光复乡', '丰滨乡', '瑞穗乡', '富里乡', '秀林乡', '万荣乡', '卓溪乡'],
'台东县': ['台东市', '成功镇', '关山镇', '卑南乡', '鹿野乡', '池上乡', '东河乡', '长滨乡', '太麻里乡', '大武乡', '绿岛乡', '海端乡', '延平乡', '金峰乡', '达仁乡', '兰屿乡'],
'澎湖县': ['马公市', '湖西乡', '白沙乡', '西屿乡', '望安乡', '七美乡'],
'金门县': ['金城镇', '金湖镇', '金沙镇', '金宁乡', '烈屿乡', '乌坵乡'],
'连江县': ['南竿乡', '北竿乡', '莒光乡', '东引乡']
});
const JP = mkTree({
Hokkaido: ['Sapporo', 'Asahikawa', 'Hakodate', 'Kushiro', 'Obihiro'],
Aomori: ['Aomori', 'Hachinohe', 'Hirosaki'],
Iwate: ['Morioka', 'Ofunato', 'Hanamaki'],
Miyagi: ['Sendai', 'Ishinomaki', 'Osaki'],
Akita: ['Akita', 'Yokote', 'Oga'],
Yamagata: ['Yamagata', 'Tsuruoka', 'Sakata'],
Fukushima: ['Fukushima', 'Koriyama', 'Iwaki'],
Ibaraki: ['Mito', 'Tsukuba', 'Hitachi'],
Tochigi: ['Utsunomiya', 'Ashikaga', 'Oyama'],
Gunma: ['Maebashi', 'Takasaki', 'Ota'],
Saitama: ['Saitama', 'Kawagoe', 'Kawaguchi'],
Chiba: ['Chiba', 'Funabashi', 'Ichikawa'],
Tokyo: ['Shinjuku', 'Shibuya', 'Minato', 'Chiyoda', 'Setagaya'],
Kanagawa: ['Yokohama', 'Kawasaki', 'Sagamihara'],
Niigata: ['Niigata', 'Nagaoka', 'Joetsu'],
Toyama: ['Toyama', 'Takaoka', 'Uozu'],
Ishikawa: ['Kanazawa', 'Komatsu', 'Hakusan'],
Fukui: ['Fukui', 'Sakai', 'Obama'],
Yamanashi: ['Kofu', 'Fujiyoshida', 'Kai'],
Nagano: ['Nagano', 'Matsumoto', 'Ueda'],
Gifu: ['Gifu', 'Ogaki', 'Takayama'],
Shizuoka: ['Shizuoka', 'Hamamatsu', 'Numazu'],
Aichi: ['Nagoya', 'Toyohashi', 'Okazaki'],
Mie: ['Tsu', 'Yokkaichi', 'Suzuka'],
Shiga: ['Otsu', 'Hikone', 'Kusatsu'],
Kyoto: ['Kyoto', 'Uji', 'Maizuru'],
Osaka: ['Osaka', 'Sakai', 'Higashiosaka'],
Hyogo: ['Kobe', 'Himeji', 'Nishinomiya'],
Nara: ['Nara', 'Kashihara', 'Ikoma'],
Wakayama: ['Wakayama', 'Tanabe', 'Kinokawa'],
Tottori: ['Tottori', 'Yonago', 'Kurayoshi'],
Shimane: ['Matsue', 'Izumo', 'Hamada'],
Okayama: ['Okayama', 'Kurashiki', 'Tsuyama'],
Hiroshima: ['Hiroshima', 'Fukuyama', 'Kure'],
Yamaguchi: ['Yamaguchi', 'Shimonoseki', 'Ube'],
Tokushima: ['Tokushima', 'Naruto', 'Anan'],
Kagawa: ['Takamatsu', 'Marugame', 'Sakaide'],
Ehime: ['Matsuyama', 'Imabari', 'Uwajima'],
Kochi: ['Kochi', 'Nankoku', 'Shimanto'],
Fukuoka: ['Fukuoka', 'Kitakyushu', 'Kurume'],
Saga: ['Saga', 'Karatsu', 'Tosu'],
Nagasaki: ['Nagasaki', 'Sasebo', 'Isahaya'],
Kumamoto: ['Kumamoto', 'Yatsushiro', 'Amakusa'],
Oita: ['Oita', 'Beppu', 'Nakatsu'],
Miyazaki: ['Miyazaki', 'Miyakonojo', 'Nobeoka'],
Kagoshima: ['Kagoshima', 'Kanoya', 'Satsumasendai'],
Okinawa: ['Naha', 'Okinawa', 'Uruma']
});
const KR = mkTree({
Seoul: ['Jongno-gu', 'Jung-gu', 'Gangnam-gu', 'Mapo-gu', 'Seocho-gu'],
Busan: ['Jung-gu', 'Seo-gu', 'Haeundae-gu', 'Saha-gu'],
Daegu: ['Jung-gu', 'Dong-gu', 'Seo-gu'],
Incheon: ['Jung-gu', 'Nam-gu', 'Yeonsu-gu'],
Gwangju: ['Dong-gu', 'Seo-gu', 'Nam-gu'],
Daejeon: ['Jung-gu', 'Dong-gu', 'Seo-gu'],
Ulsan: ['Jung-gu', 'Nam-gu', 'Dong-gu'],
Sejong: ['Sejong'],
Gyeonggi: ['Suwon', 'Seongnam', 'Goyang', 'Yongin', 'Bucheon'],
Gangwon: ['Chuncheon', 'Wonju', 'Gangneung'],
'North Chungcheong': ['Cheongju', 'Chungju', 'Jecheon'],
'South Chungcheong': ['Daejeon', 'Cheonan', 'Asan'],
'North Jeolla': ['Jeonju', 'Iksan', 'Gunsan'],
'South Jeolla': ['Gwangju', 'Mokpo', 'Suncheon'],
'North Gyeongsang': ['Pohang', 'Gyeongju', 'Gimhae'],
'South Gyeongsang': ['Changwon', 'Jinju', 'Geoje'],
Jeju: ['Jeju', 'Seogwipo']
});
const CA = mkTree({
Alberta: ['Calgary', 'Edmonton', 'Red Deer', 'Lethbridge'],
'British Columbia': ['Vancouver', 'Victoria', 'Surrey', 'Burnaby', 'Kelowna'],
Manitoba: ['Winnipeg', 'Brandon', 'Steinbach'],
'New Brunswick': ['Moncton', 'Saint John', 'Fredericton'],
'Newfoundland and Labrador': ["St. John's", 'Corner Brook', 'Mount Pearl'],
'Nova Scotia': ['Halifax', 'Dartmouth', 'Sydney'],
Ontario: ['Toronto', 'Ottawa', 'Mississauga', 'Hamilton', 'London', 'Kitchener'],
'Prince Edward Island': ['Charlottetown', 'Summerside'],
Quebec: ['Montreal', 'Quebec City', 'Laval', 'Gatineau', 'Sherbrooke'],
Saskatchewan: ['Saskatoon', 'Regina', 'Prince Albert'],
Yukon: ['Whitehorse', 'Dawson City'],
'Northwest Territories': ['Yellowknife', 'Hay River'],
Nunavut: ['Iqaluit', 'Rankin Inlet']
});
const AU = mkTree({
'New South Wales': ['Sydney', 'Newcastle', 'Wollongong', 'Central Coast'],
Victoria: ['Melbourne', 'Geelong', 'Ballarat', 'Bendigo'],
Queensland: ['Brisbane', 'Gold Coast', 'Sunshine Coast', 'Townsville', 'Cairns'],
'Western Australia': ['Perth', 'Fremantle', 'Mandurah', 'Bunbury'],
'South Australia': ['Adelaide', 'Mount Gambier', 'Whyalla'],
Tasmania: ['Hobart', 'Launceston', 'Devonport'],
'Australian Capital Territory': ['Canberra'],
'Northern Territory': ['Darwin', 'Alice Springs', 'Palmerston']
});
const GB = mkTree({
England: ['London', 'Manchester', 'Birmingham', 'Leeds', 'Liverpool', 'Bristol', 'Sheffield'],
Scotland: ['Edinburgh', 'Glasgow', 'Aberdeen', 'Dundee'],
Wales: ['Cardiff', 'Swansea', 'Newport', 'Wrexham'],
'Northern Ireland': ['Belfast', 'Derry', 'Lisburn', 'Newry']
});
const DE = mkTree({
'Baden-Wurttemberg': ['Stuttgart', 'Mannheim', 'Karlsruhe', 'Freiburg'],
Bavaria: ['Munich', 'Nuremberg', 'Augsburg', 'Regensburg'],
Berlin: ['Berlin'],
Brandenburg: ['Potsdam', 'Cottbus', 'Frankfurt (Oder)'],
Bremen: ['Bremen', 'Bremerhaven'],
Hamburg: ['Hamburg'],
Hesse: ['Frankfurt am Main', 'Wiesbaden', 'Darmstadt', 'Kassel'],
'Lower Saxony': ['Hanover', 'Braunschweig', 'Osnabruck', 'Oldenburg'],
'Mecklenburg-Vorpommern': ['Rostock', 'Schwerin', 'Stralsund'],
'North Rhine-Westphalia': ['Cologne', 'Dusseldorf', 'Dortmund', 'Essen', 'Bonn'],
'Rhineland-Palatinate': ['Mainz', 'Ludwigshafen', 'Koblenz', 'Trier'],
Saarland: ['Saarbrucken', 'Neunkirchen', 'Homburg'],
Saxony: ['Dresden', 'Leipzig', 'Chemnitz'],
'Saxony-Anhalt': ['Magdeburg', 'Halle (Saale)', 'Dessau-Rosslau'],
'Schleswig-Holstein': ['Kiel', 'Lubeck', 'Flensburg'],
Thuringia: ['Erfurt', 'Jena', 'Gera', 'Weimar']
});
const FR = mkTree({
'Auvergne-Rhone-Alpes': ['Lyon', 'Grenoble', 'Saint-Etienne', 'Clermont-Ferrand'],
'Bourgogne-Franche-Comte': ['Dijon', 'Besancon'],
Brittany: ['Rennes', 'Brest', 'Nantes'],
'Centre-Val de Loire': ['Orleans', 'Tours', 'Bourges'],
Corsica: ['Ajaccio', 'Bastia'],
'Grand Est': ['Strasbourg', 'Reims', 'Metz', 'Nancy'],
'Hauts-de-France': ['Lille', 'Amiens', 'Roubaix'],
'Ile-de-France': ['Paris', 'Versailles', 'Boulogne-Billancourt', 'Saint-Denis'],
Normandy: ['Rouen', 'Le Havre', 'Caen'],
'Nouvelle-Aquitaine': ['Bordeaux', 'Limoges', 'Poitiers'],
Occitanie: ['Toulouse', 'Montpellier', 'Nimes'],
'Pays de la Loire': ['Nantes', 'Angers', 'Le Mans'],
'Provence-Alpes-Cote dAzur': ['Marseille', 'Nice', 'Toulon', 'Aix-en-Provence']
});
const COUNTRY_META = {
'中国': { lang: 'zh', hasRegion: true, hasDistrict: true },
'中国香港': { lang: 'zh', fixedRegion: '香港特别行政区', hasRegion: true, hasDistrict: true },
'中国澳门': { lang: 'zh', fixedRegion: '澳门特别行政区', hasRegion: true, hasDistrict: false },
'中国台湾': { lang: 'zh', fixedRegion: '台湾省', hasRegion: true, hasDistrict: true },
'美国': { lang: 'en', hasRegion: true, hasDistrict: false },
'日本': { lang: 'en', hasRegion: true, hasDistrict: false },
'韩国': { lang: 'en', hasRegion: true, hasDistrict: false },
'新加坡': { lang: 'en', hasRegion: false, hasDistrict: false },
'马来西亚': { lang: 'en', hasRegion: true, hasDistrict: false },
'泰国': { lang: 'en', hasRegion: true, hasDistrict: false },
'越南': { lang: 'en', hasRegion: true, hasDistrict: false },
'印度': { lang: 'en', hasRegion: true, hasDistrict: false },
'印度尼西亚': { lang: 'en', hasRegion: true, hasDistrict: false },
'菲律宾': { lang: 'en', hasRegion: true, hasDistrict: false },
'英国': { lang: 'en', hasRegion: true, hasDistrict: false },
'法国': { lang: 'en', hasRegion: true, hasDistrict: false },
'德国': { lang: 'en', hasRegion: true, hasDistrict: false },
'意大利': { lang: 'en', hasRegion: true, hasDistrict: false },
'西班牙': { lang: 'en', hasRegion: true, hasDistrict: false },
'荷兰': { lang: 'en', hasRegion: true, hasDistrict: false },
'瑞士': { lang: 'en', hasRegion: true, hasDistrict: false },
'瑞典': { lang: 'en', hasRegion: true, hasDistrict: false },
'挪威': { lang: 'en', hasRegion: true, hasDistrict: false },
'丹麦': { lang: 'en', hasRegion: true, hasDistrict: false },
'芬兰': { lang: 'en', hasRegion: true, hasDistrict: false },
'俄罗斯': { lang: 'en', hasRegion: true, hasDistrict: false },
'波兰': { lang: 'en', hasRegion: true, hasDistrict: false },
'捷克': { lang: 'en', hasRegion: true, hasDistrict: false },
'奥地利': { lang: 'en', hasRegion: true, hasDistrict: false },
'比利时': { lang: 'en', hasRegion: true, hasDistrict: false },
'加拿大': { lang: 'en', hasRegion: true, hasDistrict: false },
'墨西哥': { lang: 'en', hasRegion: true, hasDistrict: false },
'巴西': { lang: 'en', hasRegion: true, hasDistrict: false },
'阿根廷': { lang: 'en', hasRegion: true, hasDistrict: false },
'智利': { lang: 'en', hasRegion: true, hasDistrict: false },
'哥伦比亚': { lang: 'en', hasRegion: true, hasDistrict: false },
'澳大利亚': { lang: 'en', hasRegion: true, hasDistrict: false },
'新西兰': { lang: 'en', hasRegion: true, hasDistrict: false },
'南非': { lang: 'en', hasRegion: true, hasDistrict: false },
'埃及': { lang: 'en', hasRegion: true, hasDistrict: false },
'阿联酋': { lang: 'en', hasRegion: true, hasDistrict: false },
'沙特阿拉伯': { lang: 'en', hasRegion: true, hasDistrict: false },
'以色列': { lang: 'en', hasRegion: true, hasDistrict: false },
'土耳其': { lang: 'en', hasRegion: true, hasDistrict: false },
'其他': { lang: 'en', hasRegion: true, hasDistrict: false }
};
const WORLD_REGIONS = {
'中国': CHINA,
'中国香港': HK,
'中国澳门': MO,
'中国台湾': TW,
'美国': mkTree(US_STATES),
'日本': JP,
'韩国': KR,
'新加坡': mkFlat(['Central Region', 'East Region', 'North Region', 'North-East Region', 'West Region']),
'马来西亚': mkTree({ 'Kuala Lumpur': ['Kuala Lumpur'], Selangor: ['Shah Alam', 'Petaling Jaya'], Penang: ['George Town'], Johor: ['Johor Bahru'] }),
'泰国': mkTree({ Bangkok: ['Bangkok'], ChiangMai: ['Chiang Mai'], Phuket: ['Phuket'] }),
'越南': mkTree({ Hanoi: ['Hanoi'], 'Ho Chi Minh City': ['Ho Chi Minh City'], DaNang: ['Da Nang'] }),
'印度': mkTree({ Delhi: ['New Delhi'], Maharashtra: ['Mumbai', 'Pune'], Karnataka: ['Bengaluru'] }),
'印度尼西亚': mkTree({ Jakarta: ['Central Jakarta', 'South Jakarta'], 'West Java': ['Bandung'], Bali: ['Denpasar'] }),
'菲律宾': mkTree({ 'Metro Manila': ['Manila', 'Quezon City'], Cebu: ['Cebu City'], Davao: ['Davao City'] }),
'英国': GB,
'法国': FR,
'德国': DE,
'意大利': mkTree({ Lazio: ['Rome'], Lombardy: ['Milan'], Veneto: ['Venice'], Tuscany: ['Florence'] }),
'西班牙': mkTree({ Madrid: ['Madrid'], Catalonia: ['Barcelona'], Andalusia: ['Seville'] }),
'荷兰': mkTree({ 'North Holland': ['Amsterdam', 'Haarlem'], 'South Holland': ['Rotterdam', 'The Hague'] }),
'瑞士': mkTree({ Zurich: ['Zurich'], Bern: ['Bern'], Geneva: ['Geneva'] }),
'瑞典': mkTree({ Stockholm: ['Stockholm'], VastraGotaland: ['Gothenburg'], Skane: ['Malmo'] }),
'挪威': mkTree({ Oslo: ['Oslo'], Viken: ['Drammen'], Vestland: ['Bergen'] }),
'丹麦': mkTree({ 'Capital Region': ['Copenhagen'], 'Central Denmark': ['Aarhus'], 'Southern Denmark': ['Odense'] }),
'芬兰': mkTree({ Uusimaa: ['Helsinki'], Pirkanmaa: ['Tampere'], 'Southwest Finland': ['Turku'] }),
'俄罗斯': mkTree({ Moscow: ['Moscow'], 'Saint Petersburg': ['Saint Petersburg'], 'Novosibirsk Oblast': ['Novosibirsk'] }),
'波兰': mkTree({ Masovian: ['Warsaw'], 'Lesser Poland': ['Krakow'], Silesian: ['Katowice'] }),
'捷克': mkTree({ Prague: ['Prague'], 'South Moravian': ['Brno'] }),
'奥地利': mkTree({ Vienna: ['Vienna'], Tyrol: ['Innsbruck'], Styria: ['Graz'] }),
'比利时': mkTree({ Brussels: ['Brussels'], Flanders: ['Antwerp', 'Ghent'], Wallonia: ['Liege', 'Charleroi'] }),
'加拿大': CA,
'墨西哥': mkTree({ 'Mexico City': ['Mexico City'], Jalisco: ['Guadalajara'], 'Nuevo Leon': ['Monterrey'] }),
'巴西': mkTree({ 'Sao Paulo': ['Sao Paulo'], 'Rio de Janeiro': ['Rio de Janeiro'], 'Minas Gerais': ['Belo Horizonte'] }),
'阿根廷': mkTree({ 'Buenos Aires': ['Buenos Aires'], Cordoba: ['Cordoba'], Mendoza: ['Mendoza'] }),
'智利': mkTree({ 'Santiago Metropolitan': ['Santiago'], Valparaiso: ['Valparaiso'], Biobio: ['Concepcion'] }),
'哥伦比亚': mkTree({ Bogota: ['Bogota'], Antioquia: ['Medellin'], Valle: ['Cali'] }),
'澳大利亚': AU,
'新西兰': mkTree({ Auckland: ['Auckland'], Wellington: ['Wellington'], Canterbury: ['Christchurch'] }),
'南非': mkTree({ Gauteng: ['Johannesburg', 'Pretoria'], 'Western Cape': ['Cape Town'], 'KwaZulu-Natal': ['Durban'] }),
'埃及': mkTree({ Cairo: ['Cairo'], Alexandria: ['Alexandria'], Giza: ['Giza'] }),
'阿联酋': mkTree({ Dubai: ['Dubai'], 'Abu Dhabi': ['Abu Dhabi'], Sharjah: ['Sharjah'] }),
'沙特阿拉伯': mkTree({ Riyadh: ['Riyadh'], Makkah: ['Jeddah'], 'Eastern Province': ['Dammam'] }),
'以色列': mkTree({ TelAviv: ['Tel Aviv'], Jerusalem: ['Jerusalem'], Haifa: ['Haifa'] }),
'土耳其': mkTree({ Istanbul: ['Istanbul'], Ankara: ['Ankara'], Izmir: ['Izmir'] }),
'其他': mkTree({ 'Province/State': ['City'] })
};
const ADDRESS_COUNTRIES = Object.keys(COUNTRY_META);
const out = `/* Auto-generated address region data for Feishu-style address conditions */
(function (g) {
var ADDRESS_COUNTRIES = ${JSON.stringify(ADDRESS_COUNTRIES)};
var COUNTRY_META = ${JSON.stringify(COUNTRY_META, null, 2)};
var WORLD_REGIONS = ${JSON.stringify(WORLD_REGIONS)};
function getCountryMeta(country) {
return COUNTRY_META[country] || COUNTRY_META['其他'];
}
function getCountryRegionTree(country) {
return WORLD_REGIONS[country] || WORLD_REGIONS['其他'];
}
function getProvincesForCountry(country) {
var meta = getCountryMeta(country);
if (meta.fixedRegion) return [meta.fixedRegion];
if (!meta.hasRegion) return [];
var tree = getCountryRegionTree(country);
return Object.keys(tree);
}
function getCitiesForCountry(country, province) {
var meta = getCountryMeta(country);
var tree = getCountryRegionTree(country);
if (!meta.hasRegion) return Object.keys(tree);
if (!province) return [];
if (meta.fixedRegion && tree[meta.fixedRegion]) return Object.keys(tree[meta.fixedRegion]);
return tree[province] ? Object.keys(tree[province]) : [];
}
function getDistrictsForCountry(country, province, city) {
var meta = getCountryMeta(country);
if (!meta.hasDistrict) return [];
var tree = getCountryRegionTree(country);
var regionKey = meta.fixedRegion || province;
if (!regionKey || !city) return [];
if (meta.fixedRegion && tree[meta.fixedRegion] && tree[meta.fixedRegion][city]) return tree[meta.fixedRegion][city];
if (tree[regionKey] && tree[regionKey][city]) return tree[regionKey][city];
return [];
}
function applyCountryAddressDefaults(country, addr) {
var meta = getCountryMeta(country);
addr.country = country;
if (meta.fixedRegion) addr.province = meta.fixedRegion;
else if (!meta.hasRegion) addr.province = '';
else if (addr.province && !getProvincesForCountry(country).includes(addr.province)) addr.province = '';
if (addr.city && !getCitiesForCountry(country, addr.province || meta.fixedRegion).includes(addr.city)) addr.city = '';
if (addr.district && !getDistrictsForCountry(country, addr.province, addr.city).includes(addr.district)) addr.district = '';
return addr;
}
g.ADDRESS_COUNTRIES = ADDRESS_COUNTRIES;
g.COUNTRY_META = COUNTRY_META;
g.WORLD_REGIONS = WORLD_REGIONS;
g.getCountryMeta = getCountryMeta;
g.getCountryRegionTree = getCountryRegionTree;
g.getProvincesForCountry = getProvincesForCountry;
g.getCitiesForCountry = getCitiesForCountry;
g.getDistrictsForCountry = getDistrictsForCountry;
g.applyCountryAddressDefaults = applyCountryAddressDefaults;
})(typeof window !== 'undefined' ? window : global);
`;
fs.writeFileSync(path.join(__dirname, '..', 'address-regions.js'), out, 'utf8');
console.log('Wrote address-regions.js', (out.length / 1024).toFixed(1), 'KB');