Draft ECMA-426 / May 28, 2026 Source map format specification
導入
この Ecma 標準は、トランスパイルされたソースコードを元のソースへ対応付けるために使用される Source map 形式を定義する。
source map 形式には、次の目標がある:
双方向の対応付けを可能にするソースレベルのデバッグをサポートすること
サーバー側のスタックトレースの難読化解除をサポートすること
original source map 形式(v1)は、最適化された JavaScript コードのソースレベルデバッグを可能にするために Closure Inspector で使用する目的で Joseph Schorr によって作成された(ただし、形式自体は言語に依存しない)。しかし、source map を使用するプロジェクトの規模が拡大するにつれ、この形式の冗長性が問題になり始めた。v2 形式(Source Map Revision 2 Proposal )は、全体的な source map のサイズを削減するために、いくらかの単純さと柔軟性を犠牲にして作成された。v2 バージョンの形式で加えられた変更があっても、source map ファイルのサイズはその有用性を制限していた。v3 形式は Pavel Podivilov(Google)による提案に基づいている。
source map 形式には、もはやバージョン番号はなく、代わりに常に "3" へハードコードされている。
2023-2024 年に、source map 形式は、多くの人々からの大きな貢献により、より精密な Ecma 標準へと発展した。source map 形式に対する今後の反復作業は TC39-TG4 から行われることが期待されている。
Asumu Takikawa, Nicolò Ribaudo, Jon Kuperman
ECMA-426, 第 1 版, プロジェクト編集者
1 適用範囲
この標準は、JavaScript、WebAssembly、および CSS にコンパイルされたコードのデバッグ体験を向上させるために、さまざまな種類の開発者ツールによって使用される source map 形式を定義する。
2 適合性
適合する source map 文書は、この仕様で詳述される構造に適合する JSON 文書である。
適合する source map 生成器は、適合する source map 文書であり、エラー(任意として指定されているものを含む)を報告することなくこの仕様のアルゴリズムによって復号できる文書を生成するべきである。
適合する source map 消費者は、source map 文書を取得(該当する場合)および復号するために、この仕様で指定されているアルゴリズムを実装するべきである。適合する消費者は、仕様がアルゴリズムにおいて任意にエラーを報告してよいことを示している場合、そのエラーを無視するか、終了せずに報告することが許可される。
3 参照
以下の文書は、その内容の一部または全部がこの文書の要件を構成するような形で本文中から参照されている。日付付き参照については、引用された版のみが適用される。日付なし参照については、参照された文書の最新版(すべての修正を含む)が適用される。
3.1 規範参照
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/
3.2 参考参照
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 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 暗黙の完了
この仕様で宣言されるすべての抽象操作は、暗黙に、アルゴリズムが宣言した戻り型を含む normal completion 、または throw completion のいずれかを返すものと仮定される。例えば、次のように宣言された抽象操作は
4.1.1.1 GetTheAnswer ( input )
The abstract operation GetTheAnswer takes argument input (an integer ) and returns an integer .
次と等価である:
4.1.1.2 GetTheAnswer2 ( input )
The abstract operation GetTheAnswer2 takes argument input (an integer ) and returns either a normal completion containing an integer or a throw completion .
completion record を返す抽象操作へのすべての呼び出しは、明示的な Completion 呼び出しでラップされていない限り、ECMA-262 の ? completion record をアンラップするための省略記法 によってラップされているものと暗黙に仮定される。例えば:
result を GetTheAnswer (value ) とする。second を Completion (GetTheAnswer (value )) とする。
これは次と等価である:
result を ? GetTheAnswer (value ) とする。second を Completion (GetTheAnswer (value )) とする。
4.1.2 任意のエラー
アルゴリズムが任意にエラーを報告する 場合、実装は次のいずれかの振る舞いを選択してよい:
アルゴリズムの残りの実行を継続する。
ユーザーにエラーを報告し(例えば、ブラウザーコンソールに)、アルゴリズムの残りの実行を継続する。
ThrowCompletion を返す。
実装は、異なる任意のエラーに対して異なる振る舞いを選択できる。
4.2 文法表記
この仕様は、ECMA-262(文法表記) で定義されるものと同じ文法表記上の規約に従うが、次の注意点がある:
この仕様で定義される文法の終端記号は、個々の符号位置である。これは、ECMA-262 の字句文法 に似ており、ECMA-262 の構文文法 とは異なる。
この仕様は、文法定義の複雑さを抑えるために、文法パラメーター または先読み制限 を使用しない。
5 用語および定義
この文書の目的において、次の用語および定義が適用される。
generated code
コンパイラーまたはトランスパイラーによって生成されるコード。
original source
コンパイラーまたはトランスパイラーを通されていないソースコード。
source map URL
生成コードから source map の場所を参照する URL 。
column
生成コードの行内におけるゼロ基点のインデックス付きオフセットであり、JavaScript および CSS の source map では UTF-16 符号単位として計算され、WebAssembly source map ではバイナリー内容(単一行として表される)内のバイトインデックスとして計算される。
Note これは、"A"(LATIN CAPITAL LETTER A)が 1 符号単位として測定され、"🔥"(FIRE)が 2 符号単位として測定されることを意味する。他の内容型の source map はこれと異なる場合がある。
6 base64 VLQ
base64 VLQ は、base64 で符号化された可変長数量であり、最上位ビット(第 6 ビット)が継続ビットとして使用され、「桁」は下位から先に文字列へ符号化され、最初の桁の最下位ビットが符号ビットとして使用される。
Note 1 base64 VLQ 符号化で表現できる値は、より大きな値に対する何らかのユースケースが提示されるまで 32 ビット数量に制限される。これは、32 ビットを超える値は無効であり、実装がそれらを拒否してよいことを意味する。符号ビットは制限に含めて数えられるが、継続ビットは含めて数えられない。
Note 2
文字列 "iB" は、2 桁の base64 VLQ を表す。最初の桁 "i" はビットパターン 0b100010 を符号化し、これは継続ビット 1(VLQ は継続する)、符号ビット 0(非負)、および値ビット 0b0001 を持つ。2 番目の桁 B はビットパターン 0b000001 を符号化し、これは継続ビット 0、符号ビットなし、および値ビット 0b00001 を持つ。この VLQ 文字列を復号すると数値 17 になる。
Note 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
The syntax-directed operation VLQSignedValue takes no arguments and returns an integer . It is defined piecewise over the following productions:
Vlq :: VlqDigitList
unsigned を VlqDigitList の VLQUnsignedValue とする。unsigned modulo 2 = 1 ならば、sign を -1 とする。そうでなければ、sign を 1 とする。 value を floor (unsigned / 2) とする。value が 0 かつ sign が -1 ならば、-231 を返す。value が ≥ 231 ならば、エラーを投げる。sign × value を返す。
Note
手順
6 の検査は、
unsigned が
Vlq ではなく
VlqDigitList の
VLQUnsignedValue であるため必要である。
6.2 VLQUnsignedValue
The syntax-directed operation VLQUnsignedValue takes no arguments and returns an non-negative integer . It is defined piecewise over the following productions:
Vlq :: VlqDigitList
value を VlqDigitList の VLQUnsignedValue とする。value が ≥ 232 ならば、エラーを投げる。value を返す。
VlqDigitList ::
ContinuationDigit
VlqDigitList
left を ContinuationDigit の VLQUnsignedValue とする。right を VlqDigitList の VLQUnsignedValue とする。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 を、この生成規則に一致した文字とする。value を、IETF RFC 4648 で定義される base64 符号化に従って、digit に対応する整数とする。Assert : 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 を、この生成規則に一致した文字とする。value を、IETF RFC 4648 で定義される base64 符号化に従って、digit に対応する整数とする。Assert : 32 ≤ value < 64。value - 32 を返す。
7 JSON 値ユーティリティ
この仕様のアルゴリズムは ECMA-262 の内部仕様の上に定義されているが、非 JavaScript プラットフォームでも容易に実装できることを意図している。この節には、文書の残りの部分から ECMA-262 の詳細を抽象化し、JSON 値を扱うためのユーティリティが含まれる。
JSON value は、JSON object 、JSON array 、String 、Number 、Boolean 、または null のいずれかである。
JSON object は、その各プロパティが次の条件を満たす Object である:
JSON array は、次の条件を満たす JSON object である:
キーが "length" で、値が Number であるプロパティを持つ、
その他すべてのプロパティのキーが整数インデックスである。
7.1 ParseJSON ( string )
The abstract operation ParseJSON takes argument string (a String) and returns a JSON value . It performs the following steps when called:
result を Call (%JSON.parse% , null , « string ») とする。Assert : result は JSON value である。result を返す。
Editor's Note
この抽象操作は、ECMA-262 自体で公開される過程にあり、
tc39/ecma262#3540 にある。
7.2 JSONObjectGet ( object , key )
The abstract operation JSONObjectGet takes arguments object (a JSON object ) and key (a String) and returns a JSON value or missing . これは、object 内で指定された key に関連付けられた値を返す。 It performs the following steps when called:
object がキー key を持つ own property を持たない場合、missing を返す。prop を、キーが key である object の own property とする。prop の [[Value]] 属性を返す。
7.3 JSONArrayIterate ( array )
The abstract operation JSONArrayIterate takes argument array (a JSON array ) and returns a List of JSON values . これは、"For each" を使用するアルゴリズムによって反復できるように、array のすべての要素を含む List を返す。 It performs the following steps when called:
length を JSONObjectGet (array , "length" ) とする。Assert : length は非負の整数 Number である。list を新しい空の List とする。i を 0 とする。i < ℝ (length ) の間、繰り返す:value を JSONObjectGet (array , ToString (𝔽 (i ))) とする。Assert : value は missing ではない。value を list に追加する。i を i + 1 に設定する。list を返す。
7.4 StringSplit ( string , separators )
The abstract operation StringSplit takes arguments string (a String) and separators (a List of non-empty Strings) and returns a List of Strings. これは、separators のいずれかの要素で区切られた部分文字列に文字列を分割する。複数の区切りが一致する場合、separators 内で先に現れるものがより高い優先度を持つ。 It performs the following steps when called:
parts を新しい空の List とする。strLen を string の長さとする。lastStart を 0 とする。i を 0 とする。i < strLen の間、繰り返す:matched を false とする。separators の各 String sep について、次を行う:sepLen を sep の長さとする。candidate を、string の i から min (i + sepLen , strLen ) までの部分文字列とする。candidate = sep かつ matched が false ならば、chunk を、string の lastStart から i までの部分文字列とする。chunk を parts に追加する。lastStart を i + sepLen に設定する。i を i + sepLen に設定する。matched を true に設定する。matched が false ならば、i を i + 1 に設定する。chunk を、string の lastStart から strLen までの部分文字列とする。chunk を parts に追加する。parts を返す。
8 位置型
8.1 Position Record
Position Record は、非負の行番号と非負の列番号からなるタプルである:
Table 1: Position Record Fields
フィールド名
値型
[[Line]]
非負の整数 Number
[[Column]]
非負の整数 Number
8.2 Original Position Record
Original Position Record は、Decoded Source Record 、非負の行番号、および非負の列番号からなるタプルである。これは Position Record に似ているが、具体的な元ソースファイル内のソース位置を記述する。
Table 2: Original Position Record Fields
8.3 ComparePositions ( first , second )
The abstract operation ComparePositions takes arguments first (a Position Record or a Original Position Record ) and second (a Position Record or a Original Position Record ) and returns lesser , equal or greater . これは、first が second より前に出現するか、等しいか、後に出現するかに応じて、それぞれ lesser 、equal 、または greater を返す。Original Position Records の [[Source]] フィールドは無視される。 It performs the following steps when called:
first .[[Line]] < second .[[Line]] ならば、lesser を返す。first .[[Line]] > second .[[Line]] ならば、greater を返す。Assert : first .[[Line]] は second .[[Line]] と等しい。first .[[Column]] < second .[[Column]] ならば、lesser を返す。first .[[Column]] > second .[[Column]] ならば、greater を返す。equal を返す。
9 Source map 形式
source map は、次の構造を持つトップレベル JSON object を含む 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 でなければならない。このフィールドが他の値を持つ場合、source map は拒否されてもよい。
file フィールド は、この source map が関連付けられている生成コードの任意の名前である。これが URL 、相対パス名、または単なるベース名であり得るかどうかは指定されていない。source map 生成器は、その使用文脈に適した解釈を選んでよい。
sourceRoot フィールド は、サーバー上でソースファイルを再配置するため、または sources エントリ内の繰り返し値を除去するために使用される任意のソースルート文字列である。この値は sources フィールド 内の個々のエントリの前に付加される。
sources フィールド は、mappings フィールド で使用される元ソースのリストである。各エントリは、(潜在的に相対的な)URL である文字列、またはソース名が不明である場合は null のいずれかである。
sourcesContent フィールド は、ソースをホストできない場合に使用されるソース内容(すなわち元ソース)文字列の任意のリストである。内容は sources フィールド と同じ順序で列挙される。いくつかの original sources が名前によって取得されるべき場合、エントリは null であってよい。
names フィールド は、mappings フィールド によって使用される可能性があるシンボル名の任意のリストである。
mappings フィールド は、符号化されたマッピングデータを含む文字列である(9.2 節を参照)。
ignoreList フィールド は、フレームワークコードやバンドラーの生成コード など、サードパーティーコードと見なされるべきファイルのインデックスの任意のリストである。これにより、開発者が事前に設定する必要なしに、開発者が見たりステップ実行したりしたくない可能性が高いコードを、開発者ツールが回避できる。これは sources フィールド を参照し、source map 内で既知のすべてのサードパーティーソースのインデックスを列挙する。ignoreList が存在しない場合、一部のブラウザーは非推奨の x_google_ignoreList フィールドを使用することもある。
9.1 source map の復号
Decoded Source Map Record は、次のフィールドを持つ:
Table 3: Fields of Decoded Source Map Records
Decoded Source Record は、次のフィールドを持つ:
Table 4: Fields of Decoded Source Records
フィールド名
値型
[[URL]]
URL または null
[[Content]]
String または null
[[Ignored]]
Boolean
9.1.1 ParseSourceMap ( string , baseURL )
The abstract operation ParseSourceMap takes arguments string (a String) and baseURL (an URL ) and returns a Decoded Source Map Record . It performs the following steps when called:
json を ParseJSON (string ) とする。json が JSON object でないならば、エラーを投げる。JSONObjectGet (json , "sections" ) が missing でないならば、DecodeIndexSourceMap (json , baseURL ) を返す。DecodeSourceMap (json , baseURL ) を返す。
9.1.2 DecodeSourceMap ( json , baseURL )
The abstract operation DecodeSourceMap takes arguments json (a JSON object ) and baseURL (an URL ) and returns a Decoded Source Map Record . It performs the following steps when called:
JSONObjectGet (json , "version" ) が 3 𝔽 でないならば、任意にエラーを報告する 。mappingsField を JSONObjectGet (json , "mappings" ) とする。mappingsField が String でないならば、エラーを投げる。JSONObjectGet (json , "sources" ) が JSON array でないならば、エラーを投げる。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 )
The abstract operation GetOptionalString takes arguments object (a JSON object ) and key (a String) and returns a String or null . It performs the following steps when called:
value を JSONObjectGet (object , key ) とする。value が String ならば、value を返す。value が missing でないならば、任意にエラーを報告する 。null を返す。
9.1.2.2 GetOptionalListOfStrings ( object , key )
The abstract operation GetOptionalListOfStrings takes arguments object (a JSON object ) and key (a String) and returns a List of Strings. It performs the following steps when called:
list を新しい空の List とする。values を JSONObjectGet (object , key ) とする。values が missing ならば、list を返す。values が JSON array でないならば、任意にエラーを報告する 。list を返す。JSONArrayIterate (values ) の各要素 item について、次を行う:item が String ならば、item を list に追加する。そうでなければ、任意にエラーを報告する 。"" を list に追加する。 list を返す。
9.1.2.3 GetOptionalListOfOptionalStrings ( object , key )
The abstract operation GetOptionalListOfOptionalStrings takes arguments object (a JSON object ) and key (a String) and returns a List of either Strings or null . It performs the following steps when called:
list を新しい空の List とする。values を JSONObjectGet (object , key ) とする。values が missing ならば、list を返す。values が JSON array でないならば、任意にエラーを報告する 。list を返す。JSONArrayIterate (values ) の各要素 item について、次を行う:item が String ならば、item を list に追加する。そうでなければ、item ≠ null ならば、任意にエラーを報告する 。null を list に追加する。 list を返す。
9.1.2.4 GetOptionalListOfArrayIndexes ( object , key )
The abstract operation GetOptionalListOfArrayIndexes takes arguments object (an Object) and key (a String) and returns a List of non-negative integers . It performs the following steps when called:
list を新しい空の List とする。values を JSONObjectGet (object , key ) とする。values が missing ならば、list を返す。values が JSON array でないならば、任意にエラーを報告する 。list を返す。JSONArrayIterate (values ) の各要素 item について、次を行う:item が整数 Number であり、かつ item ≥ +0 𝔽 ならば、ℝ (item ) を list に追加する。そうでなければ、任意にエラーを報告する 。 list を返す。
9.2 Mappings 構造
mappings フィールド のデータは、次のように分解される:
生成ファイル内の 1 行を表す各グループは、セミコロン(;)で区切られる
各セグメントは、コンマ(,)で区切られる
各セグメントは、1 個、4 個、または 5 個の可変長フィールドで構成される。
各セグメント内のフィールドは次のとおりである:
セグメントが表す生成コード内の行のゼロ基点の開始列。これが最初のセグメントの最初のフィールド、または新しい生成行(;)の直後の最初のセグメントである場合、このフィールドは base64 VLQ 全体を保持する。それ以外の場合、このフィールドは、このフィールドの前回の出現に相対する base64 VLQ を含む。これは、生成行ごとに前回値がリセットされるため、下記の後続フィールドとは異なることに注意。
存在する場合、sources リストへのゼロ基点インデックス。このフィールドは、このフィールドの前回の出現に相対する base64 VLQ を含む。ただし、このフィールドの最初の出現である場合は、値全体が表される。
存在する場合、元ソース内のゼロ基点の開始行。このフィールドは、このフィールドの前回の出現に相対する base64 VLQ を含む。ただし、このフィールドの最初の出現である場合は、値全体が表される。source フィールドがある場合は存在しなければならない。
存在する場合、元ソース内の行のゼロ基点の開始列。このフィールドは、このフィールドの前回の出現に相対する base64 VLQ を含む。ただし、このフィールドの最初の出現である場合は、値全体が表される。source フィールドがある場合は存在しなければならない。
存在する場合、このセグメントに関連付けられた names リストへのゼロ基点インデックス。このフィールドは、このフィールドの前回の出現に相対する base64 VLQ を含む。ただし、このフィールドの最初の出現である場合は、値全体が表される。
Note 1 この符号化の目的は、source map のサイズを削減することである。Google Calendar を使用して実施されたテストでは、VLQ 符号化により
Source Map Revision 2 Proposal と比べて source map が 50% 削減された。
Note 2 1 個のフィールドを持つセグメントは、コンパイラーによって生成されたコードなど、対応する元ソースコードが存在しないためにマップされていない生成コードを表すことを意図している。4 個のフィールドを持つセグメントは、対応する名前が存在しないマップ済みコードを表す。5 個のフィールドを持つセグメントは、マップされた名前も持つマップ済みコードを表す。
Note 3 file オフセットを使用することも検討されたが、プラットフォーム固有の行末により元の内容とのずれが生じることを避けるため、行/column データを使用することが選ばれた。
Decoded Mapping Record は、次のフィールドを持つ:
Table 5: Fields of Decoded Mapping Records
9.2.1 Mappings 文法
mappings String は、次の文法に従わなければならない:
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 は、次のフィールドを持つ:
Table 6: Fields of Decode Mapping State Records
フィールド名
値型
[[GeneratedLine]]
非負の整数
[[GeneratedColumn]]
非負の整数
[[SourceIndex]]
非負の整数
[[OriginalLine]]
非負の整数
[[OriginalColumn]]
非負の整数
[[NameIndex]]
非負の整数
9.2.1.1 DecodeMappingsField
The syntax-directed operation DecodeMappingsField takes arguments state (a Decode Mapping State Record ), mappings (a List of Decoded Mapping Records ), names (a List of Strings), and sources (a List of Decoded Source Records ). It is defined piecewise over the following productions:
LineList :
Line
;
LineList
Line の DecodeMappingsField を、引数 state 、mappings 、names 、および sources で実行する。state .[[GeneratedLine]] を state .[[GeneratedLine]] + 1 に設定する。state .[[GeneratedColumn]] を 0 に設定する。LineList の DecodeMappingsField を、引数 state 、mappings 、names 、および sources で実行する。
Line : [empty]
戻る。
MappingList :
Mapping
,
MappingList
Mapping の DecodeMappingsField を、引数 state 、mappings 、names 、および sources で実行する。MappingList の DecodeMappingsField を、引数 state 、mappings 、names 、および sources で実行する。
Mapping :
GeneratedColumn
GeneratedColumn の DecodeMappingsField を、引数 state 、mappings 、names 、および sources で実行する。state .[[GeneratedColumn]] < 0 ならば、任意にエラーを報告する 。戻る。 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
GeneratedColumn の DecodeMappingsField を、引数 state 、mappings 、names 、および sources で実行する。state .[[GeneratedColumn]] < 0 ならば、任意にエラーを報告する 。戻る。 generatedPosition を新しい Position Record { [[Line]] : state .[[GeneratedLine]] , [[Column]] : state .[[GeneratedColumn]] } とする。OriginalSource の DecodeMappingsField を、引数 state 、mappings 、names 、および sources で実行する。OriginalLine の DecodeMappingsField を、引数 state 、mappings 、names 、および sources で実行する。OriginalColumn の DecodeMappingsField を、引数 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 が存在するならば、Name の DecodeMappingsField を、引数 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 を Vlq の VLQSignedValue とする。state .[[GeneratedColumn]] を state .[[GeneratedColumn]] + relativeColumn に設定する。
OriginalSource :
Vlq
relativeSourceIndex を Vlq の VLQSignedValue とする。state .[[SourceIndex]] を state .[[SourceIndex]] + relativeSourceIndex に設定する。
OriginalLine :
Vlq
relativeLine を Vlq の VLQSignedValue とする。state .[[OriginalLine]] を state .[[OriginalLine]] + relativeLine に設定する。
OriginalColumn :
Vlq
relativeColumn を Vlq の VLQSignedValue とする。state .[[OriginalColumn]] を state .[[OriginalColumn]] + relativeColumn に設定する。
Name :
Vlq
relativeName を Vlq の VLQSignedValue とする。state .[[NameIndex]] を state .[[NameIndex]] + relativeName に設定する。
9.2.2 DecodeMappings ( rawMappings , names , sources )
The abstract operation DecodeMappings takes arguments rawMappings (a String), names (a List of Strings), and sources (a List of Decoded Source Records ) and returns a List of Decoded Mapping Record . It performs the following steps when called:
mappings を新しい空の List とする。mappingsNode を、MappingsField を目標記号として使用して rawMappings を構文解析したときのルート Parse Node とする。構文解析が失敗したならば、任意にエラーを報告する 。mappings を返す。 state を、すべてのフィールドが 0 に設定された新しい Decode Mapping State Record とする。mappingsNode の DecodeMappingsField を、引数 state 、mappings 、names 、および sources で実行する。mappings を返す。
9.2.3 生成された JavaScript コードのための mappings
mapping エントリを持ち得る生成コード位置は、ECMAScript Lexical Grammar に従い、input elements の観点から定義される。mapping エントリは、次のいずれかを指さなければならない:
9.2.4 生成された JavaScript コードのための名前
source map 生成器は、JavaScript トークンについて、次の場合に [[Name]] フィールドを持つ mapping エントリを作成するべきである:
元ソース言語の構文要素が、生成された JavaScript コードに意味的に対応付けられる。
元ソース言語の構文要素が名前を持つ。
その場合、mapping エントリの [[Name]] は、元ソース言語の構文要素の名前であるべきである。非 null の [[Name]] を持つ mapping は、named mapping と呼ばれる。
Note 1
関数や変数をリネームしたり、即時実行関数式から関数名を削除したりするミニファイア。
次の列挙は、ECMAScript Syntactic Grammar の生成規則と、source map 生成器が named mapping を出力するべきそれぞれのトークンまたは非終端記号(生成規則の右辺)を列挙する。そのようなトークンに対して作成される mapping エントリは、9.2.3 節に従わなければならない。
この列挙は「最小限」として理解されるべきである。一般に、source map 生成器は任意の追加 named mapping を自由に出力できる。
Note 2
この列挙は、生成器が "should" により named mapping を出力するべきトークンに加えて、"may" により named mapping を出力してもよいトークンも列挙している。これらは、既存のツールが named mapping を出力または期待している現実を反映している。重複した named mapping は比較的安価である。names へのインデックスは相互に相対符号化されるため、同じ名前への後続の mapping は 0(A)として符号化される。
9.3 sources の解決
sourceRoot を前置した後に sources が絶対 URL でない場合、sources は source map に相対して解決される(HTML 文書内でスクリプトの src 属性を解決する場合と同様)。
9.3.1 DecodeSourceMapSources ( baseURL , sourceRoot , sources , sourcesContent , ignoreList )
The abstract operation DecodeSourceMapSources takes arguments baseURL (an URL ), sourceRoot (a String or null ), sources (a List of either Strings or null ), sourcesContent (a List of either Strings or null ), and ignoreList (a List of non-negative integers ) and returns a List of Decoded Source Record . It performs the following steps when called:
decodedSources を新しい空の List とする。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 を、baseURL を用いて source を URL parsing した結果とする。sourceURL が failure ならば、任意にエラーを報告する 。そうでなければ、decodedSource .[[URL]] を sourceURL に設定する。 ignoreList が index を含むならば、decodedSource .[[Ignored]] を true に設定する。sourcesContentCount > index ならば、decodedSource .[[Content]] を sourcesContent [index ] に設定する。decodedSource を decodedSources に追加する。index を index + 1 に設定する。decodedSources を返す。
Note ソース内容の表示をサポートするが、同じ
URL と異なる内容を持つ複数のソースの表示をサポートしない実装は、与えられた
URL に対応するさまざまな内容のうちの 1 つを任意に選択する。
9.4 拡張
source map 消費者は、追加機能をこの形式に追加しても既存ユーザーを破壊しないように、追加の認識されないプロパティを source map の拒否原因とするのではなく無視しなければならない。
10 Index 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 および file フィールド を共有するが、新しい sections フィールド を得る。
sections フィールド は、次のフィールドを持つ object の配列である:
offset フィールド は、line と column の 2 つのフィールドを持つ object であり、参照される source map が表す生成コード内へのオフセットを表す。
map フィールド は、埋め込まれた完全な source map object である。埋め込まれた map は、それを含む index map からいかなる値も継承しない。
sections は開始位置でソートされなければならず、表される sections は重なってはならない。
10.1 DecodeIndexSourceMap ( json , baseURL )
The abstract operation DecodeIndexSourceMap takes arguments json (an Object) and baseURL (an URL ) and returns a Decoded Source Map Record . It performs the following steps when called:
sectionsField を JSONObjectGet (json , "sections" ) とする。Assert : sectionsField は missing ではない。sectionsField が JSON array でないならば、エラーを投げる。JSONObjectGet (json , "version" ) が 3 𝔽 でないならば、任意にエラーを報告する 。fileField を GetOptionalString (json , "file" ) とする。sourceMap を Decoded Source Map Record { [[File]] : fileField , [[Sources]] : « », [[Mappings]] : « » } とする。previousOffsetPosition を null とする。previousLastMapping を null とする。JSONArrayIterate (sectionsField ) の各 JSON value section について、次を行う:section が JSON object でないならば、任意にエラーを報告する 。そうでなければ、offset を JSONObjectGet (section , "offset" ) とする。offset が JSON object でないならば、エラーを投げる。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 ならば、任意にエラーを報告する 。NOTE : 復号アルゴリズムのこの部分は、index source map の sections フィールド のエントリが順序付けられており、重なっていないことを検査する。生成器は重なりのある sections を持つ index source map を生成するべきでないと期待されるが、source map 消費者は、例えば sections のオフセットが順序付けられているというより単純な条件のみを検査してもよい。mapField を JSONObjectGet (section , "map" ) とする。mapField が JSON object でないならば、エラーを投げる。decodedSectionCompletion を Completion (DecodeSourceMap (json , baseURL )) とする。decodedSectionCompletion が throw completion ならば、任意にエラーを報告する 。そうでなければ、decodedSection を decodedSectionCompletion .[[Value]] とする。decodedSection .[[Sources]] の各 Decoded Source Record additionalSource について、次を行う:sourceMap .[[Sources]] が additionalSource を含まないならば、additionalSource を sourceMap .[[Sources]] に追加する。offsetMappings を新しい空の List とする。decodedSection .[[Mappings]] の各 Decoded Mapping Record mapping について、次を行う: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 を返す。
Note
実装は、index source map の sections を、mappings を結合せずに表現することを選んでもよい。例えば、各 section を別々に格納し、二分探索を行うことができる。
11 source map の取得
11.1 生成コードを source map にリンクする
source map 形式は言語およびプラットフォームに依存しないことを意図しているが、Web サーバーでホストされる JavaScript という期待されるユースケースについて、それらを参照する方法を定義することは有用である。
source map を出力にリンクする方法は 2 つ考えられる。1 つ目は HTTP ヘッダーを追加するためにサーバーサポートを必要とし、2 つ目はソース内の注釈を必要とする。
source map は、WHATWG URL で定義される URL を通じてリンクされる。特に、URI に出現することが許可される集合外の文字はパーセントエンコードされなければならず、data URI であってもよい。sourcesContent とともに data URI を使用すると、完全に自己完結した source map が可能になる。
HTTP sourcemap ヘッダーはソース注釈よりも優先され、両方が存在する場合、ヘッダー URL を使用して source map ファイルを解決するべきである。
source map URL を取得するために使用される方法にかかわらず、それを解決するには同じ処理が使用される。その処理は次のとおりである。
source map URL が絶対でない場合、それは生成コードのsource origin に相対する。source origin は次のいずれかの場合によって決定される:
11.1.2 インライン注釈を通じたリンク
生成コードは、sourceMappingURL という名前で source map の URL を含むコメント、またはその言語や形式に応じた同等の構文を含むべきである。この仕様は、JavaScript、CSS、および WebAssembly においてそのコメントがどのように見えるべきかを定義する。他の言語は類似の規約に従うべきである。
ある言語について、sourceMappingURL コメントを検出する方法は複数あり得る。これは、異なる実装が自分たちにとってより複雑でない方法を選択できるようにするためである。生成コードは、すべての抽出方法の結果が同じである場合、source map に曖昧さなくリンクする 。
ツールが source map に曖昧さなくリンクする 1 つ以上のソースファイルを消費し、source map にリンクする出力ファイルを生成する場合、それは曖昧さなく 行われなければならない。
Note
次の JavaScript コードは source map にリンクするが、曖昧さなく リンクしているわけではない:
let a = `
//# sourceMappingURL=foo.js.map
// `
これから source map URL を構文解析を通じて 抽出すると foo.js.map が得られる一方、構文解析なし では null が得られる。
module を module_decode (bytes ) とする。module が WebAssembly error ならば、null を返す。module の各 custom section customSection について、次を行う:name を customSection の name とする。CodePointsToString (name ) が "sourceMappingURL" ならば、value を customSection の bytes とする。CodePointsToString (value ) を返す。null を返す。
WebAssembly はテキスト形式ではなく、コメントをサポートしないため、単一の曖昧さのない抽出方法をサポートする。URL は WebAssembly name として符号化され、custom section の内容として配置される。WebAssembly コードを生成するツールが、sourceMappingURL 名を持つ custom section を 2 つ以上生成することは無効である。
11.2 source map のフェッチ
11.2.1 FetchSourceMap ( url )
The abstract operation FetchSourceMap takes argument url (an URL ) and returns a Promise. It performs the following steps when called:
promiseCapability を NewPromiseCapability (%Promise% ) とする。request を、request URL が url である新しい request とする。processResponseConsumeBody を、promiseCapability と url をキャプチャする、パラメーター (response , bodyBytes ) を持つ新しい Abstract Closure とし、呼び出されたときに次の手順を実行する:bodyBytes が null または failure ならば、Call (promiseCapability .[[Reject]] , undefined , « a new TypeError ») を実行する。戻る。 url の scheme が HTTP(S) scheme であり、かつバイト列 `)]}'` が bodyBytes の byte-sequence-prefix であるならば、bodyBytes の byte-sequence-length ≠ 0 かつ bodyBytes [0] が HTTP newline byte でない間、繰り返す:bodyBytes から 0 番目の要素を削除する。bodyString を UTF-8 decode of bodyBytes の Completion とする。IfAbruptRejectPromise (bodyString , promiseCapability )。jsonValue を Completion (ParseJSON (bodyString )) とする。IfAbruptRejectPromise (jsonValue , promiseCapability )。Call (promiseCapability .[[Resolve]] , undefined , « jsonValue ») を実行する。processResponseConsumeBody を processResponseConsumeBody に設定して fetch request を実行する。promiseCapability .[[Promise]] を返す。
Note
歴史的な理由により、HTTP(S) 経由で source map を配信する際、サーバーは source map の前に文字列 )]}' で始まる行を付加する場合がある。
)] } 'garbage here
{ "version" : 3 , ...}
これは次のように解釈される
{ "version" : 3 , ...}
12 source map record に対する操作
source map を復号した後、source map 消費者は、得られた Decoded Source Map Records を使用して、デバッグやその他のユースケースのために位置情報を検索できる。この節では、source map 消費者によってサポートされ得る典型的な操作の振る舞いを説明する。
GetOriginalPositions 操作は、生成コード内の位置に対応する元ソース内の位置を問い合わせるために使用できる。例えば、デバッガーで、ユーザーのマウスクリックに基づいて生成コードから元ソースへ移動するために使用できる。
12.1 GetOriginalPositions ( sourceMapRecord , generatedPosition )
The abstract operation GetOriginalPositions takes arguments sourceMapRecord (a Decoded Source Map Record ) and generatedPosition (a Position Record ) and returns a List of Original Position Records . It performs the following steps when called:
mappings を sourceMapRecord .[[Mappings]] とする。last を null とする。originalPositions を新しい空の List とする。mappings の各要素 mapping について、List の逆順に次を行う: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) 規約
source map を扱う場合、またはそれらを生成する場合には、次の規約に従うべきである。
A.1 Source map の命名
一般に、source map は生成ファイルと同じ名前を持つが、.map 拡張子が付く。例えば、page.js については、page.js.map という名前の source map が生成される。
A.2 eval されたコードを名前付き生成コードへリンクする
eval されたコードで source map を使用するためにサポートされるべき既存の規約があり、それは次の形式を持つ:
これは Give your eval a name with //@ sourceURL で説明されている。
Annex B (informative) 注記
B.1 言語中立のスタックマッピング
ソース言語に関する知識なしのスタックトレースマッピングは、この文書では扱われない 。
B.2 多段階マッピング
ツールが何らかの DSL(テンプレート)からソースを生成したり、TypeScript → JavaScript → minified JavaScript へコンパイルしたりして、最終的な source map が作成される前に複数の変換が発生することがより一般的になっている。この問題は 2 つの方法のいずれかで扱える。簡単だが損失のある方法は、デバッグの目的ではプロセス内の中間手順を無視することである。変換からのソース位置情報は、無視される(中間変換が “Original Source” と見なされる)か、引き継がれる(中間変換が隠される)。より完全な方法は、複数段階のマッピングをサポートすることである:Original Source も source map 参照を持つ場合、ユーザーにはそれも使用する選択肢が与えられる。
しかし、JavaScript 以外で "source map reference" がどのように見えるのかは不明である。より具体的には、JavaScript 形式の単一行コメントをサポートしない言語において source map reference がどのように見えるのかが不明である。
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/ >
Variable-length quantity , Wikipedia, available at <https://en.wikipedia.org/wiki/Variable-length_quantity >
Annex E (informative) 奥付
この仕様は、GitHub 上で Ecmarkup と呼ばれるプレーンテキストソース形式により執筆されている。Ecmarkup は、プレーンテキストで ECMAScript 仕様を執筆し、その仕様をこの文書の編集上の規約に従うフル機能の HTML レンダリングへ処理するためのフレームワークおよびツールセットを提供する HTML および Markdown の方言である。Ecmarkup は、構文を定義するための Grammarkdown や、アルゴリズム手順を執筆するための Ecmarkdown など、多数の他の形式および技術の上に構築され、それらを統合している。この仕様の PDF レンダリングは、HTML レンダリングを PDF に印刷することにより生成される。
この仕様の初版は、HTML および Markdown に基づく別のプレーンテキストソース形式である Bikeshed を使用して執筆された。
標準化前のこの文書のバージョンは、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.