
# 사양 지원 범위

Phasis는 최신 ECMAScript 사양(ES2024+)을 대상으로 하며 Stage 3 이상인 TC39 제안도 추적합니다. 이 페이지는 실제로 제공되는 기능을 사람이 읽기 쉽게 정리한 색인입니다.

## 언어

| 기능 | 상태 |
|---|:---:|
| TDZ가 적용되는 어휘적 선언(`let`, `const`) | ✅ |
| 블록 스코프, 함수 스코프, 모듈 스코프 | ✅ |
| 어휘적 `this`를 사용하는 화살표 함수 | ✅ |
| 기본 매개변수, 나머지 매개변수, 스프레드 | ✅ |
| 구조 분해(배열, 객체, 중첩, 기본값, 나머지) | ✅ |
| 템플릿 리터럴, 태그 템플릿 | ✅ |
| 계산된 속성 이름 | ✅ |
| 단축 속성 및 메서드 | ✅ |
| 클래스 — 생성자, 메서드, getter/setter, static | ✅ |
| 클래스 필드(공개, 비공개, static) | ✅ |
| 비공개 메서드 및 접근자 | ✅ |
| 메서드 및 생성자의 `super` | ✅ |
| 데코레이터(Stage 3) | ✅ |
| static 초기화 블록 | ✅ |
| 선택적 체이닝(`?.`), 널 병합(`??`) | ✅ |
| 논리 할당 연산자(`&&=`, `\|\|=`, `??=`) | ✅ |
| 숫자 구분자(`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) | ✅ |
| strict 모드 및 Annex B 레거시 동작 | ✅ |
| 정규 표현식(`/u`, `/v`, `/d`, 명명된 그룹, 후방 탐색) | ✅ |
| 자동 세미콜론 삽입(ASI) | ✅ |
| 해시뱅 문법(`#!/usr/bin/env phasis`) | ✅ |
| strict 모드의 적절한 꼬리 호출(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`, 사용자 지정 replacer, 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` | 전체 (사용 가능한 경우 PHP의 `intl` 확장에 위임) |

### 리소스 관리

| 객체 | 적용 범위 |
|---|---|
| `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는 실제 JS 라이브러리가 사전 검사하는 여러 계층형 Web API 팩을 제공합니다. 전체 API 범위와 영역별 적합성은 [Web API](https://phasis.inline0.dev/ko/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 + `ext-brotli`를 통한 선택적 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) | 해당 없음(오라클 테스트 완료) |

¹ 압축 픽스처의 허용 목록 하위 테스트는 제외합니다. `ext-brotli`가 필요한 brotli 사례와 `SharedArrayBuffer` 기반 입력을 전달하는 사례(`tests/Wpt/WptTest.php`의 `EXPECTED_FAILURES`)가 여기에 해당합니다.

가져온 나머지 Web Platform Tests는 모두 통과합니다. 적합성 항목별 결과는 [Web API](https://phasis.inline0.dev/ko/docs/compatibility/web-apis)에서 확인하세요.

## 아직 구현되지 않은 항목

- **단일 에이전트를 넘어서는 SharedArrayBuffer 워커 의미론** — 실제 OS 스레드 간 멀티스레드 원자적 알림에는 `pcntl`가 필요하며 로드맵에 없습니다. 단일 에이전트 원자 연산은 작동합니다.
- **ICU 76+가 필요한 자소 클러스터를 사용하는 `Intl.Segmenter`** — 호스트 PHP의 `intl` 확장 버전에 따라 달라집니다.

## 버전 관리

Phasis는 시맨틱 버저닝을 따릅니다. 버전 계열은 ECMAScript 사양 초안을 기준으로 합니다.

| Phasis 버전 | 사양 대상 | Stage 3 제안 |
|---|---|---|
| 0.x | ES2024 | 데코레이터, Temporal, 명시적 리소스 관리, 이터레이터 헬퍼, 집합 메서드 |

1.0으로 올리려면 ES2025 초안의 모든 Stage 4 제안을 구현하고 안정적인 Promise drain 의미론을 갖춰야 합니다.
