
# Määritysten kattavuus

Phasis tähtää nykyiseen ECMAScript-määritykseen (ES2024+) ja seuraa TC39-ehdotuksia vaiheesta 3 alkaen. Tällä sivulla on ihmisen luettavissa oleva hakemisto siitä, mitä on todella julkaistu.

## Kieli

| Ominaisuus | Tila |
|---|:---:|
| Leksikaaliset määritykset (`let`, `const`) ja TDZ | ✅ |
| Lohko-, funktio- ja moduulikohtainen näkyvyysalue | ✅ |
| Nuolifunktiot (leksikaalinen `this`) | ✅ |
| Oletusparametrit, rest-parametrit, levitys | ✅ |
| Hajautus (taulukko, olio, sisäkkäinen, oletusarvot, rest) | ✅ |
| Malliliteraalit ja tunnisteelliset malliliteraalit | ✅ |
| Lasketut ominaisuuksien nimet | ✅ |
| Lyhennetyt ominaisuudet ja metodit | ✅ |
| Luokat — konstruktorit, metodit, getterit/setterit, staattiset jäsenet | ✅ |
| Luokkakentät (julkiset, yksityiset, staattiset) | ✅ |
| Yksityiset metodit ja aksessorit | ✅ |
| `super` metodeissa ja konstruktoreissa | ✅ |
| Dekoraattorit (vaihe 3) | ✅ |
| Staattiset alustajalohkot | ✅ |
| Valinnainen ketjutus (`?.`), null-arvojen yhdistäminen (`??`) | ✅ |
| Loogiset sijoitusoperaattorit (`&&=`, `\|\|=`, `??=`) | ✅ |
| Numeeriset erottimet (`1_000_000`) | ✅ |
| BigInt-literaalit (`123n`) ja operaattorit | ✅ |
| Asynkroniset funktiot ja generaattorit, ylätason await | ✅ |
| Generaattorit (synkroniset ja asynkroniset) | ✅ |
| `for…of`, `for…in`, `for await…of` | ✅ |
| Iteraattorit ja iteroitavat oliot (Symbol.iterator) | ✅ |
| Symbol-perustyypit ja tunnetut symbolit | ✅ |
| ES-moduulit (`import` / `export`, dynaaminen `import()`) | ✅ |
| `import.meta` | ✅ |
| `import attributes` (vaihe 3) | ✅ |
| Tiukka tila ja Annex B:n vanhat toiminnat | ✅ |
| Säännölliset lausekkeet (`/u`, `/v`, `/d`, nimetyt ryhmät, taaksepäin haku) | ✅ |
| Automaattinen puolipisteiden lisäys (ASI) | ✅ |
| Hashbang-kielioppi (`#!/usr/bin/env phasis`) | ✅ |
| Oikeat häntärekursiokutsut tiukassa tilassa (ES2015, määrityksen vaatima) | ✅ |

## Standardikirjasto

### Perusominaisuudet

| Olio | Kattavuus |
|---|---|
| `Object` | täydellinen — `keys`, `values`, `entries`, `assign`, `create`, `freeze`, `seal`, `getOwnPropertyDescriptor(s)`, `setPrototypeOf`, `getOwnPropertyNames`, `getOwnPropertySymbols`, `hasOwn`, `groupBy`, `fromEntries` jne. |
| `Array` | täydellinen — kaikki prototyyppimetodit, kuten `at`, `flatMap`, `flat`, `findLast`, `findLastIndex`, `toReversed`, `toSorted`, `toSpliced`, `with`, `group`, `groupToMap` |
| `String` | täydellinen — `at`, `codePointAt`, `match`, `matchAll`, `replaceAll`, `padStart`, `padEnd`, `trimStart`, `trimEnd`, `isWellFormed`, `toWellFormed` |
| `Number` | täydellinen — `isFinite`, `isInteger`, `isNaN`, `isSafeInteger`, `EPSILON`, `MAX_SAFE_INTEGER` jne. |
| `BigInt` | täydellinen — mielivaltaisen tarkkuuden laskenta bcmathin avulla |
| `Boolean` | täydellinen |
| `Math` | täydellinen — kaikki metodit ja kaikki NaN-, Infinity- ja -0-erikoistapaukset |
| `JSON` | täydellinen — `parse`, `stringify`, mukautetut korvaajat, palautin, sisennys |
| `Symbol` | täydellinen — `for`, `keyFor`, kaikki tunnetut symbolit, `Symbol.toPrimitive` |
| `Function` | täydellinen — `call`, `apply`, `bind`, `length`, `name`, `prototype`-semantiikka |

