calcomblock/countries.go
Alex Dunmow 18b7825592 Extract calcomblock into a standalone wasm plugin repo
Convert the bundled backend/internal/plugins/calcomblock package into a
standalone reactor-mode wasm plugin, dropping every git.dev.alexdunmow.com/block/cms
import (forbidden in standalone plugins):

- package calcomblock -> package main; add wasip1 main.go with
  wasmguest.Serve(Registration). go.mod module
  git.dev.alexdunmow.com/block/calcomblock, block/core v0.18.2, no replace
  directives.
- Settings persistence: replace the pool-backed poolQuerier (direct SQL against
  the public-schema `settings` table, which a sandboxed plugin role cannot read)
  with capabilityQuerier over the SDK settings.Settings / settings.Updater
  capabilities. GetSiteTimezone now resolves via GetSiteSettings host-side.
- Vendor the small CMS-internal helpers the plugin used into internal/helpers
  (GetRealIP, StartCleanupLoop, MaskSecret, GetStringOr, the PluginSettingsQuerier
  settings helpers, PluginCrypto for tests) and internal/db (minimal Setting /
  UpsertSettingParams), each with a provenance header.
- Inline the captcha widget: vendor blocks.CaptchaWidget as a local
  CaptchaWidget templ (captcha_widget.templ) and regenerate templ; drop the
  block/cms/blocks import from booking.templ.
- blockConfig (server-authoritative captcha requirement via a
  page_block_snapshots scan) has no wasm-ABI capability, so it is left nil:
  honeypot + per-IP rate limit still apply. Documented as a follow-up.
- web: @block-ninja/ui workspace:* -> ^0.1.0 registry version; eslint.config.js
  repointed at ../../../cms/web/eslint.config.js; rebuild web/dist.
- Rewrite CLAUDE.md for the standalone wasm reality; add .gitignore.

Full test suite preserved and passing; builds to calcomblock-2.0.0.bnp;
check-safety passes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 03:04:18 +08:00

258 lines
12 KiB
Go

