
# Охоплення специфікації

Phasis орієнтується на поточну специфікацію ECMAScript (ES2024+) і відстежує пропозиції TC39 зі Stage 3 і вище. На цій сторінці наведено зрозумілий для читача перелік того, що фактично постачається.

## Мова

| Можливість | Статус |
|---|:---:|
| Лексичні оголошення (`let`, `const`) з TDZ | ✅ |
| Область видимості блока, функції та модуля | ✅ |
| Стрілкові функції (з лексичним `this`) | ✅ |
| Параметри за замовчуванням, rest-параметри, spread | ✅ |
| Деструктуризація (масивів, об’єктів, вкладена, значення за замовчуванням, rest) | ✅ |
| Шаблонні рядки, шаблонні рядки з тегами | ✅ |
| Обчислювані назви властивостей | ✅ |
| Скорочений синтаксис властивостей і методів | ✅ |
| Класи — конструктори, методи, гетери/сетери, статичні члени | ✅ |
| Поля класів (публічні, приватні, статичні) | ✅ |
| Приватні методи й аксесори | ✅ |
| `super` у методах і конструкторах | ✅ |
| Декоратори (Stage 3) | ✅ |
| Блоки статичної ініціалізації | ✅ |
| Необов’язковий ланцюжок (`?.`), об’єднання з nullish-значенням (`??`) | ✅ |
| Оператори логічного присвоєння (`&&=`, `\|\|=`, `??=`) | ✅ |
| Роздільники в числах (`1_000_000`) | ✅ |
| Літерали BigInt (`123n`) та оператори | ✅ |
| Асинхронні функції, асинхронні генератори, await верхнього рівня | ✅ |
| Генератори (синхронні й асинхронні) | ✅ |
| `for…of`, `for…in`, `for await…of` | ✅ |
| Ітератори та ітеровані об’єкти (Symbol.iterator) | ✅ |
| Примітиви Symbol і загальновідомі символи | ✅ |
| Модулі ES (`import` / `export`, динамічний `import()`) | ✅ |
| `import.meta` | ✅ |
| `import attributes` (Stage 3) | ✅ |
| Строгий режим і застарілі можливості Annex B | ✅ |
| Регулярні вирази (`/u`, `/v`, `/d`, іменовані групи, lookbehind) | ✅ |
| Автоматична вставка крапки з комою (ASI) | ✅ |
| Граматика hashbang (`#!/usr/bin/env phasis`) | ✅ |
| Коректні хвостові виклики у строгому режимі (ES2015, передбачені специфікацією) | ✅ |

## Стандартна бібліотека

### Основи

| Об’єкт | Охоплення |
|---|---|
| `Object` | повне — `keys`, `values`, `entries`, `assign`, `create`, `freeze`, `seal`, `getOwnPropertyDescriptor(s)`, `setPrototypeOf`, `getOwnPropertyNames`, `getOwnPropertySymbols`, `hasOwn`, `groupBy`, `fromEntries` тощо |
| `Array` | повне — усі методи прототипу, зокрема `at`, `flatMap`, `flat`, `findLast`, `findLastIndex`, `toReversed`, `toSorted`, `toSpliced`, `with`, `group`, `groupToMap` |
| `String` | повне — `at`, `codePointAt`, `match`, `matchAll`, `replaceAll`, `padStart`, `padEnd`, `trimStart`, `trimEnd`, `isWellFormed`, `toWellFormed` |
| `Number` | повне — `isFinite`, `isInteger`, `isNaN`, `isSafeInteger`, `EPSILON`, `MAX_SAFE_INTEGER` тощо |
| `BigInt` | повне — довільна точність через bcmath |
| `Boolean` | повне |
| `Math` | повне — усі методи та особливі випадки для NaN / Infinity / -0 |
| `JSON` | повне — `parse`, `stringify`, користувацькі замінники, reviver, відступи |
| `Symbol` | повне — `for`, `keyFor`, усі загальновідомі символи, `Symbol.toPrimitive` |
| `Function` | повне — семантика `call`, `apply`, `bind`, `length`, `name`, `prototype` |

### Колекції

| Об’єкт | Охоплення |
|---|---|
| `Map` | повне, зокрема `groupBy` і живий обхід |
| `Set` | повне, зокрема `intersection`, `union`, `difference`, `symmetricDifference`, `isSubsetOf`, `isSupersetOf`, `isDisjointFrom` |
| `WeakMap`, `WeakSet`, `WeakRef`, `FinalizationRegistry` | повне |

### Асинхронність

| Об’єкт | Охоплення |
|---|---|
| `Promise` | повне — `all`, `race`, `any`, `allSettled`, `withResolvers`, асинхронна ітерація |
| `AsyncIterator`, `AsyncGenerator` | повне |
| Планування мікрозавдань | ✅ |

### Двійкові дані

| Об’єкт | Охоплення |
|---|---|
| `ArrayBuffer`, `SharedArrayBuffer` | повне |
| `DataView` | повне — `getBigInt64`, `setBigInt64` тощо |
| `Int8Array`, `Uint8Array`, `Uint8ClampedArray`, `Int16Array`, `Uint16Array`, `Int32Array`, `Uint32Array`, `BigInt64Array`, `BigUint64Array`, `Float16Array`, `Float32Array`, `Float64Array` | повне |
| `Atomics` — `add`, `sub`, `and`, `or`, `xor`, `compareExchange`, `exchange`, `isLockFree`, `load`, `notify`, `pause`, `store`, `wait`, `waitAsync` | повне (лише один агент) |