### Kokoelmat

| Olio | Kattavuus |
|---|---|
| `Map` | täydellinen, mukaan lukien `groupBy` ja elävä iteraatio |
| `Set` | täydellinen, mukaan lukien `intersection`, `union`, `difference`, `symmetricDifference`, `isSubsetOf`, `isSupersetOf`, `isDisjointFrom` |
| `WeakMap`, `WeakSet`, `WeakRef`, `FinalizationRegistry` | täydellinen |

### Asynkroninen

| Olio | Kattavuus |
|---|---|
| `Promise` | täydellinen — `all`, `race`, `any`, `allSettled`, `withResolvers`, asynkroninen iteraatio |
| `AsyncIterator`, `AsyncGenerator` | täydellinen |
| Mikroprosessoritehtävien ajoitus | ✅ |

### Binääridata

| Olio | Kattavuus |
|---|---|
| `ArrayBuffer`, `SharedArrayBuffer` | täydellinen |
| `DataView` | täydellinen — `getBigInt64`, `setBigInt64` jne. |
| `Int8Array`, `Uint8Array`, `Uint8ClampedArray`, `Int16Array`, `Uint16Array`, `Int32Array`, `Uint32Array`, `BigInt64Array`, `BigUint64Array`, `Float16Array`, `Float32Array`, `Float64Array` | täydellinen |
| `Atomics` — `add`, `sub`, `and`, `or`, `xor`, `compareExchange`, `exchange`, `isLockFree`, `load`, `notify`, `pause`, `store`, `wait`, `waitAsync` | täydellinen (vain yhden agentin tila) |

### Reflektio ja proksyt

| Olio | Kattavuus |
|---|---|
| `Proxy` | kaikki 13 ansaa, peruutettavissa |
| `Reflect` | kaikki 14 staattista metodia |

### Virheet

| Olio | Kattavuus |
|---|---|
| `Error`, `TypeError`, `RangeError`, `ReferenceError`, `SyntaxError`, `URIError`, `EvalError` | täydellinen |
| `AggregateError` | täydellinen |
| `SuppressedError` (vaiheen 3 eksplisiittinen resurssienhallinta) | täydellinen |

### Päivämäärät ja aika

| Olio | Kattavuus |
|---|---|
| `Date` | täydellinen |
| `Temporal` (vaihe 3) | täydellinen — `Now`, `Instant`, `PlainDate`, `PlainTime`, `PlainDateTime`, `PlainYearMonth`, `PlainMonthDay`, `ZonedDateTime`, `Duration`, `TimeZone`, `Calendar` (mukaan lukien heprea, kiina, dangi, etiopia jne.) |

### Kansainvälistäminen

| Olio | Kattavuus |
|---|---|
| `Intl.Locale`, `Intl.Collator`, `Intl.DateTimeFormat`, `Intl.NumberFormat`, `Intl.PluralRules`, `Intl.RelativeTimeFormat`, `Intl.ListFormat`, `Intl.DisplayNames`, `Intl.Segmenter` | täydellinen (käyttää PHPn `intl`-laajennusta, jos se on saatavilla) |

### Resurssienhallinta

| Olio | Kattavuus |
|---|---|
| `DisposableStack`, `AsyncDisposableStack` (vaihe 3) | täydellinen |
| `Symbol.dispose`, `Symbol.asyncDispose` | täydellinen |
| `using` / `await using`-määritykset | täydellinen |

### Muut

| Olio | Kattavuus |
|---|---|
| `RegExp` (mukaan lukien `/v`-joukkomerkintä, nimetyt talteenotot, lookaround, sticky/global-liput) | täydellinen |
| `Iterator`-apufunktiot (vaihe 3) — `map`, `filter`, `take`, `drop`, `flatMap`, `reduce`, `toArray`, `forEach`, `some`, `every`, `find` | täydellinen |
| `ShadowRealm` (vaihe 3) | täydellinen |
| `globalThis` | ✅ |

