Browse Source

feat(server): Populate sample product data via CLI

Michael Bromley 7 years ago
parent
commit
42f71b0ee2

+ 8 - 1
server/build/gulpfile.ts

@@ -13,4 +13,11 @@ gulp.task('copy-cli-assets', () => {
     return gulp.src(['../cli/assets/**/*']).pipe(gulp.dest('../dist/cli/assets'));
 });
 
-gulp.task('default', gulp.parallel('copy-schemas', 'copy-email-templates', 'copy-cli-assets'));
+gulp.task('copy-cli-images', () => {
+    return gulp.src(['../mock-data/assets/**/*']).pipe(gulp.dest('../dist/cli/assets/images'));
+});
+
+gulp.task(
+    'default',
+    gulp.parallel(['copy-schemas', 'copy-email-templates', 'copy-cli-assets', 'copy-cli-images']),
+);

+ 249 - 1240
server/cli/assets/initial-data.json

@@ -1,1250 +1,259 @@
 {
     "defaultLanguage": "en",
+    "defaultZone": "Europe",
     "taxRates": [
         { "name": "Standard Tax", "percentage": 20 },
         { "name": "Reduced Tax", "percentage": 10 },
         { "name": "Zero Tax", "percentage": 0 }
     ],
     "countries": [
-        {
-            "name": "Afghanistan",
-            "code": "AF",
-            "zone": "Asia"
-        },
-        {
-            "name": "Åland Islands",
-            "code": "AX",
-            "zone": "Europe"
-        },
-        {
-            "name": "Albania",
-            "code": "AL",
-            "zone": "Europe"
-        },
-        {
-            "name": "Algeria",
-            "code": "DZ",
-            "zone": "Africa"
-        },
-        {
-            "name": "American Samoa",
-            "code": "AS",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Andorra",
-            "code": "AD",
-            "zone": "Europe"
-        },
-        {
-            "name": "Angola",
-            "code": "AO",
-            "zone": "Africa"
-        },
-        {
-            "name": "Anguilla",
-            "code": "AI",
-            "zone": "Americas"
-        },
-        {
-            "name": "Antigua and Barbuda",
-            "code": "AG",
-            "zone": "Americas"
-        },
-        {
-            "name": "Argentina",
-            "code": "AR",
-            "zone": "Americas"
-        },
-        {
-            "name": "Armenia",
-            "code": "AM",
-            "zone": "Asia"
-        },
-        {
-            "name": "Aruba",
-            "code": "AW",
-            "zone": "Americas"
-        },
-        {
-            "name": "Australia",
-            "code": "AU",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Austria",
-            "code": "AT",
-            "zone": "Europe"
-        },
-        {
-            "name": "Azerbaijan",
-            "code": "AZ",
-            "zone": "Asia"
-        },
-        {
-            "name": "Bahamas",
-            "code": "BS",
-            "zone": "Americas"
-        },
-        {
-            "name": "Bahrain",
-            "code": "BH",
-            "zone": "Asia"
-        },
-        {
-            "name": "Bangladesh",
-            "code": "BD",
-            "zone": "Asia"
-        },
-        {
-            "name": "Barbados",
-            "code": "BB",
-            "zone": "Americas"
-        },
-        {
-            "name": "Belarus",
-            "code": "BY",
-            "zone": "Europe"
-        },
-        {
-            "name": "Belgium",
-            "code": "BE",
-            "zone": "Europe"
-        },
-        {
-            "name": "Belize",
-            "code": "BZ",
-            "zone": "Americas"
-        },
-        {
-            "name": "Benin",
-            "code": "BJ",
-            "zone": "Africa"
-        },
-        {
-            "name": "Bermuda",
-            "code": "BM",
-            "zone": "Americas"
-        },
-        {
-            "name": "Bhutan",
-            "code": "BT",
-            "zone": "Asia"
-        },
-        {
-            "name": "Bolivia (Plurinational State of)",
-            "code": "BO",
-            "zone": "Americas"
-        },
-        {
-            "name": "Bonaire, Sint Eustatius and Saba",
-            "code": "BQ",
-            "zone": "Americas"
-        },
-        {
-            "name": "Bosnia and Herzegovina",
-            "code": "BA",
-            "zone": "Europe"
-        },
-        {
-            "name": "Botswana",
-            "code": "BW",
-            "zone": "Africa"
-        },
-        {
-            "name": "Bouvet Island",
-            "code": "BV",
-            "zone": "Americas"
-        },
-        {
-            "name": "Brazil",
-            "code": "BR",
-            "zone": "Americas"
-        },
-        {
-            "name": "British Indian Ocean Territory",
-            "code": "IO",
-            "zone": "Africa"
-        },
-        {
-            "name": "Brunei Darussalam",
-            "code": "BN",
-            "zone": "Asia"
-        },
-        {
-            "name": "Bulgaria",
-            "code": "BG",
-            "zone": "Europe"
-        },
-        {
-            "name": "Burkina Faso",
-            "code": "BF",
-            "zone": "Africa"
-        },
-        {
-            "name": "Burundi",
-            "code": "BI",
-            "zone": "Africa"
-        },
-        {
-            "name": "Cabo Verde",
-            "code": "CV",
-            "zone": "Africa"
-        },
-        {
-            "name": "Cambodia",
-            "code": "KH",
-            "zone": "Asia"
-        },
-        {
-            "name": "Cameroon",
-            "code": "CM",
-            "zone": "Africa"
-        },
-        {
-            "name": "Canada",
-            "code": "CA",
-            "zone": "Americas"
-        },
-        {
-            "name": "Cayman Islands",
-            "code": "KY",
-            "zone": "Americas"
-        },
-        {
-            "name": "Central African Republic",
-            "code": "CF",
-            "zone": "Africa"
-        },
-        {
-            "name": "Chad",
-            "code": "TD",
-            "zone": "Africa"
-        },
-        {
-            "name": "Chile",
-            "code": "CL",
-            "zone": "Americas"
-        },
-        {
-            "name": "China",
-            "code": "CN",
-            "zone": "Asia"
-        },
-        {
-            "name": "Christmas Island",
-            "code": "CX",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Cocos (Keeling) Islands",
-            "code": "CC",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Colombia",
-            "code": "CO",
-            "zone": "Americas"
-        },
-        {
-            "name": "Comoros",
-            "code": "KM",
-            "zone": "Africa"
-        },
-        {
-            "name": "Congo",
-            "code": "CG",
-            "zone": "Africa"
-        },
-        {
-            "name": "Congo (Democratic Republic of the)",
-            "code": "CD",
-            "zone": "Africa"
-        },
-        {
-            "name": "Cook Islands",
-            "code": "CK",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Costa Rica",
-            "code": "CR",
-            "zone": "Americas"
-        },
-        {
-            "name": "Côte d'Ivoire",
-            "code": "CI",
-            "zone": "Africa"
-        },
-        {
-            "name": "Croatia",
-            "code": "HR",
-            "zone": "Europe"
-        },
-        {
-            "name": "Cuba",
-            "code": "CU",
-            "zone": "Americas"
-        },
-        {
-            "name": "Curaçao",
-            "code": "CW",
-            "zone": "Americas"
-        },
-        {
-            "name": "Cyprus",
-            "code": "CY",
-            "zone": "Asia"
-        },
-        {
-            "name": "Czechia",
-            "code": "CZ",
-            "zone": "Europe"
-        },
-        {
-            "name": "Denmark",
-            "code": "DK",
-            "zone": "Europe"
-        },
-        {
-            "name": "Djibouti",
-            "code": "DJ",
-            "zone": "Africa"
-        },
-        {
-            "name": "Dominica",
-            "code": "DM",
-            "zone": "Americas"
-        },
-        {
-            "name": "Dominican Republic",
-            "code": "DO",
-            "zone": "Americas"
-        },
-        {
-            "name": "Ecuador",
-            "code": "EC",
-            "zone": "Americas"
-        },
-        {
-            "name": "Egypt",
-            "code": "EG",
-            "zone": "Africa"
-        },
-        {
-            "name": "El Salvador",
-            "code": "SV",
-            "zone": "Americas"
-        },
-        {
-            "name": "Equatorial Guinea",
-            "code": "GQ",
-            "zone": "Africa"
-        },
-        {
-            "name": "Eritrea",
-            "code": "ER",
-            "zone": "Africa"
-        },
-        {
-            "name": "Estonia",
-            "code": "EE",
-            "zone": "Europe"
-        },
-        {
-            "name": "Eswatini",
-            "code": "SZ",
-            "zone": "Africa"
-        },
-        {
-            "name": "Ethiopia",
-            "code": "ET",
-            "zone": "Africa"
-        },
-        {
-            "name": "Falkland Islands (Malvinas)",
-            "code": "FK",
-            "zone": "Americas"
-        },
-        {
-            "name": "Faroe Islands",
-            "code": "FO",
-            "zone": "Europe"
-        },
-        {
-            "name": "Fiji",
-            "code": "FJ",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Finland",
-            "code": "FI",
-            "zone": "Europe"
-        },
-        {
-            "name": "France",
-            "code": "FR",
-            "zone": "Europe"
-        },
-        {
-            "name": "French Guiana",
-            "code": "GF",
-            "zone": "Americas"
-        },
-        {
-            "name": "French Polynesia",
-            "code": "PF",
-            "zone": "Oceania"
-        },
-        {
-            "name": "French Southern Territories",
-            "code": "TF",
-            "zone": "Africa"
-        },
-        {
-            "name": "Gabon",
-            "code": "GA",
-            "zone": "Africa"
-        },
-        {
-            "name": "Gambia",
-            "code": "GM",
-            "zone": "Africa"
-        },
-        {
-            "name": "Georgia",
-            "code": "GE",
-            "zone": "Asia"
-        },
-        {
-            "name": "Germany",
-            "code": "DE",
-            "zone": "Europe"
-        },
-        {
-            "name": "Ghana",
-            "code": "GH",
-            "zone": "Africa"
-        },
-        {
-            "name": "Gibraltar",
-            "code": "GI",
-            "zone": "Europe"
-        },
-        {
-            "name": "Greece",
-            "code": "GR",
-            "zone": "Europe"
-        },
-        {
-            "name": "Greenland",
-            "code": "GL",
-            "zone": "Americas"
-        },
-        {
-            "name": "Grenada",
-            "code": "GD",
-            "zone": "Americas"
-        },
-        {
-            "name": "Guadeloupe",
-            "code": "GP",
-            "zone": "Americas"
-        },
-        {
-            "name": "Guam",
-            "code": "GU",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Guatemala",
-            "code": "GT",
-            "zone": "Americas"
-        },
-        {
-            "name": "Guernsey",
-            "code": "GG",
-            "zone": "Europe"
-        },
-        {
-            "name": "Guinea",
-            "code": "GN",
-            "zone": "Africa"
-        },
-        {
-            "name": "Guinea-Bissau",
-            "code": "GW",
-            "zone": "Africa"
-        },
-        {
-            "name": "Guyana",
-            "code": "GY",
-            "zone": "Americas"
-        },
-        {
-            "name": "Haiti",
-            "code": "HT",
-            "zone": "Americas"
-        },
-        {
-            "name": "Heard Island and McDonald Islands",
-            "code": "HM",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Holy See",
-            "code": "VA",
-            "zone": "Europe"
-        },
-        {
-            "name": "Honduras",
-            "code": "HN",
-            "zone": "Americas"
-        },
-        {
-            "name": "Hong Kong",
-            "code": "HK",
-            "zone": "Asia"
-        },
-        {
-            "name": "Hungary",
-            "code": "HU",
-            "zone": "Europe"
-        },
-        {
-            "name": "Iceland",
-            "code": "IS",
-            "zone": "Europe"
-        },
-        {
-            "name": "India",
-            "code": "IN",
-            "zone": "Asia"
-        },
-        {
-            "name": "Indonesia",
-            "code": "ID",
-            "zone": "Asia"
-        },
-        {
-            "name": "Iran (Islamic Republic of)",
-            "code": "IR",
-            "zone": "Asia"
-        },
-        {
-            "name": "Iraq",
-            "code": "IQ",
-            "zone": "Asia"
-        },
-        {
-            "name": "Ireland",
-            "code": "IE",
-            "zone": "Europe"
-        },
-        {
-            "name": "Isle of Man",
-            "code": "IM",
-            "zone": "Europe"
-        },
-        {
-            "name": "Israel",
-            "code": "IL",
-            "zone": "Asia"
-        },
-        {
-            "name": "Italy",
-            "code": "IT",
-            "zone": "Europe"
-        },
-        {
-            "name": "Jamaica",
-            "code": "JM",
-            "zone": "Americas"
-        },
-        {
-            "name": "Japan",
-            "code": "JP",
-            "zone": "Asia"
-        },
-        {
-            "name": "Jersey",
-            "code": "JE",
-            "zone": "Europe"
-        },
-        {
-            "name": "Jordan",
-            "code": "JO",
-            "zone": "Asia"
-        },
-        {
-            "name": "Kazakhstan",
-            "code": "KZ",
-            "zone": "Asia"
-        },
-        {
-            "name": "Kenya",
-            "code": "KE",
-            "zone": "Africa"
-        },
-        {
-            "name": "Kiribati",
-            "code": "KI",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Korea (Democratic People's Republic of)",
-            "code": "KP",
-            "zone": "Asia"
-        },
-        {
-            "name": "Korea (Republic of)",
-            "code": "KR",
-            "zone": "Asia"
-        },
-        {
-            "name": "Kuwait",
-            "code": "KW",
-            "zone": "Asia"
-        },
-        {
-            "name": "Kyrgyzstan",
-            "code": "KG",
-            "zone": "Asia"
-        },
-        {
-            "name": "Lao People's Democratic Republic",
-            "code": "LA",
-            "zone": "Asia"
-        },
-        {
-            "name": "Latvia",
-            "code": "LV",
-            "zone": "Europe"
-        },
-        {
-            "name": "Lebanon",
-            "code": "LB",
-            "zone": "Asia"
-        },
-        {
-            "name": "Lesotho",
-            "code": "LS",
-            "zone": "Africa"
-        },
-        {
-            "name": "Liberia",
-            "code": "LR",
-            "zone": "Africa"
-        },
-        {
-            "name": "Libya",
-            "code": "LY",
-            "zone": "Africa"
-        },
-        {
-            "name": "Liechtenstein",
-            "code": "LI",
-            "zone": "Europe"
-        },
-        {
-            "name": "Lithuania",
-            "code": "LT",
-            "zone": "Europe"
-        },
-        {
-            "name": "Luxembourg",
-            "code": "LU",
-            "zone": "Europe"
-        },
-        {
-            "name": "Macao",
-            "code": "MO",
-            "zone": "Asia"
-        },
-        {
-            "name": "Macedonia (the former Yugoslav Republic of)",
-            "code": "MK",
-            "zone": "Europe"
-        },
-        {
-            "name": "Madagascar",
-            "code": "MG",
-            "zone": "Africa"
-        },
-        {
-            "name": "Malawi",
-            "code": "MW",
-            "zone": "Africa"
-        },
-        {
-            "name": "Malaysia",
-            "code": "MY",
-            "zone": "Asia"
-        },
-        {
-            "name": "Maldives",
-            "code": "MV",
-            "zone": "Asia"
-        },
-        {
-            "name": "Mali",
-            "code": "ML",
-            "zone": "Africa"
-        },
-        {
-            "name": "Malta",
-            "code": "MT",
-            "zone": "Europe"
-        },
-        {
-            "name": "Marshall Islands",
-            "code": "MH",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Martinique",
-            "code": "MQ",
-            "zone": "Americas"
-        },
-        {
-            "name": "Mauritania",
-            "code": "MR",
-            "zone": "Africa"
-        },
-        {
-            "name": "Mauritius",
-            "code": "MU",
-            "zone": "Africa"
-        },
-        {
-            "name": "Mayotte",
-            "code": "YT",
-            "zone": "Africa"
-        },
-        {
-            "name": "Mexico",
-            "code": "MX",
-            "zone": "Americas"
-        },
-        {
-            "name": "Micronesia (Federated States of)",
-            "code": "FM",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Moldova (Republic of)",
-            "code": "MD",
-            "zone": "Europe"
-        },
-        {
-            "name": "Monaco",
-            "code": "MC",
-            "zone": "Europe"
-        },
-        {
-            "name": "Mongolia",
-            "code": "MN",
-            "zone": "Asia"
-        },
-        {
-            "name": "Montenegro",
-            "code": "ME",
-            "zone": "Europe"
-        },
-        {
-            "name": "Montserrat",
-            "code": "MS",
-            "zone": "Americas"
-        },
-        {
-            "name": "Morocco",
-            "code": "MA",
-            "zone": "Africa"
-        },
-        {
-            "name": "Mozambique",
-            "code": "MZ",
-            "zone": "Africa"
-        },
-        {
-            "name": "Myanmar",
-            "code": "MM",
-            "zone": "Asia"
-        },
-        {
-            "name": "Namibia",
-            "code": "NA",
-            "zone": "Africa"
-        },
-        {
-            "name": "Nauru",
-            "code": "NR",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Nepal",
-            "code": "NP",
-            "zone": "Asia"
-        },
-        {
-            "name": "Netherlands",
-            "code": "NL",
-            "zone": "Europe"
-        },
-        {
-            "name": "New Caledonia",
-            "code": "NC",
-            "zone": "Oceania"
-        },
-        {
-            "name": "New Zealand",
-            "code": "NZ",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Nicaragua",
-            "code": "NI",
-            "zone": "Americas"
-        },
-        {
-            "name": "Niger",
-            "code": "NE",
-            "zone": "Africa"
-        },
-        {
-            "name": "Nigeria",
-            "code": "NG",
-            "zone": "Africa"
-        },
-        {
-            "name": "Niue",
-            "code": "NU",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Norfolk Island",
-            "code": "NF",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Northern Mariana Islands",
-            "code": "MP",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Norway",
-            "code": "NO",
-            "zone": "Europe"
-        },
-        {
-            "name": "Oman",
-            "code": "OM",
-            "zone": "Asia"
-        },
-        {
-            "name": "Pakistan",
-            "code": "PK",
-            "zone": "Asia"
-        },
-        {
-            "name": "Palau",
-            "code": "PW",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Palestine, State of",
-            "code": "PS",
-            "zone": "Asia"
-        },
-        {
-            "name": "Panama",
-            "code": "PA",
-            "zone": "Americas"
-        },
-        {
-            "name": "Papua New Guinea",
-            "code": "PG",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Paraguay",
-            "code": "PY",
-            "zone": "Americas"
-        },
-        {
-            "name": "Peru",
-            "code": "PE",
-            "zone": "Americas"
-        },
-        {
-            "name": "Philippines",
-            "code": "PH",
-            "zone": "Asia"
-        },
-        {
-            "name": "Pitcairn",
-            "code": "PN",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Poland",
-            "code": "PL",
-            "zone": "Europe"
-        },
-        {
-            "name": "Portugal",
-            "code": "PT",
-            "zone": "Europe"
-        },
-        {
-            "name": "Puerto Rico",
-            "code": "PR",
-            "zone": "Americas"
-        },
-        {
-            "name": "Qatar",
-            "code": "QA",
-            "zone": "Asia"
-        },
-        {
-            "name": "Réunion",
-            "code": "RE",
-            "zone": "Africa"
-        },
-        {
-            "name": "Romania",
-            "code": "RO",
-            "zone": "Europe"
-        },
-        {
-            "name": "Russian Federation",
-            "code": "RU",
-            "zone": "Europe"
-        },
-        {
-            "name": "Rwanda",
-            "code": "RW",
-            "zone": "Africa"
-        },
-        {
-            "name": "Saint Barthélemy",
-            "code": "BL",
-            "zone": "Americas"
-        },
-        {
-            "name": "Saint Helena, Ascension and Tristan da Cunha",
-            "code": "SH",
-            "zone": "Africa"
-        },
-        {
-            "name": "Saint Kitts and Nevis",
-            "code": "KN",
-            "zone": "Americas"
-        },
-        {
-            "name": "Saint Lucia",
-            "code": "LC",
-            "zone": "Americas"
-        },
-        {
-            "name": "Saint Martin (French part)",
-            "code": "MF",
-            "zone": "Americas"
-        },
-        {
-            "name": "Saint Pierre and Miquelon",
-            "code": "PM",
-            "zone": "Americas"
-        },
-        {
-            "name": "Saint Vincent and the Grenadines",
-            "code": "VC",
-            "zone": "Americas"
-        },
-        {
-            "name": "Samoa",
-            "code": "WS",
-            "zone": "Oceania"
-        },
-        {
-            "name": "San Marino",
-            "code": "SM",
-            "zone": "Europe"
-        },
-        {
-            "name": "Sao Tome and Principe",
-            "code": "ST",
-            "zone": "Africa"
-        },
-        {
-            "name": "Saudi Arabia",
-            "code": "SA",
-            "zone": "Asia"
-        },
-        {
-            "name": "Senegal",
-            "code": "SN",
-            "zone": "Africa"
-        },
-        {
-            "name": "Serbia",
-            "code": "RS",
-            "zone": "Europe"
-        },
-        {
-            "name": "Seychelles",
-            "code": "SC",
-            "zone": "Africa"
-        },
-        {
-            "name": "Sierra Leone",
-            "code": "SL",
-            "zone": "Africa"
-        },
-        {
-            "name": "Singapore",
-            "code": "SG",
-            "zone": "Asia"
-        },
-        {
-            "name": "Sint Maarten (Dutch part)",
-            "code": "SX",
-            "zone": "Americas"
-        },
-        {
-            "name": "Slovakia",
-            "code": "SK",
-            "zone": "Europe"
-        },
-        {
-            "name": "Slovenia",
-            "code": "SI",
-            "zone": "Europe"
-        },
-        {
-            "name": "Solomon Islands",
-            "code": "SB",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Somalia",
-            "code": "SO",
-            "zone": "Africa"
-        },
-        {
-            "name": "South Africa",
-            "code": "ZA",
-            "zone": "Africa"
-        },
-        {
-            "name": "South Georgia and the South Sandwich Islands",
-            "code": "GS",
-            "zone": "Americas"
-        },
-        {
-            "name": "South Sudan",
-            "code": "SS",
-            "zone": "Africa"
-        },
-        {
-            "name": "Spain",
-            "code": "ES",
-            "zone": "Europe"
-        },
-        {
-            "name": "Sri Lanka",
-            "code": "LK",
-            "zone": "Asia"
-        },
-        {
-            "name": "Sudan",
-            "code": "SD",
-            "zone": "Africa"
-        },
-        {
-            "name": "Suriname",
-            "code": "SR",
-            "zone": "Americas"
-        },
-        {
-            "name": "Svalbard and Jan Mayen",
-            "code": "SJ",
-            "zone": "Europe"
-        },
-        {
-            "name": "Sweden",
-            "code": "SE",
-            "zone": "Europe"
-        },
-        {
-            "name": "Switzerland",
-            "code": "CH",
-            "zone": "Europe"
-        },
-        {
-            "name": "Syrian Arab Republic",
-            "code": "SY",
-            "zone": "Asia"
-        },
-        {
-            "name": "Taiwan, Province of China",
-            "code": "TW",
-            "zone": "Asia"
-        },
-        {
-            "name": "Tajikistan",
-            "code": "TJ",
-            "zone": "Asia"
-        },
-        {
-            "name": "Tanzania, United Republic of",
-            "code": "TZ",
-            "zone": "Africa"
-        },
-        {
-            "name": "Thailand",
-            "code": "TH",
-            "zone": "Asia"
-        },
-        {
-            "name": "Timor-Leste",
-            "code": "TL",
-            "zone": "Asia"
-        },
-        {
-            "name": "Togo",
-            "code": "TG",
-            "zone": "Africa"
-        },
-        {
-            "name": "Tokelau",
-            "code": "TK",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Tonga",
-            "code": "TO",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Trinidad and Tobago",
-            "code": "TT",
-            "zone": "Americas"
-        },
-        {
-            "name": "Tunisia",
-            "code": "TN",
-            "zone": "Africa"
-        },
-        {
-            "name": "Turkey",
-            "code": "TR",
-            "zone": "Asia"
-        },
-        {
-            "name": "Turkmenistan",
-            "code": "TM",
-            "zone": "Asia"
-        },
-        {
-            "name": "Turks and Caicos Islands",
-            "code": "TC",
-            "zone": "Americas"
-        },
-        {
-            "name": "Tuvalu",
-            "code": "TV",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Uganda",
-            "code": "UG",
-            "zone": "Africa"
-        },
-        {
-            "name": "Ukraine",
-            "code": "UA",
-            "zone": "Europe"
-        },
-        {
-            "name": "United Arab Emirates",
-            "code": "AE",
-            "zone": "Asia"
-        },
-        {
-            "name": "United Kingdom of Great Britain and Northern Ireland",
-            "code": "GB",
-            "zone": "UK"
-        },
-        {
-            "name": "United States of America",
-            "code": "US",
-            "zone": "Americas"
-        },
-        {
-            "name": "United States Minor Outlying Islands",
-            "code": "UM",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Uruguay",
-            "code": "UY",
-            "zone": "Americas"
-        },
-        {
-            "name": "Uzbekistan",
-            "code": "UZ",
-            "zone": "Asia"
-        },
-        {
-            "name": "Vanuatu",
-            "code": "VU",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Venezuela (Bolivarian Republic of)",
-            "code": "VE",
-            "zone": "Americas"
-        },
-        {
-            "name": "Viet Nam",
-            "code": "VN",
-            "zone": "Asia"
-        },
-        {
-            "name": "Virgin Islands (British)",
-            "code": "VG",
-            "zone": "Americas"
-        },
-        {
-            "name": "Virgin Islands (U.S.)",
-            "code": "VI",
-            "zone": "Americas"
-        },
-        {
-            "name": "Wallis and Futuna",
-            "code": "WF",
-            "zone": "Oceania"
-        },
-        {
-            "name": "Western Sahara",
-            "code": "EH",
-            "zone": "Africa"
-        },
-        {
-            "name": "Yemen",
-            "code": "YE",
-            "zone": "Asia"
-        },
-        {
-            "name": "Zambia",
-            "code": "ZM",
-            "zone": "Africa"
-        },
-        {
-            "name": "Zimbabwe",
-            "code": "ZW",
-            "zone": "Africa"
-        }
+        { "name": "Afghanistan", "code": "AF", "zone": "Asia" },
+        { "name": "Åland Islands", "code": "AX", "zone": "Europe" },
+        { "name": "Albania", "code": "AL", "zone": "Europe" },
+        { "name": "Algeria", "code": "DZ", "zone": "Africa" },
+        { "name": "American Samoa", "code": "AS", "zone": "Oceania" },
+        { "name": "Andorra", "code": "AD", "zone": "Europe" },
+        { "name": "Angola", "code": "AO", "zone": "Africa" },
+        { "name": "Anguilla", "code": "AI", "zone": "Americas" },
+        { "name": "Antigua and Barbuda", "code": "AG", "zone": "Americas" },
+        { "name": "Argentina", "code": "AR", "zone": "Americas" },
+        { "name": "Armenia", "code": "AM", "zone": "Asia" },
+        { "name": "Aruba", "code": "AW", "zone": "Americas" },
+        { "name": "Australia", "code": "AU", "zone": "Oceania" },
+        { "name": "Austria", "code": "AT", "zone": "Europe" },
+        { "name": "Azerbaijan", "code": "AZ", "zone": "Asia" },
+        { "name": "Bahamas", "code": "BS", "zone": "Americas" },
+        { "name": "Bahrain", "code": "BH", "zone": "Asia" },
+        { "name": "Bangladesh", "code": "BD", "zone": "Asia" },
+        { "name": "Barbados", "code": "BB", "zone": "Americas" },
+        { "name": "Belarus", "code": "BY", "zone": "Europe" },
+        { "name": "Belgium", "code": "BE", "zone": "Europe" },
+        { "name": "Belize", "code": "BZ", "zone": "Americas" },
+        { "name": "Benin", "code": "BJ", "zone": "Africa" },
+        { "name": "Bermuda", "code": "BM", "zone": "Americas" },
+        { "name": "Bhutan", "code": "BT", "zone": "Asia" },
+        { "name": "Bolivia (Plurinational State of)", "code": "BO", "zone": "Americas" },
+        { "name": "Bonaire, Sint Eustatius and Saba", "code": "BQ", "zone": "Americas" },
+        { "name": "Bosnia and Herzegovina", "code": "BA", "zone": "Europe" },
+        { "name": "Botswana", "code": "BW", "zone": "Africa" },
+        { "name": "Bouvet Island", "code": "BV", "zone": "Americas" },
+        { "name": "Brazil", "code": "BR", "zone": "Americas" },
+        { "name": "British Indian Ocean Territory", "code": "IO", "zone": "Africa" },
+        { "name": "Brunei Darussalam", "code": "BN", "zone": "Asia" },
+        { "name": "Bulgaria", "code": "BG", "zone": "Europe" },
+        { "name": "Burkina Faso", "code": "BF", "zone": "Africa" },
+        { "name": "Burundi", "code": "BI", "zone": "Africa" },
+        { "name": "Cabo Verde", "code": "CV", "zone": "Africa" },
+        { "name": "Cambodia", "code": "KH", "zone": "Asia" },
+        { "name": "Cameroon", "code": "CM", "zone": "Africa" },
+        { "name": "Canada", "code": "CA", "zone": "Americas" },
+        { "name": "Cayman Islands", "code": "KY", "zone": "Americas" },
+        { "name": "Central African Republic", "code": "CF", "zone": "Africa" },
+        { "name": "Chad", "code": "TD", "zone": "Africa" },
+        { "name": "Chile", "code": "CL", "zone": "Americas" },
+        { "name": "China", "code": "CN", "zone": "Asia" },
+        { "name": "Christmas Island", "code": "CX", "zone": "Oceania" },
+        { "name": "Cocos (Keeling) Islands", "code": "CC", "zone": "Oceania" },
+        { "name": "Colombia", "code": "CO", "zone": "Americas" },
+        { "name": "Comoros", "code": "KM", "zone": "Africa" },
+        { "name": "Congo", "code": "CG", "zone": "Africa" },
+        { "name": "Congo (Democratic Republic of the)", "code": "CD", "zone": "Africa" },
+        { "name": "Cook Islands", "code": "CK", "zone": "Oceania" },
+        { "name": "Costa Rica", "code": "CR", "zone": "Americas" },
+        { "name": "Côte d'Ivoire", "code": "CI", "zone": "Africa" },
+        { "name": "Croatia", "code": "HR", "zone": "Europe" },
+        { "name": "Cuba", "code": "CU", "zone": "Americas" },
+        { "name": "Curaçao", "code": "CW", "zone": "Americas" },
+        { "name": "Cyprus", "code": "CY", "zone": "Asia" },
+        { "name": "Czechia", "code": "CZ", "zone": "Europe" },
+        { "name": "Denmark", "code": "DK", "zone": "Europe" },
+        { "name": "Djibouti", "code": "DJ", "zone": "Africa" },
+        { "name": "Dominica", "code": "DM", "zone": "Americas" },
+        { "name": "Dominican Republic", "code": "DO", "zone": "Americas" },
+        { "name": "Ecuador", "code": "EC", "zone": "Americas" },
+        { "name": "Egypt", "code": "EG", "zone": "Africa" },
+        { "name": "El Salvador", "code": "SV", "zone": "Americas" },
+        { "name": "Equatorial Guinea", "code": "GQ", "zone": "Africa" },
+        { "name": "Eritrea", "code": "ER", "zone": "Africa" },
+        { "name": "Estonia", "code": "EE", "zone": "Europe" },
+        { "name": "Eswatini", "code": "SZ", "zone": "Africa" },
+        { "name": "Ethiopia", "code": "ET", "zone": "Africa" },
+        { "name": "Falkland Islands (Malvinas)", "code": "FK", "zone": "Americas" },
+        { "name": "Faroe Islands", "code": "FO", "zone": "Europe" },
+        { "name": "Fiji", "code": "FJ", "zone": "Oceania" },
+        { "name": "Finland", "code": "FI", "zone": "Europe" },
+        { "name": "France", "code": "FR", "zone": "Europe" },
+        { "name": "French Guiana", "code": "GF", "zone": "Americas" },
+        { "name": "French Polynesia", "code": "PF", "zone": "Oceania" },
+        { "name": "French Southern Territories", "code": "TF", "zone": "Africa" },
+        { "name": "Gabon", "code": "GA", "zone": "Africa" },
+        { "name": "Gambia", "code": "GM", "zone": "Africa" },
+        { "name": "Georgia", "code": "GE", "zone": "Asia" },
+        { "name": "Germany", "code": "DE", "zone": "Europe" },
+        { "name": "Ghana", "code": "GH", "zone": "Africa" },
+        { "name": "Gibraltar", "code": "GI", "zone": "Europe" },
+        { "name": "Greece", "code": "GR", "zone": "Europe" },
+        { "name": "Greenland", "code": "GL", "zone": "Americas" },
+        { "name": "Grenada", "code": "GD", "zone": "Americas" },
+        { "name": "Guadeloupe", "code": "GP", "zone": "Americas" },
+        { "name": "Guam", "code": "GU", "zone": "Oceania" },
+        { "name": "Guatemala", "code": "GT", "zone": "Americas" },
+        { "name": "Guernsey", "code": "GG", "zone": "Europe" },
+        { "name": "Guinea", "code": "GN", "zone": "Africa" },
+        { "name": "Guinea-Bissau", "code": "GW", "zone": "Africa" },
+        { "name": "Guyana", "code": "GY", "zone": "Americas" },
+        { "name": "Haiti", "code": "HT", "zone": "Americas" },
+        { "name": "Heard Island and McDonald Islands", "code": "HM", "zone": "Oceania" },
+        { "name": "Holy See", "code": "VA", "zone": "Europe" },
+        { "name": "Honduras", "code": "HN", "zone": "Americas" },
+        { "name": "Hong Kong", "code": "HK", "zone": "Asia" },
+        { "name": "Hungary", "code": "HU", "zone": "Europe" },
+        { "name": "Iceland", "code": "IS", "zone": "Europe" },
+        { "name": "India", "code": "IN", "zone": "Asia" },
+        { "name": "Indonesia", "code": "ID", "zone": "Asia" },
+        { "name": "Iran (Islamic Republic of)", "code": "IR", "zone": "Asia" },
+        { "name": "Iraq", "code": "IQ", "zone": "Asia" },
+        { "name": "Ireland", "code": "IE", "zone": "Europe" },
+        { "name": "Isle of Man", "code": "IM", "zone": "Europe" },
+        { "name": "Israel", "code": "IL", "zone": "Asia" },
+        { "name": "Italy", "code": "IT", "zone": "Europe" },
+        { "name": "Jamaica", "code": "JM", "zone": "Americas" },
+        { "name": "Japan", "code": "JP", "zone": "Asia" },
+        { "name": "Jersey", "code": "JE", "zone": "Europe" },
+        { "name": "Jordan", "code": "JO", "zone": "Asia" },
+        { "name": "Kazakhstan", "code": "KZ", "zone": "Asia" },
+        { "name": "Kenya", "code": "KE", "zone": "Africa" },
+        { "name": "Kiribati", "code": "KI", "zone": "Oceania" },
+        { "name": "Korea (Democratic People's Republic of)", "code": "KP", "zone": "Asia" },
+        { "name": "Korea (Republic of)", "code": "KR", "zone": "Asia" },
+        { "name": "Kuwait", "code": "KW", "zone": "Asia" },
+        { "name": "Kyrgyzstan", "code": "KG", "zone": "Asia" },
+        { "name": "Lao People's Democratic Republic", "code": "LA", "zone": "Asia" },
+        { "name": "Latvia", "code": "LV", "zone": "Europe" },
+        { "name": "Lebanon", "code": "LB", "zone": "Asia" },
+        { "name": "Lesotho", "code": "LS", "zone": "Africa" },
+        { "name": "Liberia", "code": "LR", "zone": "Africa" },
+        { "name": "Libya", "code": "LY", "zone": "Africa" },
+        { "name": "Liechtenstein", "code": "LI", "zone": "Europe" },
+        { "name": "Lithuania", "code": "LT", "zone": "Europe" },
+        { "name": "Luxembourg", "code": "LU", "zone": "Europe" },
+        { "name": "Macao", "code": "MO", "zone": "Asia" },
+        { "name": "Macedonia (the former Yugoslav Republic of)", "code": "MK", "zone": "Europe" },
+        { "name": "Madagascar", "code": "MG", "zone": "Africa" },
+        { "name": "Malawi", "code": "MW", "zone": "Africa" },
+        { "name": "Malaysia", "code": "MY", "zone": "Asia" },
+        { "name": "Maldives", "code": "MV", "zone": "Asia" },
+        { "name": "Mali", "code": "ML", "zone": "Africa" },
+        { "name": "Malta", "code": "MT", "zone": "Europe" },
+        { "name": "Marshall Islands", "code": "MH", "zone": "Oceania" },
+        { "name": "Martinique", "code": "MQ", "zone": "Americas" },
+        { "name": "Mauritania", "code": "MR", "zone": "Africa" },
+        { "name": "Mauritius", "code": "MU", "zone": "Africa" },
+        { "name": "Mayotte", "code": "YT", "zone": "Africa" },
+        { "name": "Mexico", "code": "MX", "zone": "Americas" },
+        { "name": "Micronesia (Federated States of)", "code": "FM", "zone": "Oceania" },
+        { "name": "Moldova (Republic of)", "code": "MD", "zone": "Europe" },
+        { "name": "Monaco", "code": "MC", "zone": "Europe" },
+        { "name": "Mongolia", "code": "MN", "zone": "Asia" },
+        { "name": "Montenegro", "code": "ME", "zone": "Europe" },
+        { "name": "Montserrat", "code": "MS", "zone": "Americas" },
+        { "name": "Morocco", "code": "MA", "zone": "Africa" },
+        { "name": "Mozambique", "code": "MZ", "zone": "Africa" },
+        { "name": "Myanmar", "code": "MM", "zone": "Asia" },
+        { "name": "Namibia", "code": "NA", "zone": "Africa" },
+        { "name": "Nauru", "code": "NR", "zone": "Oceania" },
+        { "name": "Nepal", "code": "NP", "zone": "Asia" },
+        { "name": "Netherlands", "code": "NL", "zone": "Europe" },
+        { "name": "New Caledonia", "code": "NC", "zone": "Oceania" },
+        { "name": "New Zealand", "code": "NZ", "zone": "Oceania" },
+        { "name": "Nicaragua", "code": "NI", "zone": "Americas" },
+        { "name": "Niger", "code": "NE", "zone": "Africa" },
+        { "name": "Nigeria", "code": "NG", "zone": "Africa" },
+        { "name": "Niue", "code": "NU", "zone": "Oceania" },
+        { "name": "Norfolk Island", "code": "NF", "zone": "Oceania" },
+        { "name": "Northern Mariana Islands", "code": "MP", "zone": "Oceania" },
+        { "name": "Norway", "code": "NO", "zone": "Europe" },
+        { "name": "Oman", "code": "OM", "zone": "Asia" },
+        { "name": "Pakistan", "code": "PK", "zone": "Asia" },
+        { "name": "Palau", "code": "PW", "zone": "Oceania" },
+        { "name": "Palestine, State of", "code": "PS", "zone": "Asia" },
+        { "name": "Panama", "code": "PA", "zone": "Americas" },
+        { "name": "Papua New Guinea", "code": "PG", "zone": "Oceania" },
+        { "name": "Paraguay", "code": "PY", "zone": "Americas" },
+        { "name": "Peru", "code": "PE", "zone": "Americas" },
+        { "name": "Philippines", "code": "PH", "zone": "Asia" },
+        { "name": "Pitcairn", "code": "PN", "zone": "Oceania" },
+        { "name": "Poland", "code": "PL", "zone": "Europe" },
+        { "name": "Portugal", "code": "PT", "zone": "Europe" },
+        { "name": "Puerto Rico", "code": "PR", "zone": "Americas" },
+        { "name": "Qatar", "code": "QA", "zone": "Asia" },
+        { "name": "Réunion", "code": "RE", "zone": "Africa" },
+        { "name": "Romania", "code": "RO", "zone": "Europe" },
+        { "name": "Russian Federation", "code": "RU", "zone": "Europe" },
+        { "name": "Rwanda", "code": "RW", "zone": "Africa" },
+        { "name": "Saint Barthélemy", "code": "BL", "zone": "Americas" },
+        { "name": "Saint Helena, Ascension and Tristan da Cunha", "code": "SH", "zone": "Africa" },
+        { "name": "Saint Kitts and Nevis", "code": "KN", "zone": "Americas" },
+        { "name": "Saint Lucia", "code": "LC", "zone": "Americas" },
+        { "name": "Saint Martin (French part)", "code": "MF", "zone": "Americas" },
+        { "name": "Saint Pierre and Miquelon", "code": "PM", "zone": "Americas" },
+        { "name": "Saint Vincent and the Grenadines", "code": "VC", "zone": "Americas" },
+        { "name": "Samoa", "code": "WS", "zone": "Oceania" },
+        { "name": "San Marino", "code": "SM", "zone": "Europe" },
+        { "name": "Sao Tome and Principe", "code": "ST", "zone": "Africa" },
+        { "name": "Saudi Arabia", "code": "SA", "zone": "Asia" },
+        { "name": "Senegal", "code": "SN", "zone": "Africa" },
+        { "name": "Serbia", "code": "RS", "zone": "Europe" },
+        { "name": "Seychelles", "code": "SC", "zone": "Africa" },
+        { "name": "Sierra Leone", "code": "SL", "zone": "Africa" },
+        { "name": "Singapore", "code": "SG", "zone": "Asia" },
+        { "name": "Sint Maarten (Dutch part)", "code": "SX", "zone": "Americas" },
+        { "name": "Slovakia", "code": "SK", "zone": "Europe" },
+        { "name": "Slovenia", "code": "SI", "zone": "Europe" },
+        { "name": "Solomon Islands", "code": "SB", "zone": "Oceania" },
+        { "name": "Somalia", "code": "SO", "zone": "Africa" },
+        { "name": "South Africa", "code": "ZA", "zone": "Africa" },
+        { "name": "South Georgia and the South Sandwich Islands", "code": "GS", "zone": "Americas" },
+        { "name": "South Sudan", "code": "SS", "zone": "Africa" },
+        { "name": "Spain", "code": "ES", "zone": "Europe" },
+        { "name": "Sri Lanka", "code": "LK", "zone": "Asia" },
+        { "name": "Sudan", "code": "SD", "zone": "Africa" },
+        { "name": "Suriname", "code": "SR", "zone": "Americas" },
+        { "name": "Svalbard and Jan Mayen", "code": "SJ", "zone": "Europe" },
+        { "name": "Sweden", "code": "SE", "zone": "Europe" },
+        { "name": "Switzerland", "code": "CH", "zone": "Europe" },
+        { "name": "Syrian Arab Republic", "code": "SY", "zone": "Asia" },
+        { "name": "Taiwan, Province of China", "code": "TW", "zone": "Asia" },
+        { "name": "Tajikistan", "code": "TJ", "zone": "Asia" },
+        { "name": "Tanzania, United Republic of", "code": "TZ", "zone": "Africa" },
+        { "name": "Thailand", "code": "TH", "zone": "Asia" },
+        { "name": "Timor-Leste", "code": "TL", "zone": "Asia" },
+        { "name": "Togo", "code": "TG", "zone": "Africa" },
+        { "name": "Tokelau", "code": "TK", "zone": "Oceania" },
+        { "name": "Tonga", "code": "TO", "zone": "Oceania" },
+        { "name": "Trinidad and Tobago", "code": "TT", "zone": "Americas" },
+        { "name": "Tunisia", "code": "TN", "zone": "Africa" },
+        { "name": "Turkey", "code": "TR", "zone": "Asia" },
+        { "name": "Turkmenistan", "code": "TM", "zone": "Asia" },
+        { "name": "Turks and Caicos Islands", "code": "TC", "zone": "Americas" },
+        { "name": "Tuvalu", "code": "TV", "zone": "Oceania" },
+        { "name": "Uganda", "code": "UG", "zone": "Africa" },
+        { "name": "Ukraine", "code": "UA", "zone": "Europe" },
+        { "name": "United Arab Emirates", "code": "AE", "zone": "Asia" },
+        { "name": "United Kingdom", "code": "GB", "zone": "Europe" },
+        { "name": "United States of America", "code": "US", "zone": "Americas" },
+        { "name": "United States Minor Outlying Islands", "code": "UM", "zone": "Oceania" },
+        { "name": "Uruguay", "code": "UY", "zone": "Americas" },
+        { "name": "Uzbekistan", "code": "UZ", "zone": "Asia" },
+        { "name": "Vanuatu", "code": "VU", "zone": "Oceania" },
+        { "name": "Venezuela (Bolivarian Republic of)", "code": "VE", "zone": "Americas" },
+        { "name": "Viet Nam", "code": "VN", "zone": "Asia" },
+        { "name": "Virgin Islands (British)", "code": "VG", "zone": "Americas" },
+        { "name": "Virgin Islands (U.S.)", "code": "VI", "zone": "Americas" },
+        { "name": "Wallis and Futuna", "code": "WF", "zone": "Oceania" },
+        { "name": "Western Sahara", "code": "EH", "zone": "Africa" },
+        { "name": "Yemen", "code": "YE", "zone": "Asia" },
+        { "name": "Zambia", "code": "ZM", "zone": "Africa" },
+        { "name": "Zimbabwe", "code": "ZW", "zone": "Africa" }
     ]
 }

+ 12 - 0
server/cli/assets/sample-products.csv

@@ -0,0 +1,12 @@
+name           , slug           , description                                                                                                                                                                                                                                                                  , assets                              , optionGroups       , optionValues    , sku         , price   , taxCategory , variantAssets
+Spiky Cactus   , spiky-cactus   , "A spiky yet elegant house cactus - perfect for the home or office. Origin and habitat: Probably native only to the Andes of Peru"                                                                                                                                           , charles-deluvio-695736-unsplash.jpg ,                    ,                 , SC011001    , 15.50   , standard    ,
+Running Shoe   , running-shoe   , "With its ultra-light, uber-responsive magic foam and a carbon fiber plate that feels like it’s propelling you forward, the Running Shoe is ready to push you to victories both large and small"                                                                             , chuttersnap-584518-unsplash.jpg     , shoe size          , Size 40         , RS0040      , 99.99   , standard    ,
+               ,                ,                                                                                                                                                                                                                                                                              ,                                     ,                    , Size 42         , RS0042      , 99.99   , standard    ,
+               ,                ,                                                                                                                                                                                                                                                                              ,                                     ,                    , Size 44         , RS0044      , 99.99   , standard    ,
+               ,                ,                                                                                                                                                                                                                                                                              ,                                     ,                    , Size 46         , RS0046      , 99.99   , standard    ,
+Laptop         , laptop         , "Now equipped with seventh-generation Intel Core processors, Laptop is snappier than ever. From daily tasks like launching apps and opening files to more advanced computing, you can power through your day thanks to faster SSDs and Turbo Boost processing up to 3.6GHz." , derick-david-409858-unsplash.jpg    , "screen size, RAM" , "13 inch, 8GB"  , L2201308    , 1299.00 , standard    ,
+               ,                ,                                                                                                                                                                                                                                                                              ,                                     ,                    , "15 inch, 8GB"  , L2201508    , 1399.00 , standard    ,
+               ,                ,                                                                                                                                                                                                                                                                              ,                                     ,                    , "13 inch, 16GB" , L2201316    , 2199.00 , standard    ,
+               ,                ,                                                                                                                                                                                                                                                                              ,                                     ,                    , "15 inch, 16GB" , L2201516    , 2299.00 , standard    ,
+Instant Camera , instant-camera , "With its nostalgic design and simple point-and-shoot functionality, the Instant Camera is the perfect pick to get started with instant photography."                                                                                                                        , eniko-kis-663725-unsplash.jpg       ,                    ,                 , IC22MWDD    , 174.99  , standard    ,
+Road Bike      , road-bike      , "Featuring a full carbon chassis - complete with cyclocross-specific carbon fork - and a component setup geared for hard use on the race circuit, it's got the low weight, exceptional efficiency and brilliant handling you'll need to stay at the front of the pack."      , mikkel-bech-748940-unsplash.jpg     ,                    ,                 , RB000844334 , 2499.00 , standard    ,

+ 32 - 4
server/cli/populate.ts

@@ -10,11 +10,11 @@ export async function populate() {
     logColored('\nPopulating... (this may take a minute or two)\n');
     const app = await getApplicationRef();
     if (app) {
-        const { Populator } = require('vendure');
-        const populator = app.get(Populator);
+        const { Populator, Importer } = require('vendure');
         const initialData = require('./assets/initial-data.json');
-        await populator.populateInitialData(initialData);
-        logColored('Done!');
+        await populateInitialData(app, initialData, Populator);
+        await populateProducts(app, initialData, Importer);
+        logColored('\nDone!');
         await app.close();
         process.exit(0);
     }
@@ -69,3 +69,31 @@ async function getApplicationRef(): Promise<INestApplication | undefined> {
     const app = await bootstrap(config);
     return app;
 }
+
+async function populateInitialData(app: INestApplication, initialData: any, Populator: any) {
+    const populator = app.get(Populator);
+    try {
+        await populator.populateInitialData(initialData);
+    } catch (err) {
+        console.error(err.message);
+    }
+}
+
+async function populateProducts(app: INestApplication, initialData: any, Importer: any) {
+    // copy the images to the import folder
+    const images = path.join(__dirname, 'assets', 'images');
+    const destination = path.join(process.cwd(), 'vendure', 'import-assets');
+    await fs.copy(images, destination);
+
+    // import the csv of same product data
+    const importer = app.get(Importer);
+    const productData = await fs.readFile(path.join(__dirname, 'assets', 'sample-products.csv'), 'utf-8');
+    const importResult = await importer.parseAndImport(productData, initialData.defaultLanguage);
+    if (importResult.errors.length) {
+        console.error(`Error encountered when importing product data:`);
+        console.error(importResult.errors.join('\n'));
+    } else {
+        console.log(`Imported ${importResult.importedCount} products`);
+        await fs.emptyDir(destination);
+    }
+}

+ 2 - 34
server/src/api/resolvers/import.resolver.ts

@@ -1,10 +1,6 @@
 import { Args, Mutation, Resolver } from '@nestjs/graphql';
 
 import { ImportInfo, ImportProductsMutationArgs, Permission } from '../../../../shared/generated-types';
-import {
-    ImportParser,
-    ParsedProductWithVariants,
-} from '../../data-import/providers/import-parser/import-parser';
 import { Importer } from '../../data-import/providers/importer/importer';
 import { RequestContext } from '../common/request-context';
 import { Allow } from '../decorators/allow.decorator';
@@ -12,7 +8,7 @@ import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('Import')
 export class ImportResolver {
-    constructor(private importParser: ImportParser, private importer: Importer) {}
+    constructor(private importer: Importer) {}
 
     @Mutation()
     @Allow(Permission.SuperAdmin)
@@ -21,34 +17,6 @@ export class ImportResolver {
         @Args() args: ImportProductsMutationArgs,
     ): Promise<ImportInfo> {
         const { stream, filename, mimetype, encoding } = await args.csvFile;
-        let parsed: ParsedProductWithVariants[];
-        try {
-            parsed = await this.importParser.parseProducts(stream);
-        } catch (err) {
-            return {
-                errors: [err.message],
-                importedCount: 0,
-            };
-        }
-
-        if (parsed) {
-            try {
-                const result = await this.importer.importProducts(ctx, parsed);
-                return {
-                    errors: [],
-                    importedCount: parsed.length,
-                };
-            } catch (err) {
-                return {
-                    errors: [err.message],
-                    importedCount: 0,
-                };
-            }
-        } else {
-            return {
-                errors: ['nothing to parse!'],
-                importedCount: 0,
-            };
-        }
+        return this.importer.parseAndImport(stream, ctx);
     }
 }

+ 1 - 0
server/src/data-import/index.ts

@@ -1 +1,2 @@
 export * from './providers/populator/populator';
+export * from './providers/importer/importer';

+ 55 - 2
server/src/data-import/providers/importer/importer.ts

@@ -1,19 +1,22 @@
 import { Injectable } from '@nestjs/common';
 import * as fs from 'fs-extra';
 import * as path from 'path';
+import { Stream } from 'stream';
 
+import { ImportInfo, LanguageCode } from '../../../../../shared/generated-types';
 import { normalizeString } from '../../../../../shared/normalize-string';
 import { RequestContext } from '../../../api/common/request-context';
 import { ConfigService } from '../../../config/config.service';
 import { Asset } from '../../../entity/asset/asset.entity';
 import { TaxCategory } from '../../../entity/tax-category/tax-category.entity';
 import { AssetService } from '../../../service/services/asset.service';
+import { ChannelService } from '../../../service/services/channel.service';
 import { ProductOptionGroupService } from '../../../service/services/product-option-group.service';
 import { ProductOptionService } from '../../../service/services/product-option.service';
 import { ProductVariantService } from '../../../service/services/product-variant.service';
 import { ProductService } from '../../../service/services/product.service';
 import { TaxCategoryService } from '../../../service/services/tax-category.service';
-import { ParsedProductWithVariants } from '../import-parser/import-parser';
+import { ImportParser, ParsedProductWithVariants } from '../import-parser/import-parser';
 
 @Injectable()
 export class Importer {
@@ -21,6 +24,8 @@ export class Importer {
 
     constructor(
         private configService: ConfigService,
+        private importParser: ImportParser,
+        private channelService: ChannelService,
         private productService: ProductService,
         private productVariantService: ProductVariantService,
         private productOptionGroupService: ProductOptionGroupService,
@@ -29,7 +34,55 @@ export class Importer {
         private productOptionService: ProductOptionService,
     ) {}
 
-    async importProducts(ctx: RequestContext, rows: ParsedProductWithVariants[]) {
+    async parseAndImport(
+        input: string | Stream,
+        ctxOrLanguageCode: RequestContext | LanguageCode,
+    ): Promise<ImportInfo> {
+        let ctx: RequestContext;
+        if (ctxOrLanguageCode instanceof RequestContext) {
+            ctx = ctxOrLanguageCode;
+        } else {
+            const channel = await this.channelService.getDefaultChannel();
+            ctx = new RequestContext({
+                isAuthorized: true,
+                authorizedAsOwnerOnly: false,
+                channel,
+                languageCode: ctxOrLanguageCode,
+            });
+        }
+
+        let parsed: ParsedProductWithVariants[];
+        try {
+            parsed = await this.importParser.parseProducts(input);
+        } catch (err) {
+            return {
+                errors: [err.message],
+                importedCount: 0,
+            };
+        }
+
+        if (parsed) {
+            try {
+                const result = await this.importProducts(ctx, parsed);
+                return {
+                    errors: [],
+                    importedCount: parsed.length,
+                };
+            } catch (err) {
+                return {
+                    errors: [err.message],
+                    importedCount: 0,
+                };
+            }
+        } else {
+            return {
+                errors: ['nothing to parse!'],
+                importedCount: 0,
+            };
+        }
+    }
+
+    private async importProducts(ctx: RequestContext, rows: ParsedProductWithVariants[]) {
         const languageCode = ctx.languageCode;
         const taxCategories = await this.taxCategoryService.findAll();
         for (const { product, variants } of rows) {

+ 20 - 0
server/src/data-import/providers/populator/populator.ts

@@ -17,12 +17,16 @@ export interface CountryData {
 }
 export interface InitialData {
     defaultLanguage: LanguageCode;
+    defaultZone: string;
     countries: CountryData[];
     taxRates: Array<{ name: string; percentage: number }>;
 }
 
 type ZoneMap = Map<string, { entity: Zone; members: string[] }>;
 
+/**
+ * Responsible for populating the database with initial data.
+ */
 @Injectable()
 export class Populator {
     constructor(
@@ -44,6 +48,22 @@ export class Populator {
 
         const zoneMap = await this.populateCountries(ctx, data.countries);
         await this.populateTaxRates(ctx, data.taxRates, zoneMap);
+        await this.setChannelDefaults(zoneMap, data, channel);
+    }
+
+    private async setChannelDefaults(zoneMap, data: InitialData, channel) {
+        const defaultZone = zoneMap.get(data.defaultZone);
+        if (!defaultZone) {
+            throw new Error(
+                `The defaultZone (${data.defaultZone}) did not match any zones from the InitialData`,
+            );
+        }
+        const defaultZoneId = defaultZone.entity.id as string;
+        await this.channelService.update({
+            id: channel.id as string,
+            defaultTaxZoneId: defaultZoneId,
+            defaultShippingZoneId: defaultZoneId,
+        });
     }
 
     private async populateCountries(ctx: RequestContext, countries: CountryData[]): Promise<ZoneMap> {