package main
// Country is one ITU dialing entry for the booking phone country selector.
type Country struct {
Name string
Code string // ISO 3166-1 alpha-2
Dial string // E.164 calling code, e.g. "+61"
}
// countries is the full country list (sorted by name) rendered in the phone
// country combobox, and the source of truth for country lookups (countryByCode,
// countryLabel). Generated from the public CountryCodes dataset
// (gist anubhavshrimal/75f6183458db8c453306f93521e93d37).
var countries = []Country{
{Name: "Afghanistan", Code: "AF", Dial: "+93"},
{Name: "Aland Islands", Code: "AX", Dial: "+358"},
{Name: "Albania", Code: "AL", Dial: "+355"},
{Name: "Algeria", Code: "DZ", Dial: "+213"},
{Name: "AmericanSamoa", Code: "AS", Dial: "+1684"},
{Name: "Andorra", Code: "AD", Dial: "+376"},
{Name: "Angola", Code: "AO", Dial: "+244"},
{Name: "Anguilla", Code: "AI", Dial: "+1264"},
{Name: "Antarctica", Code: "AQ", Dial: "+672"},
{Name: "Antigua and Barbuda", Code: "AG", Dial: "+1268"},
{Name: "Argentina", Code: "AR", Dial: "+54"},
{Name: "Armenia", Code: "AM", Dial: "+374"},
{Name: "Aruba", Code: "AW", Dial: "+297"},
{Name: "Australia", Code: "AU", Dial: "+61"},
{Name: "Austria", Code: "AT", Dial: "+43"},
{Name: "Azerbaijan", Code: "AZ", Dial: "+994"},
{Name: "Bahamas", Code: "BS", Dial: "+1242"},
{Name: "Bahrain", Code: "BH", Dial: "+973"},
{Name: "Bangladesh", Code: "BD", Dial: "+880"},
{Name: "Barbados", Code: "BB", Dial: "+1246"},
{Name: "Belarus", Code: "BY", Dial: "+375"},
{Name: "Belgium", Code: "BE", Dial: "+32"},
{Name: "Belize", Code: "BZ", Dial: "+501"},
{Name: "Benin", Code: "BJ", Dial: "+229"},
{Name: "Bermuda", Code: "BM", Dial: "+1441"},
{Name: "Bhutan", Code: "BT", Dial: "+975"},
{Name: "Bolivia, Plurinational State of", Code: "BO", Dial: "+591"},
{Name: "Bosnia and Herzegovina", Code: "BA", Dial: "+387"},
{Name: "Botswana", Code: "BW", Dial: "+267"},
{Name: "Brazil", Code: "BR", Dial: "+55"},
{Name: "British Indian Ocean Territory", Code: "IO", Dial: "+246"},
{Name: "Brunei Darussalam", Code: "BN", Dial: "+673"},
{Name: "Bulgaria", Code: "BG", Dial: "+359"},
{Name: "Burkina Faso", Code: "BF", Dial: "+226"},
{Name: "Burundi", Code: "BI", Dial: "+257"},
{Name: "Cambodia", Code: "KH", Dial: "+855"},
{Name: "Cameroon", Code: "CM", Dial: "+237"},
{Name: "Canada", Code: "CA", Dial: "+1"},
{Name: "Cape Verde", Code: "CV", Dial: "+238"},
{Name: "Cayman Islands", Code: "KY", Dial: "+345"},
{Name: "Central African Republic", Code: "CF", Dial: "+236"},
{Name: "Chad", Code: "TD", Dial: "+235"},
{Name: "Chile", Code: "CL", Dial: "+56"},
{Name: "China", Code: "CN", Dial: "+86"},
{Name: "Christmas Island", Code: "CX", Dial: "+61"},
{Name: "Cocos (Keeling) Islands", Code: "CC", Dial: "+61"},
{Name: "Colombia", Code: "CO", Dial: "+57"},
{Name: "Comoros", Code: "KM", Dial: "+269"},
{Name: "Congo", Code: "CG", Dial: "+242"},
{Name: "Congo, The Democratic Republic of the Congo", Code: "CD", Dial: "+243"},
{Name: "Cook Islands", Code: "CK", Dial: "+682"},
{Name: "Costa Rica", Code: "CR", Dial: "+506"},
{Name: "Cote d'Ivoire", Code: "CI", Dial: "+225"},
{Name: "Croatia", Code: "HR", Dial: "+385"},
{Name: "Cuba", Code: "CU", Dial: "+53"},
{Name: "Cyprus", Code: "CY", Dial: "+357"},
{Name: "Czech Republic", Code: "CZ", Dial: "+420"},
{Name: "Denmark", Code: "DK", Dial: "+45"},
{Name: "Djibouti", Code: "DJ", Dial: "+253"},
{Name: "Dominica", Code: "DM", Dial: "+1767"},
{Name: "Dominican Republic", Code: "DO", Dial: "+1849"},
{Name: "Ecuador", Code: "EC", Dial: "+593"},
{Name: "Egypt", Code: "EG", Dial: "+20"},
{Name: "El Salvador", Code: "SV", Dial: "+503"},
{Name: "Equatorial Guinea", Code: "GQ", Dial: "+240"},
{Name: "Eritrea", Code: "ER", Dial: "+291"},
{Name: "Estonia", Code: "EE", Dial: "+372"},
{Name: "Ethiopia", Code: "ET", Dial: "+251"},
{Name: "Falkland Islands (Malvinas)", Code: "FK", Dial: "+500"},
{Name: "Faroe Islands", Code: "FO", Dial: "+298"},
{Name: "Fiji", Code: "FJ", Dial: "+679"},
{Name: "Finland", Code: "FI", Dial: "+358"},
{Name: "France", Code: "FR", Dial: "+33"},
{Name: "French Guiana", Code: "GF", Dial: "+594"},
{Name: "French Polynesia", Code: "PF", Dial: "+689"},
{Name: "Gabon", Code: "GA", Dial: "+241"},
{Name: "Gambia", Code: "GM", Dial: "+220"},
{Name: "Georgia", Code: "GE", Dial: "+995"},
{Name: "Germany", Code: "DE", Dial: "+49"},
{Name: "Ghana", Code: "GH", Dial: "+233"},
{Name: "Gibraltar", Code: "GI", Dial: "+350"},
{Name: "Greece", Code: "GR", Dial: "+30"},
{Name: "Greenland", Code: "GL", Dial: "+299"},
{Name: "Grenada", Code: "GD", Dial: "+1473"},
{Name: "Guadeloupe", Code: "GP", Dial: "+590"},
{Name: "Guam", Code: "GU", Dial: "+1671"},
{Name: "Guatemala", Code: "GT", Dial: "+502"},
{Name: "Guernsey", Code: "GG", Dial: "+44"},
{Name: "Guinea", Code: "GN", Dial: "+224"},
{Name: "Guinea-Bissau", Code: "GW", Dial: "+245"},
{Name: "Guyana", Code: "GY", Dial: "+595"},
{Name: "Haiti", Code: "HT", Dial: "+509"},
{Name: "Holy See (Vatican City State)", Code: "VA", Dial: "+379"},
{Name: "Honduras", Code: "HN", Dial: "+504"},
{Name: "Hong Kong", Code: "HK", Dial: "+852"},
{Name: "Hungary", Code: "HU", Dial: "+36"},
{Name: "Iceland", Code: "IS", Dial: "+354"},
{Name: "India", Code: "IN", Dial: "+91"},
{Name: "Indonesia", Code: "ID", Dial: "+62"},
{Name: "Iran, Islamic Republic of Persian Gulf", Code: "IR", Dial: "+98"},
{Name: "Iraq", Code: "IQ", Dial: "+964"},
{Name: "Ireland", Code: "IE", Dial: "+353"},
{Name: "Isle of Man", Code: "IM", Dial: "+44"},
{Name: "Israel", Code: "IL", Dial: "+972"},
{Name: "Italy", Code: "IT", Dial: "+39"},
{Name: "Jamaica", Code: "JM", Dial: "+1876"},
{Name: "Japan", Code: "JP", Dial: "+81"},
{Name: "Jersey", Code: "JE", Dial: "+44"},
{Name: "Jordan", Code: "JO", Dial: "+962"},
{Name: "Kazakhstan", Code: "KZ", Dial: "+77"},
{Name: "Kenya", Code: "KE", Dial: "+254"},
{Name: "Kiribati", Code: "KI", Dial: "+686"},
{Name: "Korea, Democratic People's Republic of Korea", Code: "KP", Dial: "+850"},
{Name: "Korea, Republic of South Korea", Code: "KR", Dial: "+82"},
{Name: "Kuwait", Code: "KW", Dial: "+965"},
{Name: "Kyrgyzstan", Code: "KG", Dial: "+996"},
{Name: "Laos", Code: "LA", Dial: "+856"},
{Name: "Latvia", Code: "LV", Dial: "+371"},
{Name: "Lebanon", Code: "LB", Dial: "+961"},
{Name: "Lesotho", Code: "LS", Dial: "+266"},
{Name: "Liberia", Code: "LR", Dial: "+231"},
{Name: "Libyan Arab Jamahiriya", Code: "LY", Dial: "+218"},
{Name: "Liechtenstein", Code: "LI", Dial: "+423"},
{Name: "Lithuania", Code: "LT", Dial: "+370"},
{Name: "Luxembourg", Code: "LU", Dial: "+352"},
{Name: "Macao", Code: "MO", Dial: "+853"},
{Name: "Macedonia", Code: "MK", Dial: "+389"},
{Name: "Madagascar", Code: "MG", Dial: "+261"},
{Name: "Malawi", Code: "MW", Dial: "+265"},
{Name: "Malaysia", Code: "MY", Dial: "+60"},
{Name: "Maldives", Code: "MV", Dial: "+960"},
{Name: "Mali", Code: "ML", Dial: "+223"},
{Name: "Malta", Code: "MT", Dial: "+356"},
{Name: "Marshall Islands", Code: "MH", Dial: "+692"},
{Name: "Martinique", Code: "MQ", Dial: "+596"},
{Name: "Mauritania", Code: "MR", Dial: "+222"},
{Name: "Mauritius", Code: "MU", Dial: "+230"},
{Name: "Mayotte", Code: "YT", Dial: "+262"},
{Name: "Mexico", Code: "MX", Dial: "+52"},
{Name: "Micronesia, Federated States of Micronesia", Code: "FM", Dial: "+691"},
{Name: "Moldova", Code: "MD", Dial: "+373"},
{Name: "Monaco", Code: "MC", Dial: "+377"},
{Name: "Mongolia", Code: "MN", Dial: "+976"},
{Name: "Montenegro", Code: "ME", Dial: "+382"},
{Name: "Montserrat", Code: "MS", Dial: "+1664"},
{Name: "Morocco", Code: "MA", Dial: "+212"},
{Name: "Mozambique", Code: "MZ", Dial: "+258"},
{Name: "Myanmar", Code: "MM", Dial: "+95"},
{Name: "Namibia", Code: "NA", Dial: "+264"},
{Name: "Nauru", Code: "NR", Dial: "+674"},
{Name: "Nepal", Code: "NP", Dial: "+977"},
{Name: "Netherlands", Code: "NL", Dial: "+31"},
{Name: "Netherlands Antilles", Code: "AN", Dial: "+599"},
{Name: "New Caledonia", Code: "NC", Dial: "+687"},
{Name: "New Zealand", Code: "NZ", Dial: "+64"},
{Name: "Nicaragua", Code: "NI", Dial: "+505"},
{Name: "Niger", Code: "NE", Dial: "+227"},
{Name: "Nigeria", Code: "NG", Dial: "+234"},
{Name: "Niue", Code: "NU", Dial: "+683"},
{Name: "Norfolk Island", Code: "NF", Dial: "+672"},
{Name: "Northern Mariana Islands", Code: "MP", Dial: "+1670"},
{Name: "Norway", Code: "NO", Dial: "+47"},
{Name: "Oman", Code: "OM", Dial: "+968"},
{Name: "Pakistan", Code: "PK", Dial: "+92"},
{Name: "Palau", Code: "PW", Dial: "+680"},
{Name: "Palestinian Territory, Occupied", Code: "PS", Dial: "+970"},
{Name: "Panama", Code: "PA", Dial: "+507"},
{Name: "Papua New Guinea", Code: "PG", Dial: "+675"},
{Name: "Paraguay", Code: "PY", Dial: "+595"},
{Name: "Peru", Code: "PE", Dial: "+51"},
{Name: "Philippines", Code: "PH", Dial: "+63"},
{Name: "Pitcairn", Code: "PN", Dial: "+872"},
{Name: "Poland", Code: "PL", Dial: "+48"},
{Name: "Portugal", Code: "PT", Dial: "+351"},
{Name: "Puerto Rico", Code: "PR", Dial: "+1939"},
{Name: "Qatar", Code: "QA", Dial: "+974"},
{Name: "Reunion", Code: "RE", Dial: "+262"},
{Name: "Romania", Code: "RO", Dial: "+40"},
{Name: "Russia", Code: "RU", Dial: "+7"},
{Name: "Rwanda", Code: "RW", Dial: "+250"},
{Name: "Saint Barthelemy", Code: "BL", Dial: "+590"},
{Name: "Saint Helena, Ascension and Tristan Da Cunha", Code: "SH", Dial: "+290"},
{Name: "Saint Kitts and Nevis", Code: "KN", Dial: "+1869"},
{Name: "Saint Lucia", Code: "LC", Dial: "+1758"},
{Name: "Saint Martin", Code: "MF", Dial: "+590"},
{Name: "Saint Pierre and Miquelon", Code: "PM", Dial: "+508"},
{Name: "Saint Vincent and the Grenadines", Code: "VC", Dial: "+1784"},
{Name: "Samoa", Code: "WS", Dial: "+685"},
{Name: "San Marino", Code: "SM", Dial: "+378"},
{Name: "Sao Tome and Principe", Code: "ST", Dial: "+239"},
{Name: "Saudi Arabia", Code: "SA", Dial: "+966"},
{Name: "Senegal", Code: "SN", Dial: "+221"},
{Name: "Serbia", Code: "RS", Dial: "+381"},
{Name: "Seychelles", Code: "SC", Dial: "+248"},
{Name: "Sierra Leone", Code: "SL", Dial: "+232"},
{Name: "Singapore", Code: "SG", Dial: "+65"},
{Name: "Slovakia", Code: "SK", Dial: "+421"},
{Name: "Slovenia", Code: "SI", Dial: "+386"},
{Name: "Solomon Islands", Code: "SB", Dial: "+677"},
{Name: "Somalia", Code: "SO", Dial: "+252"},
{Name: "South Africa", Code: "ZA", Dial: "+27"},
{Name: "South Georgia and the South Sandwich Islands", Code: "GS", Dial: "+500"},
{Name: "South Sudan", Code: "SS", Dial: "+211"},
{Name: "Spain", Code: "ES", Dial: "+34"},
{Name: "Sri Lanka", Code: "LK", Dial: "+94"},
{Name: "Sudan", Code: "SD", Dial: "+249"},
{Name: "Suriname", Code: "SR", Dial: "+597"},
{Name: "Svalbard and Jan Mayen", Code: "SJ", Dial: "+47"},
{Name: "Swaziland", Code: "SZ", Dial: "+268"},
{Name: "Sweden", Code: "SE", Dial: "+46"},
{Name: "Switzerland", Code: "CH", Dial: "+41"},
{Name: "Syrian Arab Republic", Code: "SY", Dial: "+963"},
{Name: "Taiwan", Code: "TW", Dial: "+886"},
{Name: "Tajikistan", Code: "TJ", Dial: "+992"},
{Name: "Tanzania, United Republic of Tanzania", Code: "TZ", Dial: "+255"},
{Name: "Thailand", Code: "TH", Dial: "+66"},
{Name: "Timor-Leste", Code: "TL", Dial: "+670"},
{Name: "Togo", Code: "TG", Dial: "+228"},
{Name: "Tokelau", Code: "TK", Dial: "+690"},
{Name: "Tonga", Code: "TO", Dial: "+676"},
{Name: "Trinidad and Tobago", Code: "TT", Dial: "+1868"},
{Name: "Tunisia", Code: "TN", Dial: "+216"},
{Name: "Turkey", Code: "TR", Dial: "+90"},
{Name: "Turkmenistan", Code: "TM", Dial: "+993"},
{Name: "Turks and Caicos Islands", Code: "TC", Dial: "+1649"},
{Name: "Tuvalu", Code: "TV", Dial: "+688"},
{Name: "Uganda", Code: "UG", Dial: "+256"},
{Name: "Ukraine", Code: "UA", Dial: "+380"},
{Name: "United Arab Emirates", Code: "AE", Dial: "+971"},
{Name: "United Kingdom", Code: "GB", Dial: "+44"},
{Name: "United States", Code: "US", Dial: "+1"},
{Name: "Uruguay", Code: "UY", Dial: "+598"},
{Name: "Uzbekistan", Code: "UZ", Dial: "+998"},
{Name: "Vanuatu", Code: "VU", Dial: "+678"},
{Name: "Venezuela, Bolivarian Republic of Venezuela", Code: "VE", Dial: "+58"},
{Name: "Vietnam", Code: "VN", Dial: "+84"},
{Name: "Virgin Islands, British", Code: "VG", Dial: "+1284"},
{Name: "Virgin Islands, U.S.", Code: "VI", Dial: "+1340"},
{Name: "Wallis and Futuna", Code: "WF", Dial: "+681"},
{Name: "Yemen", Code: "YE", Dial: "+967"},
{Name: "Zambia", Code: "ZM", Dial: "+260"},
{Name: "Zimbabwe", Code: "ZW", Dial: "+263"},
}