## Verkkoalustan API:t (WHATWG / W3C, eivät TC39:n)

Puhtaan ECMAScriptin lisäksi Phasis sisältää useita kerroksittaisia Web API -paketteja, joiden olemassaolon oikean maailman JS-kirjastot tarkistavat ennakkoon. Katso [Web API:t](https://phasis.inline0.dev/fi/docs/compatibility/web-apis), jossa kuvataan koko kattavuus ja vaatimustenmukaisuus alueittain.

| Paketti | Globaalit oliot | WPT |
|---|---|---|
| **Verkkoalusta** | `URL`, `URLSearchParams`, `URLPattern`, `TextEncoder`, `TextDecoder`, `atob`, `btoa`, `structuredClone`, `performance`, `console`, `setTimeout` / `setInterval` / `queueMicrotask`, `reportError`, `self` (kohteen `globalThis` alias), `DOMException` | 100 % |
| **Fetch** | `fetch`, `Request`, `Response`, `Headers`, `Body`-mixin, `AbortController`, `AbortSignal`, `Blob`, `File`, `FormData`, `EventTarget`, `Event`, WHATWG Streams kokonaisuudessaan (`ReadableStream`, `WritableStream`, `TransformStream`, jonotusstrategiat, BYOB), `CompressionStream` / `DecompressionStream` (zlib + valinnainen brotli kohteen `ext-brotli` kautta), `navigator` | 100 %¹ |
| **Krypto** | `crypto.getRandomValues`, `crypto.randomUUID`, `SubtleCrypto` kokonaisuudessaan (tiiviste, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA P-256/384/521, ECDH, HKDF, PBKDF2) | 100 % |
| **WebSocket** | `WebSocket` (konstruktori + RFC 6455 -kehyskoodekki, vaihdettava siirtotapa kohteen `setWebSocketTransport` kautta) | 100 % |
| **XHR** | `XMLHttpRequest` + `XMLHttpRequestUpload` + `ProgressEvent` (kerrostettu fetch-siirtotavan päälle, joten käytäntökoukut toimivat) | 100 % |
| **Tapahtumasilmukka** | `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `queueMicrotask`, `AsyncContext` (vaihe 3) | ei sovellu (oracle-testattu) |

¹ Pakkaustestien sallittujen alitestien poikkeukset: brotli-tapaukset, jotka tarvitsevat kohteen `ext-brotli`, sekä tapaukset, joissa käytetään kohteeseen `SharedArrayBuffer` perustuvaa syötettä (`EXPECTED_FAILURES` kohteessa `tests/Wpt/WptTest.php`).

Kaikki muut tuodut Web Platform Tests -testit läpäistään — katso [Web API:t](https://phasis.inline0.dev/fi/docs/compatibility/web-apis) vaatimustenmukaisuuden erittely.

## Mitä ei vielä ole toteutettu

- **SharedArrayBuffer-työntekijöiden semantiikka** yhden agentin ulkopuolella — usean säikeen atominen ilmoitus oikeiden käyttöjärjestelmäsäikeiden välillä vaatii kohteen `pcntl`, eikä sitä ole suunnitelmissa. Yhden agentin atomiset toiminnot toimivat.
- **`Intl.Segmenter`, kun käytössä ovat ICU 76+:aa vaativat grafeemiklusterit** — riippuu isäntäpalvelimen PHPn `intl`-laajennuksen versiosta.

## Versiointi

Phasis noudattaa semveriä. Versiosarja seuraa ECMAScript-määritysluonnoksia:

| Phasis-versio | Määrityksen tavoite | Vaiheen 3 ehdotukset |
|---|---|---|
| 0.x | ES2024 | dekoraattorit, Temporal, eksplisiittinen resurssienhallinta, iteraattorien apufunktiot, joukkometodit |

Version 1.0 julkaisu edellyttää, että kaikki ES2025-luonnoksen vaiheen 4 ehdotukset on toteutettu ja Promise-käsittelyn tyhjennyssemantiikka on vakaa.
