?ue/p1-90`https://tc39.es/ecma426/ にある文書は、最も正確で最新のソースマップ仕様である。これは、直近に公開されたスナップショットの内容に加えて、次のスナップショットに含まれる変更を含んでいる。
この仕様は GitHub 上で開発されている。この仕様の開発に貢献する方法はいくつかある:
この文書がどのように作成されているかについての詳細は、
この Ecma 標準は、トランスパイルされたソースコードを元のソースへ対応付けるために使用される Source map 形式を定義する。
source map 形式には、次の目標がある:
source map 形式には、もはやバージョン番号はなく、代わりに常に “3” へハードコードされている。
2023-2024 年に、source map 形式は、多くの人々からの大きな貢献により、より精密な Ecma 標準へと発展した。source map 形式に対する今後の反復作業は TC39-TG4 から行われることが期待されている。
Asumu Takikawa, Nicolò Ribaudo, Jon Kuperman
ECMA-426, 第 1 版, プロジェクト編集者
この標準は、JavaScript、WebAssembly、および CSS にコンパイルされたコードのデバッグ体験を向上させるために、さまざまな種類の開発者ツールによって使用される source map 形式を定義する。
適合する source map 文書は、この仕様で詳述される構造に適合する JSON 文書である。
適合する source map 生成器は、適合する source map 文書であり、エラー(任意として指定されているものを含む)を報告することなくこの仕様のアルゴリズムによって復号できる文書を生成するべきである。
適合する source map 消費者は、source map 文書を取得(該当する場合)および復号するために、この仕様で指定されているアルゴリズムを実装するべきである。適合する消費者は、仕様がアルゴリズムにおいて任意にエラーを報告してよいことを示している場合、そのエラーを無視するか、終了せずに報告することが許可される。
以下の文書は、その内容の一部または全部がこの文書の要件を構成するような形で本文中から参照されている。日付付き参照については、引用された版のみが適用される。日付なし参照については、参照された文書の最新版(すべての修正を含む)が適用される。
ECMA-262, ECMAScript® Language Specification.
https://tc39.es/ecma262/
ECMA-404, The JSON Data Interchange Format.
https://www.ecma-international.org/publications-and-standards/standards/ecma-404/
IETF RFC 4648, The Base16, Base32, and Base64 Data Encodings.
https://datatracker.ietf.org/doc/html/rfc4648
WebAssembly Core Specification.
https://www.w3.org/TR/wasm-core-2/
WHATWG Encoding.
https://encoding.spec.whatwg.org/
WHATWG
https://fetch.spec.whatwg.org/
WHATWG Infra.
https://infra.spec.whatwg.org/
WHATWG
https://url.spec.whatwg.org/
この仕様は、ECMA-262(表記上の規約)で定義されるものと同じ表記上の規約に従い、この節で定義される拡張を加える。
この仕様で宣言されるすべての抽象操作は、暗黙に、アルゴリズムが宣言した戻り型を含む
4.1.1.1 GetTheAnswer ( input: an integer, ): an integer
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
次と等価である:
4.1.1.2 GetTheAnswer2 ( input: an integer, ): either a normal completion containing an integer or a throw completion
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
completion record を返す抽象操作へのすべての呼び出しは、明示的な ? completion record をアンラップするための省略記法によってラップされているものと暗黙に仮定される。例えば:
1. _result_ を GetTheAnswer(_value_) とする。
1. _second_ を Completion(GetTheAnswer(_value_)) とする。
これは次と等価である:
1. _result_ を ? GetTheAnswer(_value_) とする。
1. _second_ を Completion(GetTheAnswer(_value_)) とする。
アルゴリズムが任意にエラーを報告する場合、実装は次のいずれかの振る舞いを選択してよい:
実装は、異なる任意のエラーに対して異なる振る舞いを選択できる。
この仕様は、ECMA-262(文法表記)で定義されるものと同じ文法表記上の規約に従うが、次の注意点がある:
この文書の目的において、次の用語および定義が適用される。
コンパイラーまたはトランスパイラーによって生成されるコード。
コンパイラーまたはトランスパイラーを通されていないソースコード。
生成コードから source map の場所を参照する
生成コードの行内におけるゼロ基点のインデックス付きオフセットであり、JavaScript および CSS の source map では UTF-16 符号単位として計算され、WebAssembly source map ではバイナリー内容(単一行として表される)内のバイトインデックスとして計算される。
LATIN CAPITAL LETTER A)が 1 符号単位として測定され、“🔥”(FIRE)が 2 符号単位として測定されることを意味する。他の内容型の source map はこれと異なる場合がある。base64 VLQ は、
"iB" は、2 桁の base64 VLQ を表す。最初の桁 "i" はビットパターン 0b100010 を符号化し、これは継続ビット 1(VLQ は継続する)、符号ビット 0(非負)、および値ビット 0b0001 を持つ。2 番目の桁 B はビットパターン 0b000001 を符号化し、これは継続ビット 0、符号ビットなし、および値ビット 0b00001 を持つ。この VLQ 文字列を復号すると数値 17 になる。
"V" は、1 桁の base64 VLQ を表す。桁 "V" はビットパターン 0b010101 を符号化し、これは継続ビット 0(継続なし)、符号ビット 1(負)、および値ビット 0b1010 を持つ。この VLQ 文字列を復号すると数値 -10 になる。
base64 VLQ は、次の字句文法に従う:
The
1. _unsigned_ を |VlqDigitList| の VLQUnsignedValue とする。
1. _unsigned_ modulo 2 = 1 ならば、_sign_ を -1 とする。
1. そうでなければ、_sign_ を 1 とする。
1. _value_ を floor(_unsigned_ / 2) とする。
1. _value_ が 0 かつ _sign_ が -1 ならば、-231 を返す。
1. [id="step-VLQSignedValue-boundary-check"] _value_ が ≥ 231 ならば、エラーを投げる。
1. _sign_ × _value_ を返す。
The
1. _value_ を |VlqDigitList| の VLQUnsignedValue とする。
1. _value_ が ≥ 232 ならば、エラーを投げる。
1. _value_ を返す。
1. _left_ を |ContinuationDigit| の VLQUnsignedValue とする。
1. _right_ を |VlqDigitList| の VLQUnsignedValue とする。
1. _left_ + _right_ × 25 を返す。
1. _digit_ を、この生成規則に一致した文字とする。
1. _value_ を、IETF RFC 4648 で定義される base64 符号化に従って、_digit_ に対応する整数とする。
1. Assert: _value_ < 32。
1. _value_ を返す。
1. _digit_ を、この生成規則に一致した文字とする。
1. _value_ を、IETF RFC 4648 で定義される base64 符号化に従って、_digit_ に対応する整数とする。
1. Assert: 32 ≤ _value_ < 64。
1. _value_ - 32 を返す。
この仕様のアルゴリズムは ECMA-262 の内部仕様の上に定義されているが、非 JavaScript プラットフォームでも容易に実装できることを意図している。この節には、文書の残りの部分から ECMA-262 の詳細を抽象化し、JSON 値を扱うためのユーティリティが含まれる。
JSON value は、
JSON object は、その各プロパティが次の条件を満たす Object である:
JSON array は、次の条件を満たす
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _result_ を Call(%JSON.parse% , *null*, « _string_ ») とする。 1. Assert: _result_ は JSON value である。 1. _result_ を返す。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. これは、object 内で指定された key に関連付けられた値を返す。 It performs the following steps when called:
1. _object_ がキー _key_ を持つ own property を持たない場合、~missing~ を返す。
1. _prop_ を、キーが _key_ である _object_ の own property とする。
1. _prop_ の [[Value]] 属性を返す。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. これは、“For each” を使用するアルゴリズムによって反復できるように、array のすべての要素を含む
1. _length_ を JSONObjectGet(_array_, *"length"*) とする。
1. Assert: _length_ は非負の整数 Number である。
1. _list_ を新しい空の List とする。
1. _i_ を 0 とする。
1. _i_ < ℝ(_length_) の間、繰り返す:
1. _value_ を JSONObjectGet(_array_, ToString(𝔽(_i_))) とする。
1. Assert: _value_ は ~missing~ ではない。
1. _value_ を _list_ に追加する。
1. _i_ を _i_ + 1 に設定する。
1. _list_ を返す。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. これは、separators のいずれかの要素で区切られた部分文字列に文字列を分割する。複数の区切りが一致する場合、separators 内で先に現れるものがより高い優先度を持つ。 It performs the following steps when called:
1. _parts_ を新しい空の List とする。
1. _strLen_ を _string_ の長さとする。
1. _lastStart_ を 0 とする。
1. _i_ を 0 とする。
1. _i_ < _strLen_ の間、繰り返す:
1. _matched_ を *false* とする。
1. _separators_ の各 String _sep_ について、次を行う:
1. _sepLen_ を _sep_ の長さとする。
1. _candidate_ を、_string_ の _i_ から min(_i_ + _sepLen_, _strLen_) までの部分文字列とする。
1. _candidate_ = _sep_ かつ _matched_ が *false* ならば、
1. _chunk_ を、_string_ の _lastStart_ から _i_ までの部分文字列とする。
1. _chunk_ を _parts_ に追加する。
1. _lastStart_ を _i_ + _sepLen_ に設定する。
1. _i_ を _i_ + _sepLen_ に設定する。
1. _matched_ を *true* に設定する。
1. _matched_ が *false* ならば、_i_ を _i_ + 1 に設定する。
1. _chunk_ を、_string_ の _lastStart_ から _strLen_ までの部分文字列とする。
1. _chunk_ を _parts_ に追加する。
1. _parts_ を返す。
Position Record は、非負の行番号と非負の列番号からなるタプルである:
| フィールド名 | 値型 |
|---|---|
| [[Line]] | 非負の整数 Number |
| [[Column]] | 非負の整数 Number |
Original Position Record は、
| フィールド名 | 値型 |
|---|---|
| [[Source]] | |
| [[Line]] | 非負の整数 Number |
| [[Column]] | 非負の整数 Number |
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. これは、first が second より前に出現するか、等しいか、後に出現するかに応じて、それぞれ
1. _first_.[[Line]] < _second_.[[Line]] ならば、~lesser~ を返す。
1. _first_.[[Line]] > _second_.[[Line]] ならば、~greater~ を返す。
1. Assert: _first_.[[Line]] は _second_.[[Line]] と等しい。
1. _first_.[[Column]] < _second_.[[Column]] ならば、~lesser~ を返す。
1. _first_.[[Column]] > _second_.[[Column]] ならば、~greater~ を返す。
1. ~equal~ を返す。
source map は、次の構造を持つトップレベル
{
"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 でなければならない。このフィールドが他の値を持つ場合、source map は拒否されてもよい。file フィールドは、この source map が関連付けられている生成コードの任意の名前である。これが sourceRoot フィールドは、サーバー上でソースファイルを再配置するため、または sources エントリ内の繰り返し値を除去するために使用される任意のソースルート文字列である。この値は sources フィールドは、sourcesContent フィールドは、ソースをホストできない場合に使用されるソース内容(すなわち元ソース)文字列の任意のリストである。内容は names フィールドは、mappings フィールドは、符号化されたマッピングデータを含む文字列である(ignoreList フィールドは、フレームワークコードやバンドラーのignoreList が存在しない場合、一部のブラウザーは非推奨の x_google_ignoreList フィールドを使用することもある。Decoded Source Map Record は、次のフィールドを持つ:
| フィールド名 | 値型 |
|---|---|
| [[File]] | String または |
| [[Sources]] | |
| [[Mappings]] |
Decoded Source Record は、次のフィールドを持つ:
| フィールド名 | 値型 |
|---|---|
| [[URL]] | |
| [[Content]] | String または |
| [[Ignored]] | Boolean |
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _json_ を ParseJSON(_string_) とする。
1. _json_ が JSON object でないならば、エラーを投げる。
1. JSONObjectGet(_json_, *"sections"*) が ~missing~ でないならば、
1. DecodeIndexSourceMap(_json_, _baseURL_) を返す。
1. DecodeSourceMap(_json_, _baseURL_) を返す。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. JSONObjectGet(_json_, *"version"*) が *3*𝔽 でないならば、任意にエラーを報告する。
1. _mappingsField_ を JSONObjectGet(_json_, *"mappings"*) とする。
1. _mappingsField_ が String でないならば、エラーを投げる。
1. JSONObjectGet(_json_, *"sources"*) が JSON array でないならば、エラーを投げる。
1. _fileField_ を GetOptionalString(_json_, *"file"*) とする。
1. _sourceRootField_ を GetOptionalString(_json_, *"sourceRoot"*) とする。
1. _sourcesField_ を GetOptionalListOfOptionalStrings(_json_, *"sources"*) とする。
1. _sourcesContentField_ を GetOptionalListOfOptionalStrings(_json_, *"sourcesContent"*) とする。
1. _ignoreListField_ を GetOptionalListOfArrayIndexes(_json_, *"ignoreList"*) とする。
1. _sources_ を DecodeSourceMapSources(_baseURL_, _sourceRootField_, _sourcesField_, _sourcesContentField_, _ignoreListField_) とする。
1. _namesField_ を GetOptionalListOfStrings(_json_, *"names"*) とする。
1. _mappings_ を DecodeMappings(_mappingsField_, _namesField_, _sources_) とする。
1. [declared="a,b"] _mappings_ を昇順にソートする。ここで、Decoded Mapping Record _a_ が Decoded Mapping Record _b_ より小さいとは、ComparePositions(_a_.[[GeneratedPosition]], _b_.[[GeneratedPosition]]) が ~lesser~ であることをいう。
1. Decoded Source Map Record { [[File]]: _fileField_, [[Sources]]: _sources_, [[Mappings]]: _mappings_ } を返す。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _value_ を JSONObjectGet(_object_, _key_) とする。
1. _value_ が String ならば、_value_ を返す。
1. _value_ が ~missing~ でないならば、任意にエラーを報告する。
1. *null* を返す。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _list_ を新しい空の List とする。
1. _values_ を JSONObjectGet(_object_, _key_) とする。
1. _values_ が ~missing~ ならば、_list_ を返す。
1. _values_ が JSON array でないならば、
1. 任意にエラーを報告する。
1. _list_ を返す。
1. JSONArrayIterate(_values_) の各要素 _item_ について、次を行う:
1. _item_ が String ならば、
1. _item_ を _list_ に追加する。
1. そうでなければ、
1. 任意にエラーを報告する。
1. 空の文字列を *list* に追加する。
1. _list_ を返す。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _list_ を新しい空の List とする。
1. _values_ を JSONObjectGet(_object_, _key_) とする。
1. _values_ が ~missing~ ならば、_list_ を返す。
1. _values_ が JSON array でないならば、
1. 任意にエラーを報告する。
1. _list_ を返す。
1. JSONArrayIterate(_values_) の各要素 _item_ について、次を行う:
1. _item_ が String ならば、
1. _item_ を _list_ に追加する。
1. そうでなければ、
1. _item_ ≠ *null* ならば、任意にエラーを報告する。
1. *null* を _list_ に追加する。
1. _list_ を返す。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _list_ を新しい空の List とする。
1. _values_ を JSONObjectGet(_object_, _key_) とする。
1. _values_ が ~missing~ ならば、_list_ を返す。
1. _values_ が JSON array でないならば、
1. 任意にエラーを報告する。
1. _list_ を返す。
1. JSONArrayIterate(_values_) の各要素 _item_ について、次を行う:
1. _item_ が整数 Number であり、かつ _item_ ≥ *+0*𝔽 ならば、
1. ℝ(_item_) を _list_ に追加する。
1. そうでなければ、
1. 任意にエラーを報告する。
1. _list_ を返す。
;)で区切られる,)で区切られる各セグメント内のフィールドは次のとおりである:
;)の直後の最初のセグメントである場合、このフィールドは Decoded Mapping Record は、次のフィールドを持つ:
| フィールド名 | 値型 |
|---|---|
| [[GeneratedPosition]] | |
| [[OriginalPosition]] | |
| [[Name]] | String または |
mappings String は、次の文法に従わなければならない:
Decode Mapping State Record は、次のフィールドを持つ:
| フィールド名 | 値型 |
|---|---|
| [[GeneratedLine]] | 非負の整数 |
| [[GeneratedColumn]] | 非負の整数 |
| [[SourceIndex]] | 非負の整数 |
| [[OriginalLine]] | 非負の整数 |
| [[OriginalColumn]] | 非負の整数 |
| [[NameIndex]] | 非負の整数 |
The
1. |Line| の DecodeMappingsField を、引数 _state_、_mappings_、_names_、および _sources_ で実行する。
1. _state_.[[GeneratedLine]] を _state_.[[GeneratedLine]] + 1 に設定する。
1. _state_.[[GeneratedColumn]] を 0 に設定する。
1. |LineList| の DecodeMappingsField を、引数 _state_、_mappings_、_names_、および _sources_ で実行する。
1. 戻る。
1. |Mapping| の DecodeMappingsField を、引数 _state_、_mappings_、_names_、および _sources_ で実行する。
1. |MappingList| の DecodeMappingsField を、引数 _state_、_mappings_、_names_、および _sources_ で実行する。
1. |GeneratedColumn| の DecodeMappingsField を、引数 _state_、_mappings_、_names_、および _sources_ で実行する。
1. _state_.[[GeneratedColumn]] < 0 ならば、
1. 任意にエラーを報告する。
1. 戻る。
1. _position_ を新しい Position Record { [[Line]]: _state_.[[GeneratedLine]], [[Column]]: _state_.[[GeneratedColumn]] } とする。
1. _decodedMapping_ を新しい DecodedMappingRecord { [[GeneratedPosition]]: _position_, [[OriginalPosition]]: *null*, [[Name]]: *null* } とする。
1. _decodedMapping_ を _mappings_ に追加する。
1. |GeneratedColumn| の DecodeMappingsField を、引数 _state_、_mappings_、_names_、および _sources_ で実行する。
1. _state_.[[GeneratedColumn]] < 0 ならば、
1. 任意にエラーを報告する。
1. 戻る。
1. _generatedPosition_ を新しい Position Record { [[Line]]: _state_.[[GeneratedLine]], [[Column]]: _state_.[[GeneratedColumn]] } とする。
1. |OriginalSource| の DecodeMappingsField を、引数 _state_、_mappings_、_names_、および _sources_ で実行する。
1. |OriginalLine| の DecodeMappingsField を、引数 _state_、_mappings_、_names_、および _sources_ で実行する。
1. |OriginalColumn| の DecodeMappingsField を、引数 _state_、_mappings_、_names_、および _sources_ で実行する。
1. _state_.[[SourceIndex]] < 0 または _state_.[[SourceIndex]] ≥ _sources_ の要素数、または _state_.[[OriginalLine]] < 0、または _state_.[[OriginalColumn]] < 0 ならば、
1. 任意にエラーを報告する。
1. _originalPosition_ を *null* とする。
1. そうでなければ、
1. _originalPosition_ を新しい Original Position Record { [[Source]]: _sources_[_state_.[[SourceIndex]]], [[Line]]: _state_.[[OriginalLine]], [[Column]]: _state_.[[OriginalColumn]] } とする。
1. _name_ を *null* とする。
1. |Name| が存在するならば、
1. |Name| の DecodeMappingsField を、引数 _state_、_mappings_、_names_、および _sources_ で実行する。
1. _state_.[[NameIndex]] < 0 または _state_.[[NameIndex]] ≥ _names_ の要素数ならば、任意にエラーを報告する。
1. そうでなければ、_name_ を _names_[_state_.[[NameIndex]]] に設定する。
1. _decodedMapping_ を新しい DecodedMappingRecord { [[GeneratedPosition]]: _generatedPosition_, [[OriginalPosition]]: _originalPosition_, [[Name]]: _name_ } とする。
1. _decodedMapping_ を _mappings_ に追加する。
1. _relativeColumn_ を |Vlq| の VLQSignedValue とする。
1. _state_.[[GeneratedColumn]] を _state_.[[GeneratedColumn]] + _relativeColumn_ に設定する。
1. _relativeSourceIndex_ を |Vlq| の VLQSignedValue とする。
1. _state_.[[SourceIndex]] を _state_.[[SourceIndex]] + _relativeSourceIndex_ に設定する。
1. _relativeLine_ を |Vlq| の VLQSignedValue とする。
1. _state_.[[OriginalLine]] を _state_.[[OriginalLine]] + _relativeLine_ に設定する。
1. _relativeColumn_ を |Vlq| の VLQSignedValue とする。
1. _state_.[[OriginalColumn]] を _state_.[[OriginalColumn]] + _relativeColumn_ に設定する。
1. _relativeName_ を |Vlq| の VLQSignedValue とする。
1. _state_.[[NameIndex]] を _state_.[[NameIndex]] + _relativeName_ に設定する。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _mappings_ を新しい空の List とする。
1. _mappingsNode_ を、|MappingsField| を目標記号として使用して _rawMappings_ を構文解析したときのルート Parse Node とする。
1. 構文解析が失敗したならば、
1. 任意にエラーを報告する。
1. _mappings_ を返す。
1. _state_ を、すべてのフィールドが 0 に設定された新しい Decode Mapping State Record とする。
1. _mappingsNode_ の DecodeMappingsField を、引数 _state_、_mappings_、_names_、および _sources_ で実行する。
1. _mappings_ を返す。
source map 生成器は、JavaScript トークンについて、次の場合に [[Name]] フィールドを持つ
その場合、
次の列挙は、ECMAScript Syntactic Grammar の生成規則と、source map 生成器が named mapping を出力するべきそれぞれのトークンまたは非終端記号(生成規則の右辺)を列挙する。そのようなトークンに対して作成される
この列挙は「最小限」として理解されるべきである。一般に、source map 生成器は任意の追加 named mapping を自由に出力できる。
A)として符号化される。
(。
source map 生成器は、
=> トークン。
(。
source map 生成器は、前の場合との一貫性のために、=> トークンにも追加で named mapping を出力してよい。
source map 生成器は、開き括弧 ( にも追加で named mapping を出力してよい。
source map 生成器は、
sourceRoot を前置した後に sources が絶対 src 属性を解決する場合と同様)。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _decodedSources_ を新しい空の List とする。
1. _sourcesContentCount_ を _sourcesContent_ 内の要素数とする。
1. *sourceUrlPrefix* を空の文字列とする。
1. _sourceRoot_ ≠ *null* ならば、
1. _sourceRoot_ が符号位置 U+002F(SOLIDUS)で終わるならば、
1. _sourceUrlPrefix_ を _sourceRoot_ に設定する。
1. そうでなければ、
1. _sourceUrlPrefix_ を _sourceRoot_ と *"/"* の文字列連結に設定する。
1. _index_ を 0 とする。
1. _index_ < _sources_ の長さの間、繰り返す:
1. _source_ を _sources_[_index_] とする。
1. _decodedSource_ を Decoded Source Record { [[URL]]: *null*, [[Content]]: *null*, [[Ignored]]: *false* } とする。
1. _source_ ≠ *null* ならば、
1. _source_ を _sourceUrlPrefix_ と _source_ の文字列連結に設定する。
1. _sourceURL_ を、_baseURL_ を用いて _source_ を URL parsing した結果とする。
1. _sourceURL_ が ~failure~ ならば、任意にエラーを報告する。
1. そうでなければ、_decodedSource_.[[URL]] を _sourceURL_ に設定する。
1. _ignoreList_ が _index_ を含むならば、_decodedSource_.[[Ignored]] を *true* に設定する。
1. _sourcesContentCount_ > _index_ ならば、_decodedSource_.[[Content]] を _sourcesContent_[_index_] に設定する。
1. _decodedSource_ を _decodedSources_ に追加する。
1. _index_ を _index_ + 1 に設定する。
1. _decodedSources_ を返す。
source map 消費者は、追加機能をこの形式に追加しても既存ユーザーを破壊しないように、追加の認識されないプロパティを source map の拒否原因とするのではなく無視しなければならない。
生成コードの連結およびその他の一般的な後処理をサポートするために、source map の代替表現がサポートされる:
{
"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"
}
}
]
}
index map は、標準 map の形式に従う。通常の source map と同様に、ファイル形式はトップレベル object を持つ JSON である。通常の source map の version および
sections フィールドは、次のフィールドを持つ object の配列である:
offset フィールドは、line と column の 2 つのフィールドを持つ object であり、参照される source map が表す生成コード内へのオフセットを表す。map フィールドは、埋め込まれた完全な source map object である。埋め込まれた map は、それを含む index map からいかなる値も継承しない。sections は開始位置でソートされなければならず、表される sections は重なってはならない。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _sectionsField_ を JSONObjectGet(_json_, *"sections"*) とする。
1. Assert: _sectionsField_ は ~missing~ ではない。
1. _sectionsField_ が JSON array でないならば、エラーを投げる。
1. JSONObjectGet(_json_, *"version"*) が *3*𝔽 でないならば、任意にエラーを報告する。
1. _fileField_ を GetOptionalString(_json_, *"file"*) とする。
1. _sourceMap_ を Decoded Source Map Record { [[File]]: _fileField_, [[Sources]]: « », [[Mappings]]: « » } とする。
1. _previousOffsetPosition_ を *null* とする。
1. _previousLastMapping_ を *null* とする。
1. JSONArrayIterate(_sectionsField_) の各 JSON value _section_ について、次を行う:
1. _section_ が JSON object でないならば、
1. 任意にエラーを報告する。
1. そうでなければ、
1. _offset_ を JSONObjectGet(_section_, *"offset"*) とする。
1. _offset_ が JSON object でないならば、エラーを投げる。
1. _offsetLine_ を JSONObjectGet(_offset_, *"line"*) とする。
1. _offsetColumn_ を JSONObjectGet(_offset_, *"column"*) とする。
1. _offsetLine_ が整数 Number でないならば、
1. 任意にエラーを報告する。
1. _offsetLine_ を *+0*𝔽 に設定する。
1. _offsetColumn_ が整数 Number でないならば、
1. 任意にエラーを報告する。
1. _offsetColumn_ を *+0*𝔽 に設定する。
1. _offsetPosition_ を新しい Position Record { [[Line]]: _offsetLine_, [[Column]]: _offsetColumn_ } とする。
1. _previousOffsetPosition_ ≠ *null* ならば、
1. ComparePositions(_offsetPosition_, _previousOffsetPosition_) が ~lesser~ ならば、任意にエラーを報告する。
1. _previousLastMapping_ ≠ *null* ならば、
1. ComparePositions(_offsetPosition_, _previousLastMapping_.[[GeneratedPosition]]) が ~lesser~ ならば、任意にエラーを報告する。
1. NOTE: 復号アルゴリズムのこの部分は、index source map の sections フィールドのエントリが順序付けられており、重なっていないことを検査する。生成器は重なりのある sections を持つ index source map を生成するべきでないと期待されるが、source map 消費者は、例えば sections のオフセットが順序付けられているというより単純な条件のみを検査してもよい。
1. _mapField_ を JSONObjectGet(_section_, *"map"*) とする。
1. _mapField_ が JSON object でないならば、エラーを投げる。
1. _decodedSectionCompletion_ を Completion(DecodeSourceMap(_json_, _baseURL_)) とする。
1. _decodedSectionCompletion_ が throw completion ならば、
1. 任意にエラーを報告する。
1. そうでなければ、
1. _decodedSection_ を _decodedSectionCompletion_.[[Value]] とする。
1. _decodedSection_.[[Sources]] の各 Decoded Source Record _additionalSource_ について、次を行う:
1. _sourceMap_.[[Sources]] が _additionalSource_ を含まないならば、
1. _additionalSource_ を _sourceMap_.[[Sources]] に追加する。
1. _offsetMappings_ を新しい空の List とする。
1. _decodedSection_.[[Mappings]] の各 Decoded Mapping Record _mapping_ について、次を行う:
1. _mapping_.[[GeneratedPosition]].[[Line]] = 0 ならば、
1. _mapping_.[[GeneratedPosition]].[[Column]] を _mapping_.[[GeneratedPosition]].[[Column]] + _offsetColumn_ に設定する。
1. _mapping_.[[GeneratedPosition]].[[Line]] を _mapping_.[[GeneratedPosition]].[[Line]] + _offsetLine_ に設定する。
1. _mapping_ を _offsetMappings_ に追加する。
1. _sourceMap_.[[Mappings]] を、_sourceMap_.[[Mappings]] と _offsetMappings_ のリスト連結に設定する。
1. _previousOffsetPosition_ を _offsetPosition_ に設定する。
1. _offsetMappings_ が空でないならば、_previousLastMapping_ を _offsetMappings_ の最後の要素に設定する。
1. _sourceMap_ を返す。
source map 形式は言語およびプラットフォームに依存しないことを意図しているが、Web サーバーでホストされる JavaScript という期待されるユースケースについて、それらを参照する方法を定義することは有用である。
source map を出力にリンクする方法は 2 つ考えられる。1 つ目は HTTP ヘッダーを追加するためにサーバーサポートを必要とし、2 つ目はソース内の注釈を必要とする。
source map は、
HTTP sourcemap ヘッダーはソース注釈よりも優先され、両方が存在する場合、ヘッダー
生成されたソースが src 属性を持つ script 要素に関連付けられておらず、生成コード内に //# sourceURL コメントが存在する場合、そのコメントを使用して
//@ sourceURL であり、//@ sourceMappingURL と同様に両方を受け入れるのは合理的であるが、//# が推奨される。
src 属性を持つ場合、script 要素の src 属性が src 属性を持たない場合、eval() 関数または new Function() を介して文字列として評価されている場合、ファイルが sourcemap ヘッダーを伴って HTTP(S) を通じて提供される場合、そのヘッダーの値はリンクされた source map の
sourcemap: <url>
x-sourcemap が推奨されていた。これは現在非推奨であり、現在は sourcemap が期待される。
生成コードは、sourceMappingURL という名前で source map の
ある言語について、sourceMappingURL コメントを検出する方法は複数あり得る。これは、異なる実装が自分たちにとってより複雑でない方法を選択できるようにするためである。生成コードは、すべての抽出方法の結果が同じである場合、source map に曖昧さなくリンクする。
ツールが source map に
次の JavaScript コードは source map にリンクするが、
let a = `
//# sourceMappingURL=foo.js.map
// `
これから foo.js.map が得られる一方、
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. これは、JavaScript ソースから
1. _source_ をECMA-262 の字句文法 に従って解析することによって得られた入力要素 の List を _tokens_ とする。 1. _tokens_ の各非終端記号 _token_ について、逆順に、次の手順を行う。 1. _token_ が |SingleLineComment|、|WhiteSpace|、または |LineTerminatorSequence| のいずれでもない場合は、*null* を返す。 1. _comment_ を _token_ の内容とする。 1. _sourceMapURL_ を MatchSourceMapURL(_comment_) とする。 1. _sourceMapURL_ が String である場合は、_sourceMapURL_ を返す。 1. *null* を返す。
1. _lines_ を StringSplit(_source_, « *"\u000D\u000A"*, *"\u000A"*, *"\u000D"*, *"\u2028"*, *"\u2029"* ») とする。
1. 注記: 上記の文字列のリストは |LineTerminatorSequence| 生成規則に一致する。
1. _lines_ の各 String _lineStr_ について、List の逆順に、次の手順を行う。
1. _line_ を StringToCodePoints(_lineStr_) とする。
1. _position_ を 0 とする。
1. _lineLength_ を _line_ の長さとする。
1. _position_ < _lineLength_ である間、次の手順を繰り返す。
1. _first_ を _line_[_position_] とする。
1. _first_ が U+002F (SOLIDUS) であり、かつ _position_ + 1 < _lineLength_ である場合は、次の手順を行う。
1. _position_ を _position_ + 1 に設定する。
1. _second_ を _line_[_position_] とする。
1. _second_ が U+002F (SOLIDUS) である場合は、次の手順を行う。
1. _position_ を _position_ + 1 に設定する。
1. _comment_ を _lineStr_ の _position_ から _lineLength_ までの部分文字列とする。
1. _comment_ がコードポイント U+0022 (QUOTATION MARK)、U+0027 (APOSTROPHE)、または U+0060 (GRAVE ACCENT) のいずれかを含む場合は、次の手順を行う。
1. *null* を返す。
1. _comment_ がコードポイント U+002A (ASTERISK) の直後にコードポイント U+002F (SOLIDUS) が続く箇所を含む場合は、次の手順を行う。
1. *null* を返す。
1. _sourceMapURL_ を MatchSourceMapURL(_comment_) とする。
1. _sourceMapURL_ が String である場合は、_sourceMapURL_ を返す。
1. _position_ を _lineLength_ に設定する。
1. そうでない場合は、
1. *null* を返す。
1. そうでなく、_first_ が ECMAScript |WhiteSpace| である場合は、次の手順を行う。
1. _position_ を _position_ + 1 に設定する。
1. そうでない場合は、
1. *null* を返す。
1. *null* を返す。
source がエラーなしで構文解析でき、そこから
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _pattern_ を RegExpCreate(*"^[@#]\\s\*sourceMappingURL=(\\S\*?)\\s\*$"*, *""*) とする。
1. _match_ を RegExpExec(_pattern_, _comment_) とする。
1. _match_ が *null* でないならば、Get(_match_, *"1"*) を返す。
1. ~none~ を返す。
//@ であったが、これは Internet Explorer の Conditional Compilation と衝突するため、//# に変更された。source map 生成器は //# のみを出力しなければならない一方、source map 消費者は //@ と //# の両方を受け入れなければならない。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. これは、CSS ソースから
CSS から /* ... */ 形式のコメントのみをサポートする点が例外である。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. これは、WebAssembly バイナリーソースから
1. _module_ を module_decode(_bytes_) とする。
1. _module_ が WebAssembly error ならば、*null* を返す。
1. _module_ の各 custom section _customSection_ について、次を行う:
1. _name_ を _customSection_ の `name` とする。
1. CodePointsToString(_name_) が *"sourceMappingURL"* ならば、
1. _value_ を _customSection_ の `bytes` とする。
1. CodePointsToString(_value_) を返す。
1. *null* を返す。
WebAssembly はテキスト形式ではなく、コメントをサポートしないため、単一の曖昧さのない抽出方法をサポートする。sourceMappingURL 名を持つ
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _promiseCapability_ を NewPromiseCapability(%Promise%) とする。
1. _request_ を、request URL が _url_ である新しい request とする。
1. _processResponseConsumeBody_ を、_promiseCapability_ と _url_ をキャプチャする、パラメーター (_response_, _bodyBytes_) を持つ新しい Abstract Closure とし、呼び出されたときに次の手順を実行する:
1. _bodyBytes_ が *null* または ~failure~ ならば、
1. Call(_promiseCapability_.[[Reject]], *undefined*, « a new *TypeError* ») を実行する。
1. 戻る。
1. _url_ の scheme が HTTP(S) scheme であり、かつバイト列 \``)]}'`\` が _bodyBytes_ の byte-sequence-prefix であるならば、
1. _bodyBytes_ の byte-sequence-length ≠ 0 かつ _bodyBytes_[0] が HTTP newline byte でない間、繰り返す:
1. _bodyBytes_ から 0 番目の要素を削除する。
1. _bodyString_ を UTF-8 decode of _bodyBytes_ の Completion とする。
1. IfAbruptRejectPromise(_bodyString_, _promiseCapability_)。
1. _jsonValue_ を Completion(ParseJSON(_bodyString_)) とする。
1. IfAbruptRejectPromise(_jsonValue_, _promiseCapability_)。
1. Call(_promiseCapability_.[[Resolve]], *undefined*, « _jsonValue_ ») を実行する。
1. processResponseConsumeBody を _processResponseConsumeBody_ に設定して fetch _request_ を実行する。
1. _promiseCapability_.[[Promise]] を返す。
歴史的な理由により、HTTP(S) 経由で source map を配信する際、サーバーは source map の前に文字列 )]}' で始まる行を付加する場合がある。
)]}'garbage here
{"version": 3, ...}
これは次のように解釈される
{"version": 3, ...}
source map を復号した後、source map 消費者は、得られた
GetOriginalPositions 操作は、生成コード内の位置に対応する元ソース内の位置を問い合わせるために使用できる。例えば、デバッガーで、ユーザーのマウスクリックに基づいて生成コードから元ソースへ移動するために使用できる。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
1. _mappings_ を _sourceMapRecord_.[[Mappings]] とする。
1. _last_ を *null* とする。
1. _originalPositions_ を新しい空の List とする。
1. _mappings_ の各要素 _mapping_ について、List の逆順に次を行う:
1. _last_ が *null* ならば、
1. ComparePositions(_mapping_.[[GeneratedPosition]], _generatedPosition_) を実行した結果が ~lesser~ または ~equal~ ならば、
1. _last_ を _mapping_ に設定する。
1. _last_ が *null* でないならば、
1. _mappings_ の各要素 _mapping_ について、次を行う:
1. ComparePositions(_last_.[[GeneratedPosition]], _mapping_.[[GeneratedPosition]]) を実行した結果が ~equal~ ならば、
1. _mapping_.[[OriginalPosition]] を _originalPositions_ に追加する。
1. _originalPositions_ を返す。
source map を扱う場合、またはそれらを生成する場合には、次の規約に従うべきである。
一般に、source map は生成ファイルと同じ名前を持つが、.map 拡張子が付く。例えば、page.js については、page.js.map という名前の source map が生成される。
eval されたコードで source map を使用するためにサポートされるべき既存の規約があり、それは次の形式を持つ:
//# sourceURL=foo.js
これは
ソース言語に関する知識なしのスタックトレースマッピングは、この文書では
ツールが何らかの DSL(テンプレート)からソースを生成したり、TypeScript → JavaScript → minified JavaScript へコンパイルしたりして、最終的な source map が作成される前に複数の変換が発生することがより一般的になっている。この問題は 2 つの方法のいずれかで扱える。簡単だが損失のある方法は、デバッグの目的ではプロセス内の中間手順を無視することである。変換からのソース位置情報は、無視される(中間変換が “Original Source” と見なされる)か、引き継がれる(中間変換が隠される)。より完全な方法は、複数段階のマッピングをサポートすることである:Original Source も source map 参照を持つ場合、ユーザーにはそれも使用する選択肢が与えられる。
しかし、JavaScript 以外で “source map reference” がどのように見えるのかは不明である。より具体的には、JavaScript 形式の単一行コメントをサポートしない言語において source map reference がどのように見えるのかが不明である。
この節では、この文書によって使用される、ECMA-262 以外の外部仕様で定義されるすべての用語およびアルゴリズムを列挙する。
この仕様は、GitHub 上で Ecmarkup と呼ばれるプレーンテキストソース形式により執筆されている。Ecmarkup は、プレーンテキストで ECMAScript 仕様を執筆し、その仕様をこの文書の編集上の規約に従うフル機能の HTML レンダリングへ処理するためのフレームワークおよびツールセットを提供する HTML および Markdown の方言である。Ecmarkup は、構文を定義するための Grammarkdown や、アルゴリズム手順を執筆するための Ecmarkdown など、多数の他の形式および技術の上に構築され、それらを統合している。この仕様の PDF レンダリングは、HTML レンダリングを PDF に印刷することにより生成される。
この仕様の初版は、HTML および Markdown に基づく別のプレーンテキストソース形式である Bikeshed を使用して執筆された。
標準化前のこの文書のバージョンは、Google Docs を使用して執筆された。
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
© 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.
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:
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.