### Рефлексія та проксі

| Об’єкт | Охоплення |
|---|---|
| `Proxy` | усі 13 пасток, можливість відкликання |
| `Reflect` | усі 14 статичних методів |

### Помилки

| Об’єкт | Охоплення |
|---|---|
| `Error`, `TypeError`, `RangeError`, `ReferenceError`, `SyntaxError`, `URIError`, `EvalError` | повне |
| `AggregateError` | повне |
| `SuppressedError` (керування ресурсами, Stage 3) | повне |

### Дати та час

| Об’єкт | Охоплення |
|---|---|
| `Date` | повне |
| `Temporal` (Stage 3) | повне — `Now`, `Instant`, `PlainDate`, `PlainTime`, `PlainDateTime`, `PlainYearMonth`, `PlainMonthDay`, `ZonedDateTime`, `Duration`, `TimeZone`, `Calendar` (зокрема іврит, китайська, Dangi, ефіопська тощо) |

### Інтернаціоналізація

| Об’єкт | Охоплення |
|---|---|
| `Intl.Locale`, `Intl.Collator`, `Intl.DateTimeFormat`, `Intl.NumberFormat`, `Intl.PluralRules`, `Intl.RelativeTimeFormat`, `Intl.ListFormat`, `Intl.DisplayNames`, `Intl.Segmenter` | повне (за наявності делегує розширенню `intl` від PHP) |

### Керування ресурсами

| Об’єкт | Охоплення |
|---|---|
| `DisposableStack`, `AsyncDisposableStack` (Stage 3) | повне |
| `Symbol.dispose`, `Symbol.asyncDispose` | повне |
| оголошення `using` / `await using` | повне |

### Інше

| Об’єкт | Охоплення |
|---|---|
| `RegExp` (зокрема `/v`, іменовані захоплення, пошук навколо збігів, прапорці sticky/global) | повне |
| помічники `Iterator` (Stage 3) — `map`, `filter`, `take`, `drop`, `flatMap`, `reduce`, `toArray`, `forEach`, `some`, `every`, `find` | повне |
| `ShadowRealm` (Stage 3) | повне |
| `globalThis` | ✅ |

## API вебплатформи (WHATWG / W3C, не TC39)

Окрім самого ECMAScript, Phasis постачає кілька рівнів наборів Web API, наявність яких реальні бібліотеки JS попередньо перевіряють. Повний перелік можливостей і відповідність у кожній області див. у розділі [Web API](https://phasis.inline0.dev/uk/docs/compatibility/web-apis).

| Набір | Глобальні об’єкти | WPT |
|---|---|---|
| **Вебплатформа** | `URL`, `URLSearchParams`, `URLPattern`, `TextEncoder`, `TextDecoder`, `atob`, `btoa`, `structuredClone`, `performance`, `console`, `setTimeout` / `setInterval` / `queueMicrotask`, `reportError`, `self` (псевдонім `globalThis`), `DOMException` | 100 % |
| **Fetch** | `fetch`, `Request`, `Response`, `Headers`, міксин `Body`, `AbortController`, `AbortSignal`, `Blob`, `File`, `FormData`, `EventTarget`, `Event`, повний набір WHATWG Streams (`ReadableStream`, `WritableStream`, `TransformStream`, стратегії черг, BYOB), `CompressionStream` / `DecompressionStream` (zlib + необов’язкова підтримка brotli через `ext-brotli`), `navigator` | 100 %¹ |
| **Криптографія** | `crypto.getRandomValues`, `crypto.randomUUID`, повний набір `SubtleCrypto` (digest, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA P-256/384/521, ECDH, HKDF, PBKDF2) | 100 % |
| **WebSocket** | `WebSocket` (конструктор і кодек кадрів RFC 6455, транспорт можна замінити через `setWebSocketTransport`) | 100 % |
| **XHR** | `XMLHttpRequest` + `XMLHttpRequestUpload` + `ProgressEvent` (побудований поверх транспорту fetch, тож застосовуються перехоплювачі політик) | 100 % |
| **Цикл подій** | `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `queueMicrotask`, `AsyncContext` (Stage 3) | н/д (перевірено оракулом) |

¹ Не враховано дозволені підтести у тестових наборах стиснення: випадки brotli, яким потрібен `ext-brotli`, і випадки, де передаються дані `SharedArrayBuffer`, (`EXPECTED_FAILURES` у `tests/Wpt/WptTest.php`).

Усі інші імпортовані Web Platform Tests проходять — таблицю відповідності див. у розділі [Web API](https://phasis.inline0.dev/uk/docs/compatibility/web-apis).

## Що ще не реалізовано

- **Семантика SharedArrayBuffer для робочих потоків** за межами одного агента — атомарне сповіщення між кількома потоками ОС потребує `pcntl` і не входить до планів. Атомарні операції в межах одного агента працюють.
- **`Intl.Segmenter` із кластерами графем, яким потрібен ICU 76+** — залежить від версії розширення `intl` хоста PHP.

## Версіонування

Phasis дотримується semver. Лінійка версій відповідає чернеткам специфікації ECMAScript:

| Версія Phasis | Цільова специфікація | Пропозиції Stage 3 |
|---|---|---|
| 0.x | ES2024 | декоратори, Temporal, явне керування ресурсами, допоміжні засоби ітераторів, методи множин |

Перехід до 1.0 залежить від реалізації кожної пропозиції Stage 4 із чернетки ES2025 і стабільної семантики спорожнення черги Promise.
