ドラフト ECMA-426 / 2026年3月14日
ソースマップ形式仕様
はじめに
本Ecma規格は、トランスパイルされたソースコードを元のソースへマッピングするためのソースマップ形式を定義します。
ソースマップ形式の目標は以下の通りです:
ソースレベルのデバッグをサポートし、双方向マッピングを可能にする
サーバーサイドのスタックトレースの難読化解除をサポートする
オリジナルソース マップ形式(v1)は、Closure
Inspectorで最適化されたJavaScriptコードのソースレベルのデバッグを可能にするためにJoseph
Schorrによって作成されました(この形式自体は言語非依存です)。しかし、ソースマップを利用するプロジェクトの規模が拡大するにつれて、フォーマットの冗長性が問題となり始めました。v2形式(Source Map Revision 2
Proposal )は、いくらかの単純さと柔軟性を犠牲にフォーマット全体のサイズを削減するために作成されました。v2による変更を踏まえても、ソースマップファイルサイズが有用性を制限していました。v3形式は、Pavel
Podivilov (Google) の提案に基づいています。
ソースマップ形式はもはやバージョン番号を持たず、常に "3" と固定されています。
2023~2024年にかけて、ソースマップ形式はより正確なEcma規格へと発展し、多くの人々の大きな貢献がありました。さらなるソースマップ形式の改良はTC39-TG4からも期待されています。
Asumu Takikawa、Nicolò Ribaudo、Jon Kuperman
ECMA-426 第1版 プロジェクト編集者
1 適用範囲
本規格は、JavaScript、WebAssembly、CSSへとコンパイルされたコードのデバッグ体験を向上させるために、様々な開発ツールが使用するソースマップ形式を定義します。
2 適合性
適合するソースマップ文書は、本仕様で詳述された構造に準拠したJSON文書です。
適合するソースマップ生成器は、適合するソースマップ文書を生成し、その生成物が本仕様のアルゴリズムで(オプションのものも含めて)エラーの報告なしにデコードできるようにするべきです。
適合するソースマップ消費者は、ソースマップ文書の取得(該当する場合)、およびデコードのために、本仕様で規定されたアルゴリズムを実装する必要があります。適合する消費者は、仕様がアルゴリズムにオプションでエラーを報告 できることを示している場合には、エラーを無視したり、終了せずに報告することが許されます。
3 参考文献
以下の文書は本文中で参照されており、その内容の一部または全体が本書の要求事項となる場合があります。発行日付きの参照については記載された版のみが適用されます。発行日なしの参照については、参照文書の最新の版(および修正版等)が適用されます。
3.1 標準文献
ECMA-262, ECMAScript® 言語仕様 .
https://tc39.es/ecma262/
ECMA-404, JSONデータ交換形式 .
https://www.ecma-international.org/publications-and-standards/standards/ecma-404/
3.2 参考文献(情報提供)
IETF RFC 4648, Base16, Base32, Base64 データエンコーディング .
https://datatracker.ietf.org/doc/html/rfc4648
WebAssembly コア仕様 .
https://www.w3.org/TR/wasm-core-2/
WHATWG Encoding .
https://encoding.spec.whatwg.org/
WHATWG Fetch .
https://fetch.spec.whatwg.org/
WHATWG Infra .
https://infra.spec.whatwg.org/
WHATWG URL .
https://url.spec.whatwg.org/
4 表記規約
この仕様は ECMA-262(表記規約)
で定義される表記規約に従い、本節で示す拡張を含みます。
4.1 アルゴリズム規約
4.1.1 暗黙の完了
この仕様で宣言されるすべての 抽象操作
は、アルゴリズムで宣言された戻り型を含む、正常完了 またはthrow完了 を返すものと暗黙的にみなされます。例えば、次のような抽象操作は:
4.1.1.1 GetTheAnswer ( input )
抽象操作GetTheAnswerは引数input (整数 )を受け取り、整数 を返します。
これは以下と同等です:
4.1.1.2 GetTheAnswer2 ( input )
抽象操作GetTheAnswer2は引数input (整数 )を受け取り、正常完了 を含む整数 、またはthrow完了 のいずれかを返します。
すべての 抽象操作
への呼び出しで
完了レコード
を返すものは、
明示的に Completion
呼び出しでラップされていない限り、
ReturnIfAbrupt マクロで暗黙的にラップされていると見なされます。例えば:
result を GetTheAnswer (value )
とする。
second を Completion (GetTheAnswer (value ))
とする。
これは次と等価です:
result を ReturnIfAbrupt(GetTheAnswer (value ))
とする。
second を Completion (GetTheAnswer (value ))
とする。
4.1.2 オプションエラー
アルゴリズムがオプションでエラーを報告 する場合、実装は次のいずれかの挙動が選択できます:
アルゴリズムの残りを継続して実行する。
(たとえばブラウザコンソールで)ユーザーにエラーを報告し、アルゴリズムの残りを継続して実行する。
ThrowCompletion を返す。
実装はオプションエラーごとに異なる挙動を選択できます。
4.2 文法表記
この仕様はECMA-262(文法表記) で定義される文法表記慣習に従い、以下に記す留意点があります:
本仕様で定義される文法の終端記号は個々のコードポイントです。これはECMA-262の字句文法 に類似し、ECMA-262の構文文法 とは異なります。
本仕様は文法パラメータ や先読み制約 を使用せず、文法定義の複雑さを低減しています。
5 用語と定義
この文書の目的では、以下の用語と定義が適用されます。
生成コード
コンパイラまたはトランスパイラによって生成されたコード。
オリジナルソース
コンパイラやトランスパイラを通していないソースコード。
ソースマップURL
URL で生成コード からソースマップの場所を参照します。
カラム(column)
生成コード の行内で0始まりのインデックスを持つオフセット。JavaScriptとCSSのソースマップについてはUTF-16コード単位として、WebAssemblyソースマップについてはバイナリ内容(1行に表現)でのバイトインデックスとして算出します。
注
つまり"A"(LATIN CAPITAL LETTER A)は1コード単位、"🔥"(FIRE)は2コード単位で計測されます。他のコンテンツタイプのソースマップではこれと異なる場合があります。
6 base64 VLQ
base64 VLQ はbase64 でエンコードされた可変長数量 であり、最上位ビット(6ビット目)が継続ビットとして使われ、"数字"は文字列において下位から順にエンコードされ、最初の数字の最下位ビットが符号ビットとして使われます。
注1
base64
VLQエンコーディングで表現可能な値は、現時点では32ビット数量に制限されています(より大きな値の利用例が提示されるまで)。このため、32ビットを超える値は無効となり、実装はそれらを拒否する場合があります。符号ビットもこの制限に含まれますが、継続ビットは含みません。
注2
文字列"iB"は2つの数字からなるbase64
VLQを表します。最初の数字"i"はビットパターン0b100010をエンコードしており、これは継続ビットが1(VLQは継続)、符号ビットが0(非負)、値ビットが0b0001です。2つ目の数字Bはビットパターン0b000001をエンコードしており、継続ビットが0、符号ビットなし、値ビットが0b00001です。このVLQ文字列のデコード結果は数値17です。
注3
文字列"V"は1つの数字からなるbase64
VLQを表します。数字"V"はビットパターン0b010101をエンコードしており、継続ビットが0(継続なし)、符号ビットが1(負)、値ビットが0b1010です。このVLQ文字列のデコード結果は数値-10です。
base64 VLQは以下の字句文法に従います:
Vlq ::
VlqDigitList
VlqDigitList ::
TerminalDigit
ContinuationDigit
VlqDigitList
TerminalDigit ::
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
a
b
c
d
e
f
ContinuationDigit ::
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
0
1
2
3
4
5
6
7
8
9
+
/
6.1 VLQSignedValue
構文指示操作 VLQSignedValueは引数を取らず、整数 を返します。次の生成規則に対して分割定義されます:
Vlq :: VlqDigitList
unsigned に、VLQUnsignedValue (VlqDigitList )を代入する。
もしunsigned modulo 2 =
1なら、sign は-1とする。
それ以外なら、sign は1とする。
value にfloor (unsigned /
2)を代入する。
もしvalue が0かつsign が-1なら、-231 を返す。
もしvalue が231 以上なら、エラーを投げる。
sign × value を返す。
注
ステップ
6 のチェックは、
unsigned が
VLQUnsignedValue (
VlqDigitList )の値であり、
Vlq の値でないため必要です。
6.2 VLQUnsignedValue
構文指示操作 VLQUnsignedValueは引数を取らず非負の整数 を返します。次の生成規則に対して分割定義されます:
Vlq :: VlqDigitList
value に、VLQUnsignedValue (VlqDigitList )を代入する。
もしvalue が232 以上なら、エラーを投げる。
value を返す。
VlqDigitList ::
ContinuationDigit
VlqDigitList
left に VLQUnsignedValue (ContinuationDigit
のもの)を設定する。
right に VLQUnsignedValue (VlqDigitList のもの)を設定する。
left + right × 25 を返す。
TerminalDigit ::
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
a
b
c
d
e
f
この生成規則によりマッチされた文字をdigit とする。
整数 であるdigit に対応する値を、IETF
RFC 4648で定義されるbase64 エンコーディングに従いvalue とする。
アサート :value < 32。
value を返す。
ContinuationDigit ::
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
0
1
2
3
4
5
6
7
8
9
+
/
この生成規則によりマッチされた文字をdigit とする。
整数 であるdigit に対応する値を、IETF
RFC 4648で定義されるbase64 エンコーディングに従いvalue とする。
アサート :32 ≤
value < 64。
value - 32を返す。
7 JSON値ユーティリティ
この仕様のアルゴリズムはECMA-262の内部仕様上で定義されていますが、非JavaScriptプラットフォームでも簡単に実装できるよう設計されています。本節では、JSON値 を扱うためのユーティリティを提供し、ECMA-262の詳細を抽象化します。
JSON値 は、JSONオブジェクト 、JSON配列 、文字列 、数値 、真偽値 、またはnull です。
JSONオブジェクト は、各プロパティについて:
JSON配列 は、以下の条件を満たすJSONオブジェクト です:
キーが"length" で値が数値 のプロパティを持つこと
他のすべてのプロパティのキーが整数インデックス であること
7.1 ParseJSON ( string )
抽象操作ParseJSONは引数string (文字列)を受け取り、JSON値 を返します。処理手順:
result にCall (%JSON.parse% ,
null , « string » )を代入する。
Assert :result はJSON値 であること。
result を返す。
編集者注
この抽象操作はECMA-262自体によって公開される予定です:
tc39/ecma262#3540
7.2 JSONObjectGet ( object , key )
抽象操作JSONObjectGetはobject (JSONオブジェクト )とkey (文字列)を受け取り、JSON値 またはmissing を返します。指定したkey に対応する値を返します。手順:
もしobject がkey の独自プロパティを持たない場合、missing を返す。
prop にobject のkey の独自プロパティを代入する。
prop の[[Value]] 属性を返す。
7.3 JSONArrayIterate ( array )
抽象操作JSONArrayIterateはarray (JSON配列 )を受け取り、List (JSON値 のリスト)を返します。「For
each」による反復用に全ての要素が入ったListを返します。手順:
length にJSONObjectGet (array ,
"length" )を設定する。
アサート :length は非負の整数値 である。
list に新しい空のList を設定する。
i に0を設定する。
i < ℝ (length ) の間繰り返す:
value にJSONObjectGet (array , ToString (𝔽 (i )))を設定する。
アサート :value はmissing でない。
value をlist に追加する。
i をi +1に設定する。
list を返す。
7.4 StringSplit ( string , separators )
抽象操作 StringSplit は、引数 string (文字列)と separators (空でない文字列の
リスト )を受け取り、文字列の
リスト を返します。
この操作は、separators の任意の要素で区切られた部分文字列に string を分割します。
複数のセパレーターが一致する場合、separators 内で先に現れるものが優先されます。
この操作が呼び出された時、以下の手順を実行します:
parts に新しい空のリスト を設定する。
strLen にstring の長さを設定する。
lastStart に0を設定する。
i に0を設定する。
i < strLen の間繰り返す:
matched にfalse を設定する。
separators の各String sep について:
sepLen にsep の長さを設定する。
candidate に、substring (string ,
i , min (i
+ sepLen , strLen )) を設定する。
もしcandidate =sep かつ
matched がfalse なら:
chunk にsubstring (string ,
lastStart , i ) を設定する。
chunk をparts に追加する。
lastStart にi + sepLen を設定する。
i にi + sepLen を設定する。
matched にtrue を設定する。
もしmatched がfalse なら、i にi + 1を設定する。
chunk にsubstring (string ,
lastStart , strLen ) を設定する。
chunk をparts に追加する。
parts を返す。
8 位置型
8.1 位置レコード
位置レコード は、非負の行番号と非負のカラム 番号からなるタプルです:
表1: 位置レコード のフィールド
8.2 元位置レコード
元位置レコード は、デコードソースレコード 、非負の行、非負のカラム 番号からなるタプルです。位置レコード に似ていますが、具体的なオリジナルソース ファイル上のソース位置を記述します。
表2: 元位置レコード のフィールド
8.3 ComparePositions ( first , second )
抽象操作 ComparePositions は、引数 first (Position
Record または Original Position
Record )および second
(Position
Record または Original Position
Record )を取り、lesser 、equal 、または
greater を返す。これは first が second より前か等しいか後かに応じて、それぞれ
lesser 、equal 、greater
を返す。Original Position Records の [[Source]] フィールドは無視される。呼び出されたとき、次のステップを実行する:
もしfirst .[[Line]] < second .[[Line]] であれば、lesser を返す。
もしfirst .[[Line]] > second .[[Line]] であれば、greater を返す。
アサート : first .[[Line]] はsecond .[[Line]] と等しい。
もしfirst .[[Column]] < second .[[Column]] であれば、lesser を返す。
もしfirst .[[Column]] > second .[[Column]] であれば、greater を返す。
equal を返す。
9 ソースマップ形式
ソースマップは、以下の構造をもつトップレベルのJSONオブジェクト を含むJSONドキュメントです:
{
"version" : 3 ,
"file" : "out.js" ,
"sourceRoot" : "" ,
"sources" : [ "foo.js" , "bar.js" ] ,
"sourcesContent" : [ null , null ] ,
"names" : [ "src" , "maps" , "are" , "fun" ] ,
"mappings" : "A,AAAB;;ABCDE" ,
"ignoreList" : [ 0 ]
}
version フィールド は、常に整数 として3でなければなりません。それ以外の値の場合、ソースマップは拒否されることがあります。
file フィールド は、このソースマップが関連付けられている生成コード の名前(オプション)です。この値がURL や相対パス、単なるベース名であるかは明記されていません。ソースマップ生成ツールは利用環境に応じて適切に解釈できます。
sourceRoot
フィールド はサーバ上でソースファイルを移動したり、sourcesエントリで値の重複を避けるためのソースルート文字列(オプション)です。個々のsourcesフィールド 項目の前にこの値が追加されます。
sources フィールド は、mappingsフィールド で使われる元となるソースのリストです。各項目は(相対の可能性もある)URL の文字列か、ソース名がわからない場合はnull になります。
sourcesContent
フィールド は、ソースをホストできない場合に使われる、元ソース(original
source )の文字列リスト(オプション)です。内容はsourcesフィールド と同じ順序で並びます。一部のoriginal
sources は名前で取得するため、エントリがnull になる場合もあります。
names フィールド は、mappingsフィールド で使われる場合がある記号名のリスト(オプション)です。
mappings
フィールド は、マッピングデータがエンコードされた文字列です(セクション9.2 参照)。
ignoreList
フィールド は、フレームワークコードやバンドラーgenerated
code など、サードパーティコードとみなすべきファイルのインデックスのリスト(オプション)です。これにより、開発者ツールは事前設定不要で、開発者が見たりステップ実行したりしたくないコードを回避できます。これはsourcesフィールド を参照し、ソースマップ内で判明しているすべてのサードパーティソースのインデックスを列挙します。ignoreListが存在しない場合、一部のブラウザでは廃止されたx_google_ignoreListフィールドも利用される可能性があります。
9.1 ソースマップのデコード
デコード済みソースマップレコード は以下のフィールドを持ちます:
表3: デコード済みソースマップレコード のフィールド
フィールド名
値の型
[[File]]
String または null
[[Sources]]
List (デコード済みソースレコード の)
[[Mappings]]
List (デコード済みマッピングレコード の)
デコード済みソースレコード は以下のフィールドを持ちます:
表4: デコード済みソースレコード のフィールド
フィールド名
値の型
[[URL]]
URL または
null
[[Content]]
String または null
[[Ignored]]
Boolean
9.1.1 ParseSourceMap ( string , baseURL )
抽象操作 ParseSourceMap は、引数 string (String 型)および baseURL
(URL )を取り、
Decoded Source Map Record
を返す。呼び出されたとき、次のステップを実行する:
json に ParseJSON (string ) を設定する。
json が JSON オブジェクト でなければ、エラーをスローする。
JSONObjectGet (json ,
"sections" ) が missing でなければ、
DecodeIndexSourceMap (json ,
baseURL ) を返す。
DecodeSourceMap (json ,
baseURL ) を返す。
9.1.2 DecodeSourceMap ( json , baseURL )
抽象操作 DecodeSourceMap は、引数 json (JSON オブジェクト )および
baseURL (URL )を取り、
Decoded Source Map Record
を返す。呼び出されたとき、次のステップを実行する:
JSONObjectGet (json ,
"version" ) が 3 𝔽 でなければ、オプションでエラーを報告 してよい。
mappingsField に JSONObjectGet (json ,
"mappings" ) を設定する。
mappingsField が String
でない 場合、エラーをスローする。
JSONObjectGet (json ,
"sources" ) が JSON 配列 でなければ、エラーをスローする。
fileField に GetOptionalString (json ,
"file" ) を設定する。
sourceRootField に GetOptionalString (json ,
"sourceRoot" ) を設定する。
sourcesField に GetOptionalListOfOptionalStrings (json ,
"sources" ) を設定する。
sourcesContentField に GetOptionalListOfOptionalStrings (json ,
"sourcesContent" ) を設定する。
ignoreListField に GetOptionalListOfArrayIndexes (json ,
"ignoreList" ) を設定する。
sources に DecodeSourceMapSources (baseURL ,
sourceRootField , sourcesField , sourcesContentField ,
ignoreListField ) を設定する。
namesField に GetOptionalListOfStrings (json ,
"names" ) を設定する。
mappings に DecodeMappings (mappingsField ,
namesField , sources ) を設定する。
mappings を昇順にソートする。Decoded Mapping
Record a が Decoded Mapping
Record b より小さいのは、
ComparePositions (a .[[GeneratedPosition]] , b .[[GeneratedPosition]] ) が lesser の場合とする。
Decoded Source Map Record {
[[File]] : fileField , [[Sources]] :
sources , [[Mappings]] : mappings }
を返す。
9.1.2.1 GetOptionalString ( object , key )
抽象操作 GetOptionalString は、引数 object (JSON オブジェクト )と
key (String 型)を取り、String または null を返す。呼び出されたとき、次のステップを実行する:
value に JSONObjectGet (object ,
key ) を設定する。
value が String
であれば 、value を返す。
value が missing でなければ、オプションでエラーを報告 してよい。
null を返す。
9.1.2.2 GetOptionalListOfStrings ( object ,
key )
抽象操作 GetOptionalListOfStrings は、引数 object (JSON オブジェクト )および
key (String 型)を取り、
List (String
のリスト)を返す。呼び出されたとき、次のステップを実行する:
list に新しい空の List
を設定する。
values を JSONObjectGet (object ,
key ) に設定する。
values が missing であれば、list を返す。
values が JSON 配列 でなければ、
オプションでエラーを報告 してよい。
list を返す。
JSONArrayIterate (values )
の各要素 item について、
item が String
であれば 、
item を list に追加する。
それ以外の場合、
オプションでエラーを報告 してよい。
"" を list に追加する。
list を返す。
9.1.2.3 GetOptionalListOfOptionalStrings ( object ,
key
)
抽象操作 GetOptionalListOfOptionalStrings は、引数 object (JSON
オブジェクト )と
key (String 型)を取り、
List
(String または null の List)を返す。呼び出されたとき、次のステップを実行する:
list に新しい空の List
を設定する。
values を JSONObjectGet (object ,
key ) に設定する。
values が missing であれば、list を返す。
values が JSON 配列 でなければ、
オプションでエラーを報告 してよい。
list を返す。
JSONArrayIterate (values )
の各要素 item について、
item が String
であれば 、
item を list に追加する。
それ以外の場合、
item ≠ null であれば、オプションでエラーを報告 してよい。
null を list に追加する。
list を返す。
9.1.2.4 GetOptionalListOfArrayIndexes ( object ,
key )
抽象操作 GetOptionalListOfArrayIndexes は、引数 object (オブジェクト)と
key (String 型)を取り、
非負の 整数 の
List を返す。
呼び出されたとき、次のステップを実行する:
list を新しい空の リスト
とする。
values を JSONObjectGet (object ,
key ) とする。
もし values が missing ならば、list を返す。
もし values が JSON配列 でなければ、次を行う:
(オプションで)エラーを報告する 。
list を返す。
JSONArrayIterate (values )
の各要素 item について、次を実行する:
もし item が 整数の数値型
であり、
item ≥ +0 𝔽 ならば:
ℝ (item )
を list に追加する。
それ以外の場合:
(オプションで)エラーを報告する 。
list を返す。
9.2 マッピングの構造
mappings フィールド
のデータは次のように分割される:
生成ファイルの各行を表すグループはセミコロン(;)で区切られる
各セグメントはカンマ(,)で区切られる
各セグメントは 1, 4, または 5 個の可変長フィールドからなる
各セグメント内のフィールドは次の通り:
このセグメントが表す生成コード
の行の、0始まりの開始カラム 。これが最初のセグメントの最初のフィールド、または新しい生成行(;)の直後の最初のセグメントの最初のフィールドの場合は、全体の
base64
VLQ を格納する。それ以外の場合、このフィールドには前回のこのフィールドの値からの相対値を base64 VLQ
で格納する。これは以下のフィールドとは異なり、前回値が行ごとにリセットされる点に注意。
存在する場合、sources リストへの 0 始まりのインデックス。このフィールドは前回のこのフィールドからの相対的な base64 VLQ となる。ただし最初の発生時は全体の値を格納する。
存在する場合、元のソース の 0
始まりの開始行。このフィールドは前回のこのフィールドからの相対の base64 VLQ となる。ただし最初の発生時は全体の値を格納する。source
フィールドがある場合は必須。
存在する場合、元のソース の行の 0 始まりの開始
カラム 。このフィールドは前回のこのフィールドからの相対の
base64
VLQ となる。ただし最初の発生時は全体の値を格納する。source フィールドがある場合は必須。
存在する場合、このセグメントに関連付けられた names リストへの 0 始まりのインデックス。このフィールドは前回のこのフィールドからの相対の base64 VLQ
となる。ただし最初の発生時は全体の値を格納する。
注 1
このエンコーディングの目的はソースマップのサイズを削減すること。VLQ エンコーディングによって、Google
カレンダーでのテストでは
Source Map Revision 2 Proposal 比で 50% 減少した。
注 2
1 フィールドのセグメントは、
元のソース
が存在しないため、対応する
生成コード がマッピングされていないことを表す(例:コンパイラ生成コード)。4
フィールドのセグメントは対応する name が存在しないマッピング済みコードを表す。5 フィールドのセグメントはネームもマッピングされているコードを表す。
注 3
file
のオフセットの使用も検討されたが、プラットフォーム固有の改行でずれが生じないよう、line/column データの使用が採用された。
Decoded Mapping
Record には次のフィールドがある:
表 5: Decoded Mapping Record のフィールド
9.2.1 マッピングの文法
MappingsField :
LineList
LineList :
Line
Line
;
LineList
Line :
MappingList opt
MappingList :
Mapping
Mapping
,
MappingList
Mapping :
GeneratedColumn
GeneratedColumn
OriginalSource
OriginalLine
OriginalColumn
Name opt
GeneratedColumn :
Vlq
OriginalSource :
Vlq
OriginalLine :
Vlq
OriginalColumn :
Vlq
Name :
Vlq
Decode
Mapping State Record には次のフィールドがある:
表 6: Decode Mapping State Record
のフィールド
フィールド名
値の型
[[GeneratedLine]]
非負の 整数
[[GeneratedColumn]]
非負の 整数
[[SourceIndex]]
非負の 整数
[[OriginalLine]]
非負の 整数
[[OriginalColumn]]
非負の 整数
[[NameIndex]]
非負の 整数
9.2.1.1 DecodeMappingsField
構文指示付き操作
DecodeMappingsField は、引数 state (Decode Mapping State
Record )、mappings (リスト (Decoded
Mapping Records )のリスト)、names (リスト (Stringのリスト))、sources (リスト (Decoded
Source Records のリスト))を取る。この操作は下記の生成規則ごとに分割して定義される。
LineList :
Line
;
LineList
DecodeMappingsField を Line に state ,
mappings , names , sources を引数として実行する。
state .[[GeneratedLine]] に state .[[GeneratedLine]] + 1 を設定する。
state .[[GeneratedColumn]] に 0 を設定する。
DecodeMappingsField を LineList に state ,
mappings , names , sources を引数として実行する。
Line : [empty]
何もせず return する。
MappingList :
Mapping
,
MappingList
DecodeMappingsField を Mapping に state ,
mappings , names , sources を引数として実行する。
DecodeMappingsField を MappingList に
state , mappings , names , sources
を引数として実行する。
Mapping :
GeneratedColumn
DecodeMappingsField を GeneratedColumn に
state , mappings , names , sources
を引数として実行する。
もし state .[[GeneratedColumn]] < 0 ならば
オプションでエラーを報告 してよい。
return する。
position に新しい Position Record { [[Line]] : state .[[GeneratedLine]] , [[Column]] :
state .[[GeneratedColumn]] } を設定する。
decodedMapping に新しい DecodedMappingRecord { [[GeneratedPosition]] : position , [[OriginalPosition]] : null , [[Name]] : null } を設定する。
decodedMapping を mappings に追加する。
Mapping :
GeneratedColumn
OriginalSource
OriginalLine
OriginalColumn
Name opt
DecodeMappingsField を GeneratedColumn に
state , mappings , names , sources
を引数として実行する。
もし state .[[GeneratedColumn]] < 0 ならば
オプションでエラーを報告 してよい。
return する。
generatedPosition に新しい Position Record
{ [[Line]] : state .[[GeneratedLine]] , [[Column]] :
state .[[GeneratedColumn]] } を設定する。
DecodeMappingsField を OriginalSource に
state , mappings , names , sources
を引数として実行する。
DecodeMappingsField を OriginalLine に
state , mappings , names , sources
を引数として実行する。
DecodeMappingsField を OriginalColumn に
state , mappings , names , sources
を引数として実行する。
もし state .[[SourceIndex]] < 0 または
state .[[SourceIndex]] ≥ sources の要素数
または state .[[OriginalLine]] < 0 または
state .[[OriginalColumn]] < 0 ならば
オプションでエラーを報告 してよい。
originalPosition に null を設定する。
それ以外の場合、
originalPosition に新しい Original Position
Record { [[Source]] :
sources [state .[[SourceIndex]] ], [[Line]] :
state .[[OriginalLine]] , [[Column]] : state .[[OriginalColumn]] } を設定する。
name に null を設定する。
もし Name が存在する場合、
DecodeMappingsField を
Name に
state , mappings , names , sources
を引数として実行する。
もし state .[[NameIndex]] < 0 または
state .[[NameIndex]] ≥ names
の要素数であれば、オプションでエラーを報告 してよい。
それ以外の場合、name に names [state .[[NameIndex]] ] を設定する。
decodedMapping に新しい DecodedMappingRecord { [[GeneratedPosition]] : generatedPosition , [[OriginalPosition]] : originalPosition , [[Name]] : name } を設定する。
decodedMapping を mappings に追加する。
GeneratedColumn
:
Vlq
relativeColumn に VLQSignedValue (Vlq の値)を設定する。
state .[[GeneratedColumn]] に
state .[[GeneratedColumn]] +
relativeColumn を設定する。
OriginalSource :
Vlq
relativeSourceIndex に VLQSignedValue (Vlq の値)を設定する。
state .[[SourceIndex]] に state .[[SourceIndex]] + relativeSourceIndex を設定する。
OriginalLine :
Vlq
relativeLine に VLQSignedValue (Vlq の値)を設定する。
state .[[OriginalLine]] に state .[[OriginalLine]] + relativeLine を設定する。
OriginalColumn :
Vlq
relativeColumn に VLQSignedValue (Vlq の値)を設定する。
state .[[OriginalColumn]] に state .[[OriginalColumn]] + relativeColumn を設定する。
Name :
Vlq
relativeName に VLQSignedValue (Vlq の値)を設定する。
state .[[NameIndex]] に state .[[NameIndex]] + relativeName を設定する。
9.2.2 DecodeMappings ( rawMappings , names ,
sources )
抽象操作 DecodeMappings は、引数 rawMappings (String 型)、names
(String
のリスト )、
sources (リスト (Decoded Source
Records ))を取り、
Decoded Mapping
Record のリストを返す。呼び出されたとき、次のステップを実行する:
mappings に新しい空の リスト
を設定する。
mappingsNode に、rawMappings を MappingsField を ゴール記号 としてパースしたときのルート
Parse Node
を設定する。
パースに失敗した場合、
オプションでエラーを報告 してよい。
mappings を返す。
すべてのフィールドが 0 に設定された新しい Decode Mapping State Record を
state に設定する。
DecodeMappingsField を
mappingsNode に state , mappings , names ,
sources を引数として実行する。
mappings を返す。
9.2.3 生成されたJavaScriptコードのマッピング
生成コード の位置でmapping エントリーとなりうるものは、ECMAScript字句文法 に則り、入力要素 で定義されます。マッピングエントリは次のいずれかを指す必要があります:
IdentifierName 、PrivateIdentifier 、Punctuator 、DivPunctuator 、RightBracePunctuator 、NumericLiteral 、RegularExpressionLiteral で一致したソーステキストの最初のコードポイント。
Comment 、HashbangComment 、StringLiteral 、Template 、TemplateSubstitutionTail 、WhiteSpace 、LineTerminator で一致したソーステキストのいずれかのコードポイント。
9.2.4 生成JavaScriptコードの名前
ソースマップ生成ツールは、次の場合、JavaScriptトークンについて[[Name]] フィールドを持つmapping エントリを生成するべきです:
元ソース の言語構造が意味的に生成されたJavaScriptコードに対応する。
元ソース の言語構造が名前を持つ。
その場合、mapping エントリの[[Name]] は元ソース 言語構造の名前となります。非nullな[[Name]] を持つmapping は名前付きマッピング と呼ばれます。
注1
ミニファイアによる関数名や変数名の変更、即時実行関数式からの関数名の削除などのケース。
以下の列挙は、ECMAScript構文文法 の生成規則と、その右辺のトークン・非終端で、ソースマップ生成ツールが名前付きマッピングを出力すべきものです。これらのトークンのために作成されるmapping エントリは、9.2.3 に従います。
この列挙は「最低限」として扱います。一般に、ソースマップ生成ツールは追加の名前付きマッピングを自由に生成して構いません。
注2
この列挙には、生成ツールが「may(推奨)」として名前付きマッピングを出力するケースも含まれています。既存ツールが名前付きマッピングを出力・要求する現実を反映しています。重複した名前付きマッピングはほぼコストゼロです:namesへのインデックスは互いに相対で符号化されるので、同一名への連続したマッピングは0(A)として符号化されます。
LexicalDeclaration 、VariableStatement 、FormalParameterList に含まれるBindingIdentifier 。
FunctionDeclaration 、FunctionExpression 、AsyncFunctionDeclaration 、AsyncFunctionExpression 、GeneratorDeclaration 、GeneratorExpression 、AsyncGeneratorDeclaration 、AsyncGeneratorExpression に存在する場合はBindingIdentifier 、存在しない場合はFormalParameters の直前の開き括弧(。
ソースマップ生成ツールはBindingIdentifier の有無に関わらず、開き括弧にも名前付きマッピングを出力してもよい。
ArrowFunction またはAsyncArrowFunction の場合:
ArrowFunction が単一BindingIdentifier でArrowParameters となる場合またはAsyncArrowFunction がAsyncArrowBindingIdentifier となる場合の=>トークン。
注3
これは(async)アロー関数が単一パラメータかつ括弧で囲まれていないケースを指します。
ArrowFunction またはAsyncArrowFunction がArrowFormalParameters で生成される場合の開き括弧(。
ソースマップ生成ツールは前のケースとの一貫性のため、=>トークンにも追加で名前付きマッピングを出力しても良い。
MethodDefinition のClassElementName (ジェネレータ、asyncメソッド、asyncジェネレータ、アクセサ含む)。MethodDefinition 内でClassElementName が"constructor" なら[[Name]] は元のクラス名(該当する場合)とする。
ソースマップ生成ツールは開き括弧(にも追加で名前付きマッピングを出力してもよい。
ソースマップ生成ツールはExpression 内のIdentifierReference に対して名前付きマッピングを出力してもよい。
9.3 ソースの解決
sourceRootを前に付加した後でも、sourcesが絶対URLでない場合は、HTMLドキュメント内のscriptのsrc属性を解決するように、ソースマップを基準に相対的に解決されます。
9.3.1 DecodeSourceMapSources ( baseURL ,
sourceRoot , sources , sourcesContent , ignoreList )
抽象操作 DecodeSourceMapSources は、引数 baseURL (URL )、
sourceRoot (String または null )、sources (リスト 。各要素は
String または null )、
sourcesContent (リスト 。各要素は
String または null )、
ignoreList (リスト 。各要素は0以上の整数 )
を受け取り、リスト (各要素は
Decoded
Source Record ) を返す。呼び出されたとき、次の手順を行う:
decodedSources を新しい空の リスト
とする。
sourcesContentCount を sourcesContent の要素数とする。
sourceUrlPrefix を "" とする。
もし sourceRoot ≠ null ならば、次を行う:
もし sourceRoot がコードポイント U+002F(SOLIDUS)で終わる場合、
sourceUrlPrefix に sourceRoot を設定する。
それ以外の場合:
sourceUrlPrefix に sourceRoot と
"/" の連結 結果を設定する。
index を 0 とする。
index < sources の長さ の間、繰り返す:
source を sources [index ] とする。
decodedSource を Decoded Source
Record { [[URL]] :
null , [[Content]] :
null , [[Ignored]] :
false }
とする。
もし source ≠ null ならば:
source を sourceUrlPrefix と source
の連結 結果とする。
sourceURL を URL
解析
の結果(引数は source および baseURL )とする。
もし sourceURL が failure ならば、(オプションで)エラーを報告 する。
それ以外の場合、decodedSource .[[URL]] に
sourceURL を設定する。
もし ignoreList が index
を含んでいれば、decodedSource .[[Ignored]] に
true を設定する。
もし sourcesContentCount > index
ならば、decodedSource .[[Content]] に
sourcesContent [index ] を設定する。
decodedSource を decodedSources に追加する。
index に index + 1 を設定する。
decodedSources を返す。
注
複数のURL を同じ値で異なる内容を持つ複数ソースの表示をサポートしていない実装は、URL ごとにいずれかの内容を任意に選択することになります。
9.4 拡張
ソースマップ利用者は追加の認識されないプロパティを無視し、ソースマップの拒否につなげてはならず、このフォーマットが既存ユーザーを壊すことなく追加機能拡張できるようにすべきです。
10 インデックスソースマップ
生成コード の連結や他の一般的な後処理をサポートするため、ソースマップの別表現がサポートされています:
{
"version" : 3 ,
"file" : "app.js" ,
"sections" : [
{
"offset" : { "line" : 0 , "column" : 0 } ,
"map" : {
"version" : 3 ,
"file" : "section.js" ,
"sources" : [ "foo.js" , "bar.js" ] ,
"names" : [ "src" , "maps" , "are" , "fun" ] ,
"mappings" : "AAAA,E;;ABCDE"
}
} ,
{
"offset" : { "line" : 100 , "column" : 10 } ,
"map" : {
"version" : 3 ,
"file" : "another_section.js" ,
"sources" : [ "more.js" ] ,
"names" : [ "more" , "is" , "better" ] ,
"mappings" : "AAAA,E;AACA,C;ABCDE"
}
}
]
}
インデックスマップは標準のマップと同じ形式に従います。通常のソースマップのように、ファイルフォーマットはJSONでトップレベルはオブジェクトです。通常のソースマップと同じくversionやfileフィールド を持ちますが、さらに新しいsectionsフィールド が追加されています。
sectionsフィールド は、以下のフィールドを持つオブジェクトの配列です:
offsetフィールド は、lineとcolumnの2つのフィールドを持つオブジェクトで、参照されるソースマップが表す生成コード のオフセットを示します。
mapフィールド は埋め込み形式の完全なソースマップオブジェクトです。埋め込みマップは外側のインデックスマップから値を継承しません。
sectionsは開始位置でソートされ、各sectionが表す部分は重なってはいけません。
10.1 DecodeIndexSourceMap ( json , baseURL )
抽象演算DecodeIndexSourceMapは、引数json (Object型)とbaseURL (URL 型)を受け取り、Decoded Source Map
Record を返します。呼び出し時に行う手順は次のとおりです:
sectionsField に JSONObjectGet (json ,
"sections" ) を設定する。
アサート :
sectionsField は missing ではない。
sectionsField が JSON 配列 でなければ、エラーをスローする。
JSONObjectGet (json ,
"version" )
が 3 𝔽 でなければ、オプションでエラーを報告 してよい。
fileField に GetOptionalString (json ,
"file" ) を設定する。
sourceMap に Decoded Source Map Record { [[File]] : fileField , [[Sources]] : « », [[Mappings]] :
« » } を設定する。
previousOffsetPosition に null を設定する。
previousLastMapping に null を設定する。
JSON値 section について、JSONArrayIterate (sectionsField )
の各要素ごとに、
section が JSON オブジェクト でなければ、
オプションでエラーを報告 してよい。
そうでなければ、
offset に JSONObjectGet (section ,
"offset" ) を設定する。
offset が JSON オブジェクト でなければ、エラーをスローする。
offsetLine に JSONObjectGet (offset ,
"line" ) を設定する。
offsetColumn に JSONObjectGet (offset ,
"column" ) を設定する。
offsetLine が 整数値
Number でなければ、
オプションでエラーを報告 してよい。
offsetLine に +0 𝔽 を設定する。
offsetColumn が 整数値
Number でなければ、
オプションでエラーを報告 してよい。
offsetColumn に +0 𝔽 を設定する。
offsetPosition に新しい Position
Record { [[Line]] :
offsetLine , [[Column]] :
offsetColumn } を設定する。
previousOffsetPosition ≠ null ならば、
ComparePositions (offsetPosition ,
previousOffsetPosition ) が lesser
の場合、オプションでエラーを報告 してよい。
previousLastMapping ≠ null ならば、
ComparePositions (offsetPosition ,
previousLastMapping .[[GeneratedPosition]] ) が
lesser の場合、オプションでエラーを報告 してよい。
注: この箇所でのデコードアルゴリズムは index ソースマップの sections
フィールド のエントリが順序付きで重複していないことを検証する。ジェネレーターが重複する
section を持つ index source map を生成することは想定されていないが、source map の利用側は、例えば
section の offset が順序付きであるかの簡易的な条件のみをチェックする場合がある。
mapField に JSONObjectGet (section ,
"map" ) を設定する。
mapField が JSON オブジェクト でなければ、エラーをスローする。
decodedSectionCompletion に Completion (DecodeSourceMap (json ,
baseURL )) を設定する。
decodedSectionCompletion が throw
completion であれば、
オプションでエラーを報告 してよい。
そうでなければ、
decodedSection に decodedSectionCompletion .[[Value]] を設定する。
Decoded Source
Record
additionalSource について、decodedSection .[[Sources]] の全要素で、
sourceMap .[[Sources]] に
additionalSource が含まれていなければ、
additionalSource を
sourceMap .[[Sources]] に追加する。
offsetMappings に新しい空の リスト
を設定する。
Decoded Mapping
Record mapping
について、decodedSection .[[Mappings]]
の全要素で、
mapping .[[GeneratedPosition]] .[[Line]] = 0 の場合、
mapping .[[GeneratedPosition]] .[[Column]] に
mapping .[[GeneratedPosition]] .[[Column]] +
offsetColumn を設定する。
mapping .[[GeneratedPosition]] .[[Line]] に mapping .[[GeneratedPosition]] .[[Line]] +
offsetLine を設定する。
mapping を offsetMappings に追加する。
sourceMap .[[Mappings]] に
リスト結合
によって
sourceMap .[[Mappings]] と
offsetMappings を設定する。
previousOffsetPosition に offsetPosition を設定する。
offsetMappings が空でなければ、previousLastMapping に
offsetMappings の最後の要素を設定する。
sourceMap を返す。
注
実装によっては、マッピングを連結せず各sectionを個別に保存しバイナリサーチするなどの方法も選択できます。
11 ソースマップの取得
11.1 生成コードとソースマップのリンク
ソースマップ形式は言語やプラットフォームに依存しないことを意図していますが、ウェブサーバでホストされる JavaScript
という想定されたユースケースに対してどのように参照されるかを定義することは有用です。
ソースマップを出力にリンクする方法は2つあります。1つ目はHTTPヘッダーの追加のためサーバーの対応が必要で、2つ目はソース内にアノテーションを書く方法です。
ソースマップは WHATWG URL で定義される URL を使ってリンクされます。特に、URI
に使えない文字はパーセントエンコードされる必要があり、data URI であってもかまいません。sourcesContent と共に data URI
を使用することで、完全に自己完結したソースマップが可能になります。
HTTP の sourcemap ヘッダーはソース注記よりも優先され、両方が存在する場合は、ヘッダーの URL
を使ってソースマップファイルを解決すべきです。
ソースマップURL
を取得する方法にかかわらず、解決処理は同じであり、手順は下記の通りです。
ソースマップURL
が絶対URLでない場合、生成コード の ソースオリジン を基準とします。ソースオリジン は次のいずれかのケースで決定されます:
11.1.2 インラインアノテーションによるリンク
生成コード
には、sourceMappingURL という名前のコメント(またはその言語やフォーマットに応じた同等の構文)を含め、その中にソースマップの URL
を記述する必要があります。本仕様は JavaScript、CSS、および WebAssembly においてコメントがどのような形式になるべきかを定義します。他の言語も同様の方式に従うべきです。
特定言語においては sourceMappingURL
コメントの検出方法が複数あり得ます。さまざまな実装がそれぞれにとってより複雑でないものを選択できるようにするためです。生成コード が 一意にソースマップへリンクする とは、すべての抽出法の結果が同じとなる場合を指します。
ツールが 一意にソースマップへリンクする
1つ以上のソースファイルを消費し、ソースマップをリンクする出力ファイルを生成する場合、出力も 一意に リンクしなければなりません。
注
以下の JavaScript コードはソースマップへリンクしていますが、一意には リンクしていません:
let a = `
//# sourceMappingURL=foo.js.map
// `
これから ソースマップURL
をパースで抽出
した場合は foo.js.map であり、パースなしで抽出
した場合は null となります。
module に module_decode (bytes )
を設定する。
module が WebAssembly エラー
ならば、null を返す。
module の各 カスタムセクション
customSection について、
name に customSection の name を設定する。
CodePointsToString (name )
が "sourceMappingURL" ならば、
value に customSection の bytes を設定する。
CodePointsToString (value )
を返す。
null を返す。
WebAssembly はテキスト形式ではなく、コメントもサポートしていないため、ひとつの明確な抽出法のみをサポートする。URL
は WebAssembly の名前 としてエンコードされ、カスタムセクション
の内容として配置される。sourceMappingURL という名前の カスタムセクション
を2つ以上生成することは、WebAssembly コード生成ツールにとって不正である。
11.2 ソースマップの取得処理
11.2.1 FetchSourceMap ( url )
抽象操作 FetchSourceMap は、引数 url (URL 型)を取り、
Promise を返す。呼び出されたとき、次のステップを実行する:
promiseCapability に NewPromiseCapability (%Promise% )
を設定する。
request に request の新しいインスタンスで、その
request URL を
url とするものを設定する。
processResponseConsumeBody に 抽象クロージャ (パラメータ
(response , bodyBytes )、promiseCapability と
url をキャプチャ)の新しいインスタンスを設定し、呼び出されたら次を実行:
bodyBytes が null または
failure であれば、
Call (promiseCapability .[[Reject]] , undefined , « 新しい
TypeError » ) を実行する。
return。
url の スキーム が HTTP(S) スキーム
であり、 バイト列
`)]}'` が
バイト列接頭辞
として bodyBytes に現れる場合、
繰り返し、bodyBytes の 長さ
≠ 0 かつ bodyBytes [0] が HTTP
改行バイト ではない間、
bodyBytes の 0 番目の要素を除去する。
bodyString に Completion (UTF-8
デコード (bodyBytes )) を設定する。
IfAbruptRejectPromise (bodyString ,
promiseCapability ) を実行。
jsonValue に Completion (ParseJSON (bodyString ))
を設定する。
IfAbruptRejectPromise (jsonValue ,
promiseCapability ) を実行。
Call (promiseCapability .[[Resolve]] , undefined , «
jsonValue » ) を実行する。
fetch で request
を発行し、processResponseConsumeBody
を processResponseConsumeBody に設定する。
promiseCapability .[[Promise]] を返す。
注
歴史的な理由から、HTTP(S) でソースマップを配信する際に、サーバが )]}' で始まる行を
ソースマップの先頭に付加する場合がある。
)] } 'garbage here
{ "version" : 3 , ...}
これは次のように解釈される:
{ "version" : 3 , ...}
12 ソースマップレコードの操作
ソースマップをデコードした後、ソースマップ利用者は得られた Decoded Source Map
Records
を使ってデバッグなどの用途で位置情報を調べることができます。このセクションでは、ソースマップ利用者がサポートするであろう典型的な操作の挙動について説明します。
GetOriginalPositions 操作は、生成コード 中のある位置に対応する 元のソース
の位置を問い合わせるために使うことができます。たとえばデバッガで 生成コード
上のユーザーのマウスクリックから 元のソース 側にジャンプする用途などに利用されます。
12.1 GetOriginalPositions ( sourceMapRecord ,
generatedPosition )
抽象操作 GetOriginalPositions は、引数 sourceMapRecord (Decoded Source Map
Record )と generatedPosition (Position
Record )を取り、
リスト (Original Position
Records のリスト)を返す。呼び出されたとき、次のステップを実行する:
mappings に sourceMapRecord .[[Mappings]]
を設定する。
last に null を設定する。
originalPositions に新しい空の リスト
を設定する。
mappings の各要素 mapping について、逆順で繰り返す:
last が null ならば、
ComparePositions (mapping .[[GeneratedPosition]] , generatedPosition )
の結果が
lesser または equal ならば、
last に mapping を設定する。
last が null でなければ、
mappings の各要素 mapping について、繰り返す:
ComparePositions (last .[[GeneratedPosition]] , mapping .[[GeneratedPosition]] ) の結果が
equal ならば、
mapping .[[OriginalPosition]] を
originalPositions に追加する。
originalPositions を返す。
Annex A (informative) 慣例
ソースマップの取扱いや生成時には次の慣例に従うべきです。
A.1 ソースマップ命名規則
一般的に、ソースマップは生成されたファイル名に.map拡張子をつけ同名で作成されます。例:page.jsの場合、page.js.mapというソースマップが生成されます。
A.2 evalコードの名前付き生成コードへのリンク
evalコードにソースマップを利用するための既存の慣例があり、次の形式を取ります:
これはGive your eval a name with //@
sourceURL で説明されています。
Annex B (informative) 注釈
B.1 言語非依存のスタックマッピング
ソース言語の知識なしでのスタックトレースマッピングは本書では対象外 です。
B.2 多段階マッピング
DSL(テンプレート)からの生成やTypeScript → JavaScript → minified
JavaScriptといった複数段の変換を経た最終ソースマップが生成されるケースが一般的になっています。この問題は二通りで対応可能です。一つは単純ですが情報損失が発生する方法で、中間ステップをデバッグ用途では無視し、翻訳過程の位置情報を無視して(中間変換を「元ソース」とみなす)、または位置情報を引き継いで(中間変換は隠される)扱う方法です。より完全な方法は多段階のマッピングをサポートするものです。元ソース側もソースマップ参照を持つ場合、ユーザーはそれも利用可能です。
ただし、JavaScript以外で「ソースマップ参照」が何なのかは未定義です。特に、JavaScript形式の一行コメントをサポートしない言語でソースマップ参照がどんな形式になるかは不明です。
Annex C (informative) 他仕様で定義されている用語
本書で使われている用語・アルゴリズムのうち、ECMA-262以外の外部仕様で定義されるものを列挙します。
WebAssembly Core Specification <https://www.w3.org/TR/wasm-core-2/ >
custom section ,
module_decode ,
WebAssembly error ,
WebAssembly names
WHATWG Encoding <https://encoding.spec.whatwg.org/ >
UTF-8 decode
WHATWG Fetch <https://fetch.spec.whatwg.org/ >
fetch ,
HTTP newline byte ,
processResponseConsumeBody ,
request ,
request URL
WHATWG Infra <https://infra.spec.whatwg.org/ >
byte sequence ,
byte-sequence-prefix ,
byte-sequence-length ,
WHATWG URL <https://url.spec.whatwg.org/ >
HTTP(S) scheme ,
scheme ,
URL ,
URL parsing
Annex D (informative) 参考文献
IETF RFC 4648, The Base16, Base32, and Base64 Data Encodings , available at <https://datatracker.ietf.org/doc/html/rfc4648 >
ECMA-262, ECMAScript® Language Specification , available at <https://tc39.es/ecma262/ >
ECMA-404, The JSON Data Interchange Format , available at <https://www.ecma-international.org/publications-and-standards/standards/ecma-404/ >
WebAssembly Core Specification , available at <https://www.w3.org/TR/wasm-core-2/ >
WHATWG Encoding , available at <https://encoding.spec.whatwg.org/ >
WHATWG Fetch , available at <https://fetch.spec.whatwg.org/ >
WHATWG Infra , available at <https://infra.spec.whatwg.org/ >
WHATWG URL , available at <https://url.spec.whatwg.org/ >
Give your eval a name with //@ sourceURL ,
Firebug (2009), available at <http://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/ >
Source Map Revision 2 Proposal , John Lenz (2010),
available at <https://docs.google.com/document/d/1xi12LrcqjqIHTtZzrzZKmQ3lbTv9mKrN076UB-j3UZQ/ >
可変長数量 , Wikipedia,
available at <https://en.wikipedia.org/wiki/Variable-length_quantity >
Annex E (informative) コロフォン
この仕様書は、GitHub 上で、Ecmarkup というプレーンテキストソース形式で作成されています。EcmarkupはHTMLとMarkdownの方言であり、プレーンテキストでECMAScript仕様書を執筆し、文書の編集上の慣例に従った本格的なHTMLレンダリングへと処理できるフレームワークとツールセットを提供します。Ecmarkupは、構文定義用のGrammarkdown や、アルゴリズム手順記述用のEcmarkdown など、様々なフォーマットや技術を統合しています。この仕様書のPDFレンダリングは、HTMLレンダリングをPDF印刷することで作成されています。
この仕様書の初版は、Bikeshed という、HTMLとMarkdownをベースにした別のプレーンテキストソース形式で作成されました。
標準化以前のバージョンはGoogle Docsで執筆されました。
Copyright & Software License
Ecma International
Rue du Rhone 114
CH-1204 Geneva
Tel: +41 22 849 6000
Fax: +41 22 849 6001
Web: https://ecma-international.org/
Copyright Notice
COPYRIGHT NOTICE
© 2026 Ecma International
By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and
will
comply with the following terms and conditions.
This document may be copied, published and distributed to others, and certain derivative works of it
may be
prepared, copied, published, and distributed, in whole or in part, provided that the above copyright
notice
and this Copyright License and Disclaimer are included on all such copies and derivative works. The
only
derivative works that are permissible under this Copyright License and Disclaimer are:
(i) works which incorporate all or portion of this document for the purpose of providing commentary
or
explanation (such as an annotated version of the document),
(ii) works which incorporate all or portion of this document for the purpose of incorporating
features that
provide accessibility,
(iii) translations of this document into languages other than English and into different formats and
(iv) works by making use of this specification in standard conformant products by implementing (e.g.
by copy
and paste wholly or partly) the functionality therein.
However, the content of this document itself may not be modified in any way, including by removing
the
copyright notice or references to Ecma International, except as required to translate it into
languages other
than English or into a different format.
The official version of an Ecma International document is the English language version on the Ecma
International website. In the event of discrepancies between a translated version and the official
version,
the official version shall govern.
The limited permissions granted above are perpetual and will not be revoked by Ecma International or
its
successors or assigns.
This document and the information contained herein is provided on an “AS IS” basis and ECMA
INTERNATIONAL
DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE
OF THE
INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF
MERCHANTABILITY OR
FITNESS FOR A PARTICULAR PURPOSE.
Software License
All Software contained in this document ("Software") is protected by copyright and is being made
available
under the "BSD License", included below. This Software may be subject to third party rights (rights from
parties
other than Ecma International), including patent rights, and no licenses under such third party rights
are
granted under this license even if the third party concerned is a member of Ecma International. SEE THE
ECMA
CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://ecma-international.org/memento/codeofconduct.htm
FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA
INTERNATIONAL
STANDARDS.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that
the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and
the
following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the
following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the authors nor Ecma International may be used to endorse or promote products
derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.