Як долучитися
Оновлення даних
Суди, в'язниці, justitiehuizen / maisons de justice і межі кантонів будуються з офіційних джерел щотижня (як): не редагуйте їх вручну. Виправте парсер у scripts/parse або, якщо помилка в самому джерелі, повідомте про неї суд. Щотижневий pull request переглядається, як і будь-який інший: перед злиттям порівняйте diff із джерелами.
Для наборів даних, які ведуться вручну (апеляційні округи, судові округи, процентні ставки):
- Відредагуйте JSON у
data/. Зберігайте наявні id: проєкти їх зберігають. - Оновіть
lastReviewedдля набору даних уdatapackage.json, якщо ви звірили його з джерелами. pnpm check: перегенерувати типи id і схеми, перевірити типи, lint і форматування, зібрати, запустити тести з покриттям і lint пакета. Команда падає, якщо згенеровані файли не закомічено.- Додайте рядок до
CHANGELOG.mdу розділ Unreleased і закомітьте (включно зіschema/,src/ids.generated.tsіids.lock.json). Результат збірки (dist/) не комітиться: його збирають для кожного релізу і публікують у npm.
Опублікований id залишається: ids.lock.json перелічує їх усі, і тести падають, коли якогось немає в даних. Якщо джерело перейменувало запис, зіставте нову назву з наявним id у парсері; якщо запис припинився, залиште його з validTo. Див. Ідентифікатори.
Кантони й громади
data/cantons.json і data/municipalities.json генеруються; не редагуйте їх вручну. Запустіть pnpm build:cantons (потрібні доступ до мережі та unzip). Команда читає:
- додаток до Gerechtelijk Wetboek / Code judiciaire (Судового кодексу), «Gebiedsomschrijving en zetel van hoven en rechtbanken» (ELI, numac 1967101058), нідерландською і французькою;
- файл Statbel із населенням за громадами — для чинних громад і кодів REFNIS.
Вона розбирає нідерландський і французький тексти окремо і відмовляється щось записувати, якщо вони не збігаються або якщо не кожна громада охоплена рівно один раз (чи поділена між кількома кантонами). Екзоніми, які використовує додаток, але не Statbel (Gembloers, Saint-Nicolas, …), друкарські помилки в додатку і згадки меж, які вона не може розрізнити, перелічено на початку скрипта.
Запускайте її знову після того, як закон змінює додаток або громади об'єднуються. Id кантонів ідуть за місцевою мовою (нідерландська у Фландрії та Брюсселі, французька у Валлонії, німецька в районі Eupen); vredegerecht / justice de paix кантону x має id justice-of-the-peace-x і пов'язаний із ним через своє поле canton.
Набори даних, зібрані з вебсторінок
pnpm fetch:sources # кожне джерело в .sources/ (близько 20 хвилин, чемно)
pnpm fetch:sources courts # або одне джерело
pnpm build:data # перебудувати суди, в'язниці, justitiehuizen, поштові індекси, регіони і провінції з .sources/Межі кантонів беруться з GeoPackage від NGI (джерело ngi), який читається власним SQLite Node; коли NGI перейменовує кантон, зіставте його код з id у CANTON_ALIASES у scripts/parse/boundaries.ts.
Або замість завантаження перейдіть на останні знімки: git worktree add .sources origin/sources.
Джерело — це обхід у scripts/sources/catalog.ts; парсер читає його знімки в scripts/parse. Коли сайт змінює розмітку, тести парсерів у test/parse (на скорочених копіях справжніх сторінок у test/fixtures/sources) показують, що зламалося.
Нові процентні ставки
- Комерційна: FOD Financiën публікує ставку за кожне півріччя. Додайте період із
from,to,rateі датою Staatsblad уnote. - Законна: публікується за кожен календарний рік. Додайте період за рік.
Додавання набору даних
Кожен набір даних отримує однакове поводження, щоб користувачі могли на нього покладатися:
- Дані:
data/<name>.json, масив записів. Кожне значення — з офіційного джерела. - Id: дотримуйтеся правил для ідентифікаторів: офіційний код, якщо він існує, інакше kebab-case у нижньому регістрі з назви місцевою мовою (
scripts/id.ts). - Зв'язки, а не копії: посилайтеся на судові округи, кантони й громади за id і використовуйте спільні типи (
Translated,Address,Contact,SourceRef). - Джерела:
sources: [{ url, retrieved }]у кожному записі і запис уdatapackage.jsonз джерелами набору даних, ліцензією,lastReviewedіreviewEveryMonths. - Типи й допоміжні функції:
src/<name>.ts, експортований ізsrc/index.ts, плюс entry point уtsup.config.tsі вexportsуpackage.json. - Схема: додайте тип файлу до
scripts/schema-types.tsіscripts/build-schemas.ts. - Джерело і парсер: обхід у
scripts/sources/catalog.ts, що завантажує офіційні сторінки, і парсер уscripts/parse, що будує файл зі знімків, із fixtures і тестами. Він читає лише те, що може прочитати напевно, і повідомляє про решту. - Тести: унікальні id, посилання, що розв'язуються, і кількість, яку дає офіційне джерело.
- Документація: сторінка в
docs/data/про те, чим набір корисний, джерело й оновлення, а також таблиця полів.
Перевірки
| Команда | Що робить |
|---|---|
pnpm check | Усе, що запускає CI: generate, typecheck, lint, build, test:coverage, test:package, lint:package і перевірку, що згенеровані файли закомічено |
pnpm test | Модульні тести, тести цілісності, схем і типів на вихідному коді (збірка не потрібна) |
pnpm test:package | Smoke-тести зібраного пакета через import і require(): спершу запустіть pnpm build |
pnpm test:coverage | Те саме, але падає, якщо покриття src/ нижче 100 % |
pnpm lint / pnpm format | ESLint і Prettier: перевірити / виправити |
pnpm generate | Перегенерувати src/ids.generated.ts (типи id) і schema/ з даних і типів та додати нові id до ids.lock.json |
pnpm lint:package | publint і arethetypeswrong на запакованому пакеті |
pnpm test:freshness | Перевірки, що залежать від дати: відсутні ставки, прострочені перегляди. Не входить до check; FRESHNESS_ONLINE=1 перевіряє також URL джерел |
pnpm fetch:sources | Завантажити офіційні джерела в .sources/ |
pnpm build:data | Перебудувати суди, в'язниці, justitiehuizen / maisons de justice, поштові індекси, регіони, провінції і межі кантонів з .sources/ |
pnpm build:csv | Записати дані як CSV-таблиці в csv/ |
Випуск релізу
- Перенесіть записи з Unreleased у
CHANGELOG.mdпід нову версію. - Збільште
versionуpackage.jsonі закомітьте. - Поставте тег і запуште:
git tag v0.3.0 && git push && git push --tags.
Release workflow запускає pnpm check, публікує тег у npm із provenance і створює реліз на GitHub із доданими даними, схемами і CSV-таблицями. Тег має збігатися з version.
Цей вебсайт
Сайт міститься в docs/ і збирається за допомогою VitePress. Інтерактивні таблиці імпортують власні src/ і data/ пакета, тож завжди показують дані з репозиторію.
pnpm docs:dev # локальний сервер з hot reload
pnpm docs:build # статичний сайт у docs/.vitepress/dist
pnpm docs:preview # віддати зібраний сайтКожен push у main розгортає його на GitHub Pages. CI збирає його в кожному pull request, тож зламану сторінку виявляють ще до злиття.
Переклади
Англійські сторінки в docs/ — джерело істини. Кожна інша мова має те саме дерево у власній теці: нідерландська (docs/nl/) і французька (docs/fr/), а також німецька, іспанська, італійська, португальська, польська, турецька, арабська, українська, китайська і японська (docs/de/, docs/es/ і так далі). Це переклади англійської сторінки, і їх оновлюють після її змін. Коли ви змінюєте англійську сторінку, змініть ту саму сторінку і в docs/nl/ та docs/fr/, або вкажіть у pull request, що переклади відстають; інші мови можуть відставати на реліз. Слова теми та інтерактивних компонентів цими іншими мовами містяться в docs/.vitepress/locales/.
Код, id, назви полів і офіційні назви залишаються незмінними в кожній мові, а кожен заголовок зберігає англійський якір (## Heading {#english-anchor}), щоб перехресні посилання і перемикач мов і далі працювали. Бельгійська установа чи правовий термін зберігає свою офіційну нідерландську або французьку назву (або німецьку, де Бельгія її публікує) замість вигаданого перекладу: китайська сторінка пише vredegerecht / justice de paix, а не вигадане для нього слово. Changelog ведеться лише англійською.