@luwiostack/continent
v0.1.0
Published
Typed ISO 3166 continent data for React — the seven continents, pairing with `@luwiostack/country` for country lookups, with a `<Continent>` provider and `useContinent` hook.
Readme
@luwiostack/continent
Typed ISO 3166 continent data for JavaScript — the seven continents, each grouping the countries
on it. A small, immutable domain model; framework-agnostic (no React required), with an optional
<Continent> provider + useContinent hook at @luwiostack/continent/react.
Part of Luwio — pairs with @luwiostack/country, but carries
no dependency on it: a country knows its continent by continent_code, and the lookup the other
way round lives on Countries.onContinent(continent).
Install
npm install @luwiostack/continentUsage
import { Continent, Continents } from '@luwiostack/continent'
import { Countries, Country } from '@luwiostack/country'
const eu = Continent.europe() // or Continent.new({ code: 'EU' })
eu.code // 'EU'
eu.machine_name // 'europe' — stable, translation-safe key (no display name is exposed)
// Every country on the continent — the lookup lives on Countries, not Continent:
Countries.onContinent(eu).size // European countries (a @luwiostack/country Countries collection)
// From a country to its continent — country carries the code, continent resolves the object:
const be = Country.new({ code: 'BE' })
Continent.of(be).machine_name // 'europe'
// Named helpers for each continent:
Continent.africa() Continent.antarctica() Continent.asia() Continent.europe()
Continent.northAmerica() Continent.oceania() Continent.southAmerica()
// Continents is an immutable, code-deduplicated collection — iterable, with the usual helpers:
Continents.all().size // 7
for (const c of Continents.all()) c.code // 'AF', 'AN', 'AS', 'EU', 'NA', 'OC', 'SA'
Continents.all().map((c) => c.machine_name) // ['africa', 'antarctica', …]
Continents.empty().isEmpty() // trueAn unknown code throws — Continent.new({ code: 'ZZ' }) → Error: Unknown continent code: ZZ
(same for Continent.of, since it resolves via .new). Continent.tryNew({ code: 'ZZ' }) returns
null instead.
React
import { Continent, useContinent } from '@luwiostack/continent/react'
<Continent continent={Continent.europe()}>
<ContinentName />
</Continent>
function ContinentName() {
const { continent } = useContinent() // throws outside a <Continent> provider
return <span>{continent.machine_name}</span>
}API surface
- Domain:
Continent(.new,.tryNew,.of,.africa()….southAmerica()),Continents - React (
/react):<Continent>,useContinent,ContinentContext - Utils:
toMachineName - Types:
IContinent,IContinents
Data
The code ↔ name mapping is baked in — nothing is fetched at runtime. The country ↔ continent
membership is generated from @luwiostack/iso-data onto each country row's continent_code, so
Countries.onContinent(continent) and Continent.of(country) stay in lockstep.
