Socket
Socket
Sign inDemoInstall

webidl2

Package Overview
Dependencies
Maintainers
4
Versions
106
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

webidl2 - npm Package Compare versions

Comparing version 23.3.0 to 23.4.0

2

dist/webidl2.js

@@ -1,2 +0,2 @@

!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.WebIDL2=t():e.WebIDL2=t()}(this,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,n),s.l=!0,s.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)n.d(r,s,function(t){return e[t]}.bind(null,s));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";function r(e,t,n,r,s,{level:o="error"}={}){function a(n){return n>0?e.slice(t,t+n):e.slice(Math.max(t+n,0),t)}function i(n,{precedes:r}={}){const s=n.map(e=>e.trivia+e.value).join(""),o=e[t];return"eof"===o.type?s:r?s+o.trivia:s.slice(o.trivia.length)}const c="eof"!==e[t].type?e[t].line:e.length>1?e[t-1].line:1,u=function(e){const t=e.split("\n");return t[t.length-1]}(i(a(-5),{precedes:!0})),l=a(5),p=i(l),d=u+p.split("\n")[0]+"\n"+(" ".repeat(u.length)+"^"),m="Syntax"===s?"since":"inside",f=`${s} error at line ${c}${e.name?` in ${e.name}`:""}${n?`, ${m} \`${n.partial?"partial ":""}${n.type} ${n.name}\``:""}:\n${d}`;return{message:`${f} ${r}`,bareMessage:r,context:f,line:c,sourceName:e.name,level:o,input:p,tokens:l}}function s(e,t,n,s,o){return r(e,t.index,n,s,"Validation",o)}n.r(t);const o={decimal:/-?(?=[0-9]*\.|[0-9]+[eE])(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][-+]?[0-9]+)?|[0-9]+[Ee][-+]?[0-9]+)/y,integer:/-?(0([Xx][0-9A-Fa-f]+|[0-7]*)|[1-9][0-9]*)/y,identifier:/[_-]?[A-Za-z][0-9A-Z_a-z-]*/y,string:/"[^"]*"/y,whitespace:/[\t\n\r ]+/y,comment:/((\/(\/.*|\*([^*]|\*[^\/])*\*\/)[\t\n\r ]*)+)/y,other:/[^\t\n\r 0-9A-Za-z]/y},a=["ByteString","DOMString","USVString"],i=["attribute","callback","const","deleter","dictionary","enum","getter","includes","inherit","interface","iterable","maplike","namespace","partial","required","setlike","setter","static","stringifier","typedef","unrestricted"],c=["-Infinity","FrozenArray","Infinity","NaN","Promise","boolean","byte","double","false","float","long","mixin","null","octet","optional","or","readonly","record","sequence","short","true","unsigned","void"].concat(i,a),u=["(",")",",","...",":",";","<","=",">","?","[","]","{","}"];class l{constructor(e){this.source=function(e){const t=[];let n=0,r="",s=1,a=0;for(;n<e.length;){const o=e.charAt(n);let l=-1;if(/[\t\n\r ]/.test(o)?l=i("whitespace",{noFlushTrivia:!0}):"/"===o&&(l=i("comment",{noFlushTrivia:!0})),-1!==l){const e=t.pop().value;s+=(e.match(/\n/g)||[]).length,r+=e,a-=1}else if(/[-0-9.A-Z_a-z]/.test(o)){if(-1===(l=i("decimal"))&&(l=i("integer")),-1===l){l=i("identifier");const e=t[t.length-1];-1!==l&&c.includes(e.value)&&(e.type=e.value)}}else'"'===o&&(l=i("string"));for(const o of u)if(e.startsWith(o,n)){t.push({type:o,value:o,trivia:r,line:s,index:a}),r="",l=n+=o.length;break}if(-1===l&&(l=i("other")),-1===l)throw new Error("Token stream not progressing");n=l,a+=1}return t.push({type:"eof",value:"",trivia:r}),t;function i(i,{noFlushTrivia:c}={}){const u=o[i];u.lastIndex=n;const l=u.exec(e);return l?(t.push({type:i,value:l[0],trivia:r,line:s,index:a}),c||(r=""),u.lastIndex):-1}}(e),this.position=0}error(e){throw new p(function(e,t,n,s){return r(e,t,n,s,"Syntax")}(this.source,this.position,this.current,e))}probe(e){return this.source.length>this.position&&this.source[this.position].type===e}consume(...e){for(const t of e){if(!this.probe(t))continue;const e=this.source[this.position];return this.position++,e}}unconsume(e){this.position=e}}class p extends Error{constructor({message:e,bareMessage:t,context:n,line:r,sourceName:s,input:o,tokens:a}){super(e),this.name="WebIDLParseError",this.bareMessage=t,this.context=n,this.line=r,this.sourceName=s,this.input=o,this.tokens=a}}class d{constructor({source:e,tokens:t}){Object.defineProperties(this,{source:{value:e},tokens:{value:t}})}toJSON(){const e={type:void 0,name:void 0,inheritance:void 0};let t=this;for(;t!==Object.prototype;){const n=Object.getOwnPropertyDescriptors(t);for(const[t,r]of Object.entries(n))(r.enumerable||r.get)&&(e[t]=this[t]);t=Object.getPrototypeOf(t)}return e}}function m(e,t){const n=e.consume("?");n&&(t.tokens.nullable=n),e.probe("?")&&e.error("Can't nullable more than once")}function f(e,t){let n=function(e,t){const n=e.consume("FrozenArray","Promise","sequence","record");if(!n)return;const r=new y({source:e.source,tokens:{base:n}});switch(r.tokens.open=e.consume("<")||e.error(`No opening bracket after ${n.type}`),n.type){case"Promise":{e.probe("[")&&e.error("Promise type cannot have extended attribute");const n=E(e,t)||e.error("Missing Promise subtype");r.subtype.push(n);break}case"sequence":case"FrozenArray":{const s=P(e,t)||e.error(`Missing ${n.type} subtype`);r.subtype.push(s);break}case"record":{e.probe("[")&&e.error("Record key cannot have extended attribute");const n=e.consume(...a)||e.error(`Record key must be one of: ${a.join(", ")}`),s=new y({source:e.source,tokens:{base:n}});s.tokens.separator=e.consume(",")||e.error("Missing comma after record key type"),s.type=t;const o=P(e,t)||e.error("Error parsing generic type record");r.subtype.push(s,o);break}}return r.idlType||e.error(`Error parsing generic type ${n.type}`),r.tokens.close=e.consume(">")||e.error(`Missing closing bracket after ${n.type}`),r}(e,t)||j(e);if(!n){const t=e.consume("identifier",...a);if(!t)return;n=new y({source:e.source,tokens:{base:t}}),e.probe("<")&&e.error(`Unsupported generic type ${t.value}`)}return"Promise"===n.generic&&e.probe("?")&&e.error("Promise type cannot be nullable"),n.type=t||null,m(e,n),n.nullable&&"any"===n.idlType&&e.error("Type `any` cannot be made nullable"),n}class y extends d{static parse(e,t){return f(e,t)||function(e,t){const n={};if(n.open=e.consume("("),!n.open)return;const r=new y({source:e.source,tokens:n});for(r.type=t||null;;){const t=P(e)||e.error("No type after open parenthesis or 'or' in union type");"any"===t.idlType&&e.error("Type `any` cannot be included in a union type"),r.subtype.push(t);const n=e.consume("or");if(!n)break;t.tokens.separator=n}return r.idlType.length<2&&e.error("At least two types are expected in a union type but found less"),n.close=e.consume(")")||e.error("Unterminated union type"),m(e,r),r}(e,t)}constructor({source:e,tokens:t}){super({source:e,tokens:t}),Object.defineProperty(this,"subtype",{value:[]}),this.extAttrs=[]}get generic(){return this.subtype.length&&this.tokens.base?this.tokens.base.value:""}get nullable(){return Boolean(this.tokens.nullable)}get union(){return Boolean(this.subtype.length)&&!this.tokens.base}get idlType(){if(this.subtype.length)return this.subtype;return N([this.tokens.prefix,this.tokens.base,this.tokens.postfix].filter(e=>e).map(e=>e.value).join(" "))}}class k extends d{static parse(e){const t=e.consume("=");if(!t)return null;const n=$(e)||e.consume("string","null","[","{")||e.error("No value for default"),r=[n];if("["===n.type){const t=e.consume("]")||e.error("Default sequence value must be empty");r.push(t)}else if("{"===n.type){const t=e.consume("}")||e.error("Default dictionary value must be empty");r.push(t)}return new k({source:e.source,tokens:{assign:t},expression:r})}constructor({source:e,tokens:t,expression:n}){super({source:e,tokens:t}),Object.defineProperty(this,"expression",{value:n})}get type(){return I(this.expression[0]).type}get value(){return I(this.expression[0]).value}get negative(){return I(this.expression[0]).negative}}class h extends Array{constructor({source:e,tokens:t}){super(),Object.defineProperties(this,{source:{value:e},tokens:{value:t}})}}class b extends d{static parse(e){const t={assign:e.consume("=")},n=new b({source:e.source,tokens:t});return t.assign&&(t.secondaryName=e.consume("identifier","decimal","integer","string")),t.open=e.consume("("),t.open?(n.list="identifier-list"===n.rhsType?function(e){const t=M(e,{parser:w.parser(e,"identifier"),listName:"identifier list"});t.length||e.error("Expected identifiers but none found");return t}(e):O(e),t.close=e.consume(")")||e.error("Unexpected token in extended attribute argument list")):n.hasRhs&&!t.secondaryName&&e.error("No right hand side to extended attribute assignment"),n}get rhsType(){return this.tokens.assign?this.tokens.secondaryName?this.tokens.secondaryName.type:"identifier-list":null}}class g extends d{static parse(e){const t=e.consume("identifier");if(t)return new g({source:e.source,tokens:{name:t},params:b.parse(e)})}constructor({source:e,tokens:t,params:n}){super({source:e,tokens:t}),Object.defineProperty(this,"params",{value:n})}get type(){return"extended-attribute"}get name(){return this.tokens.name.value}get rhs(){const{rhsType:e,tokens:t,list:n}=this.params;return e?{type:e,value:"identifier-list"===e?n:t.secondaryName.value}:null}get arguments(){const{rhsType:e,list:t}=this.params;return t&&"identifier-list"!==e?t:[]}*validate(e){if("NoInterfaceObject"===this.name){const e="`[NoInterfaceObject]` extended attribute is an undesirable feature that may be removed from Web IDL in the future. Refer to the [relevant upstream PR](https://github.com/heycam/webidl/pull/609) for more information.";yield s(this.source,this.tokens.name,this,e,{level:"warning"})}for(const t of this.arguments)yield*t.validate(e)}}class v extends h{static parse(e){const t={};if(t.open=e.consume("["),!t.open)return new v({});const n=new v({source:e.source,tokens:t});return n.push(...M(e,{parser:g.parse,listName:"extended attribute"})),t.close=e.consume("]")||e.error("Unexpected closing token of extended attribute"),n.length||e.error("Found an empty extended attribute"),e.probe("[")&&e.error("Illegal double extended attribute lists, consider merging them"),n}*validate(e){for(const t of this)yield*t.validate(e)}}class x extends d{static parse(e){const t=e.position,n={},r=new x({source:e.source,tokens:n});return r.extAttrs=v.parse(e),n.optional=e.consume("optional"),r.idlType=P(e,"argument-type"),r.idlType?(n.optional||(n.variadic=e.consume("...")),n.name=e.consume("identifier",...i),n.name?(r.default=n.optional?k.parse(e):null,r):e.unconsume(t)):e.unconsume(t)}get type(){return"argument"}get optional(){return!!this.tokens.optional}get variadic(){return!!this.tokens.variadic}get name(){return N(this.tokens.name.value)}*validate(e){if(function e(t,n){if(!t.union){const r=n.unique.get(t.idlType);if(!r)return!1;if("typedef"===r.type){if(null===n.cache.typedefIncludesDictionary.get(r))return!1;n.cache.typedefIncludesDictionary.set(r,null);const t=e(r.idlType,n);return n.cache.typedefIncludesDictionary.set(r,t),t}return"dictionary"===r.type}for(const r of t.subtype)if(e(r,n))return!0;return!1}(this.idlType,e)){if(this.optional&&!this.default){const e="Optional dictionary arguments must have a default value of `{}`.";yield s(this.source,this.tokens.name,this,e)}if(this.idlType.nullable){const e="Dictionary arguments cannot be nullable.";yield s(this.source,this.tokens.name,this,e)}}}}class w extends d{static parser(e,t){return()=>{const n=e.consume(t);if(n)return new w({source:e.source,tokens:{value:n}})}}get value(){return this.tokens.value.value}}class T extends d{static parse(e,{special:t,regular:n}={}){const r={special:t},s=new T({source:e.source,tokens:r});return t&&"stringifier"===t.value&&(r.termination=e.consume(";"),r.termination)?(s.arguments=[],s):(t||n||(r.special=e.consume("getter","setter","deleter")),s.idlType=E(e)||e.error("Missing return type"),r.name=e.consume("identifier"),r.open=e.consume("(")||e.error("Invalid operation"),s.arguments=O(e),r.close=e.consume(")")||e.error("Unterminated operation"),r.termination=e.consume(";")||e.error("Unterminated operation, expected `;`"),s)}get type(){return"operation"}get name(){const{name:e}=this.tokens;return e?N(e.value):""}get special(){return this.tokens.special?this.tokens.special.value:""}*validate(e){for(const t of this.arguments)yield*t.validate(e)}}class A extends d{static parse(e,{special:t,noInherit:n=!1,readonly:r=!1}={}){const s=e.position,o={special:t},a=new A({source:e.source,tokens:o});if(t||n||(o.special=e.consume("inherit")),"inherit"===a.special&&e.probe("readonly")&&e.error("Inherited attributes cannot be read-only"),o.readonly=e.consume("readonly"),r&&!o.readonly&&e.probe("attribute")&&e.error("Attributes must be readonly in this context"),o.base=e.consume("attribute"),o.base){switch(a.idlType=P(e,"attribute-type")||e.error("Attribute lacks a type"),a.idlType.generic){case"sequence":case"record":e.error(`Attributes cannot accept ${a.idlType.generic} types`)}return o.name=e.consume("identifier","required")||e.error("Attribute lacks a name"),o.termination=e.consume(";")||e.error("Unterminated attribute, expected `;`"),a}e.unconsume(s)}get type(){return"attribute"}get special(){return this.tokens.special?this.tokens.special.value:""}get readonly(){return!!this.tokens.readonly}get name(){return N(this.tokens.name.value)}}function N(e){return e.startsWith("_")?e.slice(1):e}function M(e,{parser:t,allowDangler:n,listName:r="list"}){const s=t(e);if(!s)return[];s.tokens.separator=e.consume(",");const o=[s];for(;s.tokens.separator;){const s=t(e);if(!s){n||e.error(`Trailing comma in ${r}`);break}if(s.tokens.separator=e.consume(","),o.push(s),!s.tokens.separator)break}return o}function $(e){return e.consume("true","false","Infinity","-Infinity","NaN","decimal","integer")}function I({type:e,value:t}){switch(e){case"true":case"false":return{type:"boolean",value:"true"===e};case"Infinity":case"-Infinity":return{type:"Infinity",negative:e.startsWith("-")};case"[":return{type:"sequence",value:[]};case"{":return{type:"dictionary"};case"decimal":case"integer":return{type:"number",value:t};case"string":return{type:"string",value:t.slice(1,-1)};default:return{type:e}}}function j(e){const{source:t}=e,n=function(){const n=e.consume("unsigned"),r=e.consume("short","long");if(r){const s=e.consume("long");return new y({source:t,tokens:{prefix:n,base:r,postfix:s}})}n&&e.error("Failed to parse integer type")}()||function(){const n=e.consume("unrestricted"),r=e.consume("float","double");if(r)return new y({source:t,tokens:{prefix:n,base:r}});n&&e.error("Failed to parse float type")}();if(n)return n;const r=e.consume("boolean","byte","octet");return r?new y({source:t,tokens:{base:r}}):void 0}function O(e){return M(e,{parser:x.parse,listName:"arguments list"})}function P(e,t){const n=v.parse(e),r=y.parse(e,t);return r&&(r.extAttrs=n),r}function E(e,t){const n=y.parse(e,t||"return-type");if(n)return n;const r=e.consume("void");if(r){const t=new y({source:e.source,tokens:{base:r}});return t.type="return-type",t}}function D(e){const t=e.consume("stringifier");if(t)return A.parse(e,{special:t})||T.parse(e,{special:t})||e.error("Unterminated stringifier")}class q extends w{static parse(e){const t=e.consume("string");if(t)return new q({source:e.source,tokens:{value:t}})}get type(){return"enum-value"}get value(){return super.value.slice(1,-1)}}class U extends d{static parse(e){const t={};if(t.base=e.consume("enum"),!t.base)return;t.name=e.consume("identifier")||e.error("No name for enum");const n=e.current=new U({source:e.source,tokens:t});return t.open=e.consume("{")||e.error("Bodyless enum"),n.values=M(e,{parser:q.parse,allowDangler:!0,listName:"enumeration"}),e.probe("string")&&e.error("No comma between enum values"),t.close=e.consume("}")||e.error("Unexpected value in enum"),n.values.length||e.error("No value in enum"),t.termination=e.consume(";")||e.error("No semicolon after enum"),n}get type(){return"enum"}get name(){return N(this.tokens.name.value)}}class S extends d{static parse(e){const t=e.consume("identifier");if(!t)return;const n={target:t};if(n.includes=e.consume("includes"),n.includes)return n.mixin=e.consume("identifier")||e.error("Incomplete includes statement"),n.termination=e.consume(";")||e.error("No terminating ; for includes statement"),new S({source:e.source,tokens:n});e.unconsume(t.index)}get type(){return"includes"}get target(){return N(this.tokens.target.value)}get includes(){return N(this.tokens.mixin.value)}}class W extends d{static parse(e){const t={},n=new W({source:e.source,tokens:t});if(t.base=e.consume("typedef"),t.base)return n.idlType=P(e,"typedef-type")||e.error("Typedef lacks a type"),t.name=e.consume("identifier")||e.error("Typedef lacks a name"),e.current=n,t.termination=e.consume(";")||e.error("Unterminated typedef, expected `;`"),n}get type(){return"typedef"}get name(){return N(this.tokens.name.value)}}class _ extends d{static parse(e,t){const n={base:t},r=new _({source:e.source,tokens:n});return n.name=e.consume("identifier")||e.error("Callback lacks a name"),e.current=r,n.assign=e.consume("=")||e.error("Callback lacks an assignment"),r.idlType=E(e)||e.error("Callback lacks a return type"),n.open=e.consume("(")||e.error("Callback lacks parentheses for arguments"),r.arguments=O(e),n.close=e.consume(")")||e.error("Unterminated callback"),n.termination=e.consume(";")||e.error("Unterminated callback, expected `;`"),r}get type(){return"callback"}get name(){return N(this.tokens.name.value)}}class F extends d{static parse(e,t,{type:n,inheritable:r,allowedMembers:s}){const{tokens:o}=t;for(o.name=e.consume("identifier")||e.error(`Missing name in ${t.type}`),e.current=t,r&&Object.assign(o,function(e){const t=e.consume(":");return t?{colon:t,inheritance:e.consume("identifier")||e.error("Inheritance lacks a type")}:{}}(e)),o.open=e.consume("{")||e.error(`Bodyless ${n}`),t.members=[];;){if(o.close=e.consume("}"),o.close)return o.termination=e.consume(";")||e.error(`Missing semicolon after ${n}`),t;const r=v.parse(e);let a;for(const[t,...n]of s)if(a=t(e,...n))break;a||e.error("Unknown member"),a.extAttrs=r,t.members.push(a)}}get partial(){return!!this.tokens.partial}get name(){return N(this.tokens.name.value)}get inheritance(){return this.tokens.inheritance?N(this.tokens.inheritance.value):null}*validate(e){for(const t of this.members)t.validate&&(yield*t.validate(e))}}class R extends d{static parse(e){const t={};if(t.base=e.consume("const"),!t.base)return;let n=j(e);if(!n){const t=e.consume("identifier")||e.error("Const lacks a type");n=new y({source:e.source,tokens:{base:t}})}e.probe("?")&&e.error("Unexpected nullable constant type"),n.type="const-type",t.name=e.consume("identifier")||e.error("Const lacks a name"),t.assign=e.consume("=")||e.error("Const lacks value assignment"),t.value=$(e)||e.error("Const lacks a value"),t.termination=e.consume(";")||e.error("Unterminated const, expected `;`");const r=new R({source:e.source,tokens:t});return r.idlType=n,r}get type(){return"const"}get name(){return unescape(this.tokens.name.value)}get value(){return I(this.tokens.value)}}class C extends d{static parse(e){const t=e.position,n={},r=new C({source:e.source,tokens:n});if(n.readonly=e.consume("readonly"),n.base=n.readonly?e.consume("maplike","setlike"):e.consume("iterable","maplike","setlike"),!n.base)return void e.unconsume(t);const{type:s}=r,o="maplike"===s,a=o||"iterable"===s;n.open=e.consume("<")||e.error(`Missing less-than sign \`<\` in ${s} declaration`);const i=P(e)||e.error(`Missing a type argument in ${s} declaration`);return r.idlType=[i],a&&(i.tokens.separator=e.consume(","),i.tokens.separator?r.idlType.push(P(e)):o&&e.error(`Missing second type argument in ${s} declaration`)),n.close=e.consume(">")||e.error(`Missing greater-than sign \`>\` in ${s} declaration`),n.termination=e.consume(";")||e.error(`Missing semicolon after ${s} declaration`),r}get type(){return this.tokens.base.value}get readonly(){return!!this.tokens.readonly}}function z(e){const t=e.consume("static");if(t)return A.parse(e,{special:t})||T.parse(e,{special:t})||e.error("No body in static member")}class L extends F{static parse(e,t,{partial:n=null}={}){const r={partial:n,base:t};return F.parse(e,new L({source:e.source,tokens:r}),{type:"interface",inheritable:!n,allowedMembers:[[R.parse],[z],[D],[C.parse],[A.parse],[T.parse]]})}get type(){return"interface"}*validate(e){if(yield*this.extAttrs.validate(e),!this.partial&&this.extAttrs.every(e=>"Exposed"!==e.name)&&this.extAttrs.every(e=>"NoInterfaceObject"!==e.name)){const e="Interfaces must have `[Exposed]` extended attribute. To fix, add, for example, `[Exposed=Window]`. Please also consider carefully if your interface should also be exposed in a Worker scope. Refer to the [WebIDL spec section on Exposed](https://heycam.github.io/webidl/#Exposed) for more information.";yield s(this.source,this.tokens.name,this,e)}yield*super.validate(e),this.partial||(yield*function*(e,t){const n=new Set(i(t).map(e=>e.name)),r=e.partials.get(t.name)||[],o=e.mixinMap.get(t.name)||[];for(const e of[...r,...o]){const r=i(e);yield*a(r,n,e,t);for(const e of r)n.add(e.name)}function*a(e,t,n,r){for(const o of e){const{name:e}=o;if(e&&t.has(e)){const t=`The operation "${e}" has already been defined for the base interface "${r.name}" either in itself or in a mixin`;yield s(n.source,o.tokens.name,n,t)}}}function i(e){return e.members.filter(({type:e})=>"operation"===e)}}(e,this))}}class B extends F{static parse(e,t,{partial:n}={}){const r={partial:n,base:t};if(r.mixin=e.consume("mixin"),r.mixin)return F.parse(e,new B({source:e.source,tokens:r}),{type:"interface mixin",allowedMembers:[[R.parse],[D],[A.parse,{noInherit:!0}],[T.parse,{regular:!0}]]})}get type(){return"interface mixin"}}class Z extends d{static parse(e){const t={},n=new Z({source:e.source,tokens:t});return n.extAttrs=v.parse(e),t.required=e.consume("required"),n.idlType=P(e,"dictionary-type")||e.error("Dictionary member lacks a type"),t.name=e.consume("identifier")||e.error("Dictionary member lacks a name"),n.default=k.parse(e),t.required&&n.default&&e.error("Required member must not have a default"),t.termination=e.consume(";")||e.error("Unterminated dictionary member, expected `;`"),n}get type(){return"field"}get name(){return N(this.tokens.name.value)}get required(){return!!this.tokens.required}}class V extends F{static parse(e,{partial:t}={}){const n={partial:t};if(n.base=e.consume("dictionary"),n.base)return F.parse(e,new V({source:e.source,tokens:n}),{type:"dictionary",inheritable:!t,allowedMembers:[[Z.parse]]})}get type(){return"dictionary"}}class J extends F{static parse(e,{partial:t}={}){const n={partial:t};if(n.base=e.consume("namespace"),n.base)return F.parse(e,new J({source:e.source,tokens:n}),{type:"namespace",allowedMembers:[[A.parse,{noInherit:!0,readonly:!0}],[T.parse,{regular:!0}]]})}get type(){return"namespace"}*validate(e){if(!this.partial&&this.extAttrs.every(e=>"Exposed"!==e.name)){const e="Namespaces must have [Exposed] extended attribute. To fix, add, for example, [Exposed=Window]. Please also consider carefully if your namespace should also be exposed in a Worker scope. Refer to the [WebIDL spec section on Exposed](https://heycam.github.io/webidl/#Exposed) for more information.";yield s(this.source,this.tokens.name,this,e)}yield*super.validate(e)}}class X extends F{static parse(e,t,{partial:n=null}={}){const r={callback:t};if(r.base=e.consume("interface"),r.base)return F.parse(e,new X({source:e.source,tokens:r}),{type:"callback interface",inheritable:!n,allowedMembers:[[R.parse],[T.parse,{regular:!0}]]})}get type(){return"callback interface"}}function G(e,t){const n=e.source;function r(t){e.error(t)}function s(...t){return e.consume(...t)}function o(t){const n=s("interface");if(n)return B.parse(e,n,t)||L.parse(e,n,t)||r("Interface has no proper body")}function a(){return function(){const t=s("callback");if(t)return e.probe("interface")?X.parse(e,t):_.parse(e,t)}()||o()||function(){const t=s("partial");if(t)return V.parse(e,{partial:t})||o({partial:t})||J.parse(e,{partial:t})||r("Partial doesn't apply to anything")}()||V.parse(e)||U.parse(e)||W.parse(e)||S.parse(e)||J.parse(e)}const i=function(){if(!n.length)return[];const o=[];for(;;){const t=v.parse(e),n=a();if(!n){t.length&&r("Stray extended attributes");break}n.extAttrs=t,o.push(n)}const i=s("eof");return t.concrete&&o.push(i),o}();return e.position<n.length&&r("Unrecognised tokens"),i}function H(e,t={}){const n=new l(e);return void 0!==t.sourceName&&(n.source.name=t.sourceName),G(n,t)}function K(e){return e}const Q={wrap:e=>e.join(""),trivia:K,name:K,reference:K,type:K,generic:K,inheritance:K,definition:K,extendedAttribute:K,extendedAttributeReference:K};function Y(e,{templates:t=Q}={}){function n(e,{unescaped:n,context:r}){return n||(n=e.startsWith("_")?e.slice(1):e),t.reference(e,n,r)}function r(e,n=K,...r){if(!e)return"";const s=n(e.value,...r);return t.wrap([t.trivia(e.trivia),s])}function s(e,t){return r(e,n,{context:t})}function o(e,n){return r(e,t.name,n)}function a(e){if(e.union||e.generic)return t.wrap([r(e.tokens.base,t.generic),r(e.tokens.open),...e.subtype.map(i),r(e.tokens.close)]);const s=e.tokens.prefix||e.tokens.base,o=e.tokens.prefix?[e.tokens.prefix.value,t.trivia(e.tokens.base.trivia)]:[],a=n(t.wrap([...o,e.tokens.base.value,r(e.tokens.postfix)]),{unescaped:e.idlType,context:e});return t.wrap([t.trivia(s.trivia),a])}function i(e){return t.wrap([p(e.extAttrs),a(e),r(e.tokens.nullable),r(e.tokens.separator)])}function c(e){return e?t.wrap([r(e.tokens.assign),...e.expression.map(e=>r(e))]):""}function u(e){return t.wrap([p(e.extAttrs),r(e.tokens.optional),t.type(i(e.idlType)),r(e.tokens.variadic),o(e.tokens.name,{data:e}),c(e.default),r(e.tokens.separator)])}function l(e){const{rhsType:n}=e.params;return t.wrap([t.trivia(e.tokens.name.trivia),t.extendedAttribute(t.wrap([t.extendedAttributeReference(e.name),r(e.params.tokens.assign),s(e.params.tokens.secondaryName,e),r(e.params.tokens.open),...e.params.list?e.params.list.map("identifier-list"===n?n=>(function(e,n){return t.wrap([s(e.tokens.value,n),r(e.tokens.separator)])})(n,e):u):[],r(e.params.tokens.close)])),r(e.tokens.separator)])}function p(e){return e.length?t.wrap([r(e.tokens.open),...e.map(l),r(e.tokens.close)]):""}function d(e){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.callback),r(e.tokens.partial),r(e.tokens.base),r(e.tokens.mixin),o(e.tokens.name,{data:e}),(s=e,s.tokens.inheritance?t.wrap([r(s.tokens.colon),t.trivia(s.tokens.inheritance.trivia),t.inheritance(n(s.tokens.inheritance.value,{context:s}))]):""),r(e.tokens.open),y(e.members,e),r(e.tokens.close),r(e.tokens.termination)]),{data:e});var s}function m(e,n){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.readonly),r(e.tokens.base,t.generic),r(e.tokens.open),t.wrap(e.idlType.map(i)),r(e.tokens.close),r(e.tokens.termination)]),{data:e,parent:n})}t=Object.assign({},Q,t);const f={interface:d,"interface mixin":d,namespace:d,operation:function(e,n){const s=e.idlType?[t.type(i(e.idlType)),o(e.tokens.name,{data:e,parent:n}),r(e.tokens.open),t.wrap(e.arguments.map(u)),r(e.tokens.close)]:[];return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.special),...s,r(e.tokens.termination)]),{data:e,parent:n})},attribute:function(e,n){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.special),r(e.tokens.readonly),r(e.tokens.base),t.type(i(e.idlType)),o(e.tokens.name,{data:e,parent:n}),r(e.tokens.termination)]),{data:e,parent:n})},dictionary:d,field:function(e,n){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.required),t.type(i(e.idlType)),o(e.tokens.name,{data:e,parent:n}),c(e.default),r(e.tokens.termination)]),{data:e,parent:n})},const:function(e,n){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.base),t.type(i(e.idlType)),o(e.tokens.name,{data:e,parent:n}),r(e.tokens.assign),r(e.tokens.value),r(e.tokens.termination)]),{data:e,parent:n})},typedef:function(e){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.base),t.type(i(e.idlType)),o(e.tokens.name,{data:e}),r(e.tokens.termination)]),{data:e})},includes:function(e){return t.definition(t.wrap([p(e.extAttrs),s(e.tokens.target,e),r(e.tokens.includes),s(e.tokens.mixin,e),r(e.tokens.termination)]),{data:e})},callback:function(e){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.base),o(e.tokens.name,{data:e}),r(e.tokens.assign),t.type(i(e.idlType)),r(e.tokens.open),...e.arguments.map(u),r(e.tokens.close),r(e.tokens.termination)]),{data:e})},enum:function(e){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.base),o(e.tokens.name,{data:e}),r(e.tokens.open),y(e.values,e),r(e.tokens.close),r(e.tokens.termination)]),{data:e})},"enum-value":function(e,n){return t.wrap([t.trivia(e.tokens.value.trivia),t.definition(t.wrap(['"',t.name(e.value,{data:e,parent:n}),'"']),{data:e,parent:n}),r(e.tokens.separator)])},iterable:m,legacyiterable:m,maplike:m,setlike:m,"callback interface":d,eof:function(e){return t.trivia(e.trivia)}};function y(e,n){if(!e)return;const r=e.map(e=>(function(e,t){if(!f[e.type])throw new Error(`Type "${e.type}" is unsupported`);return f[e.type](e,t)})(e,n));return t.wrap(r)}return y(e)}function ee(e,t){const n=new Map,r=e.filter(e=>"includes"===e.type);for(const e of r){const r=t.get(e.includes);if(!r)continue;const s=n.get(e.target);s?s.push(r):n.set(e.target,[r])}return n}function*te(e){const t=function(e){const t=new Map,n=new Set,r=new Map;for(const s of e)if(s.partial){const e=r.get(s.name);e?e.push(s):r.set(s.name,[s])}else s.name&&(t.has(s.name)?n.add(s):t.set(s.name,s));return{all:e,unique:t,partials:r,duplicates:n,mixinMap:ee(e,t),cache:{typedefIncludesDictionary:new WeakMap}}}(e);for(const e of t.all)e.validate&&(yield*e.validate(t));yield*function*({unique:e,duplicates:t}){for(const n of t){const{name:t}=n,r=`The name "${t}" of type "${e.get(t).type}" was already seen`;yield s(n.source,n.tokens.name,n,r)}}(t)}function ne(e){return[...te((t=e,t.flat?t.flat():[].concat(...t)))];var t}n.d(t,"parse",function(){return H}),n.d(t,"write",function(){return Y}),n.d(t,"validate",function(){return ne})}])});
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.WebIDL2=t():e.WebIDL2=t()}(this,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,n),s.l=!0,s.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)n.d(r,s,function(t){return e[t]}.bind(null,s));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";function r(e,t,n,r,s,{level:o="error"}={}){function i(n){return n>0?e.slice(t,t+n):e.slice(Math.max(t+n,0),t)}function a(n,{precedes:r}={}){const s=n.map(e=>e.trivia+e.value).join(""),o=e[t];return"eof"===o.type?s:r?s+o.trivia:s.slice(o.trivia.length)}const c="eof"!==e[t].type?e[t].line:e.length>1?e[t-1].line:1,u=function(e){const t=e.split("\n");return t[t.length-1]}(a(i(-5),{precedes:!0})),l=i(5),p=a(l),d=u+p.split("\n")[0]+"\n"+(" ".repeat(u.length)+"^"),m="Syntax"===s?"since":"inside",f=`${s} error at line ${c}${e.name?` in ${e.name}`:""}${n&&n.name?`, ${m} \`${n.partial?"partial ":""}${n.type} ${n.name}\``:""}:\n${d}`;return{message:`${f} ${r}`,bareMessage:r,context:f,line:c,sourceName:e.name,level:o,input:p,tokens:l}}function s(e,t,n,s,o){return r(e,t.index,n,s,"Validation",o)}n.r(t);const o={decimal:/-?(?=[0-9]*\.|[0-9]+[eE])(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][-+]?[0-9]+)?|[0-9]+[Ee][-+]?[0-9]+)/y,integer:/-?(0([Xx][0-9A-Fa-f]+|[0-7]*)|[1-9][0-9]*)/y,identifier:/[_-]?[A-Za-z][0-9A-Z_a-z-]*/y,string:/"[^"]*"/y,whitespace:/[\t\n\r ]+/y,comment:/((\/(\/.*|\*([^*]|\*[^\/])*\*\/)[\t\n\r ]*)+)/y,other:/[^\t\n\r 0-9A-Za-z]/y},i=["ByteString","DOMString","USVString"],a=["attribute","callback","const","deleter","dictionary","enum","getter","includes","inherit","interface","iterable","maplike","namespace","partial","required","setlike","setter","static","stringifier","typedef","unrestricted"],c=["-Infinity","FrozenArray","Infinity","NaN","Promise","async","boolean","byte","double","false","float","long","mixin","null","octet","optional","or","readonly","record","sequence","short","true","unsigned","void"].concat(a,i),u=["(",")",",","...",":",";","<","=",">","?","[","]","{","}"];class l{constructor(e){this.source=function(e){const t=[];let n=0,r="",s=1,i=0;for(;n<e.length;){const o=e.charAt(n);let l=-1;if(/[\t\n\r ]/.test(o)?l=a("whitespace",{noFlushTrivia:!0}):"/"===o&&(l=a("comment",{noFlushTrivia:!0})),-1!==l){const e=t.pop().value;s+=(e.match(/\n/g)||[]).length,r+=e,i-=1}else if(/[-0-9.A-Z_a-z]/.test(o)){if(-1===(l=a("decimal"))&&(l=a("integer")),-1===l){l=a("identifier");const e=t[t.length-1];-1!==l&&c.includes(e.value)&&(e.type=e.value)}}else'"'===o&&(l=a("string"));for(const o of u)if(e.startsWith(o,n)){t.push({type:o,value:o,trivia:r,line:s,index:i}),r="",l=n+=o.length;break}if(-1===l&&(l=a("other")),-1===l)throw new Error("Token stream not progressing");n=l,i+=1}return t.push({type:"eof",value:"",trivia:r}),t;function a(a,{noFlushTrivia:c}={}){const u=o[a];u.lastIndex=n;const l=u.exec(e);return l?(t.push({type:a,value:l[0],trivia:r,line:s,index:i}),c||(r=""),u.lastIndex):-1}}(e),this.position=0}error(e){throw new p(function(e,t,n,s){return r(e,t,n,s,"Syntax")}(this.source,this.position,this.current,e))}probe(e){return this.source.length>this.position&&this.source[this.position].type===e}consume(...e){for(const t of e){if(!this.probe(t))continue;const e=this.source[this.position];return this.position++,e}}unconsume(e){this.position=e}}class p extends Error{constructor({message:e,bareMessage:t,context:n,line:r,sourceName:s,input:o,tokens:i}){super(e),this.name="WebIDLParseError",this.bareMessage=t,this.context=n,this.line=r,this.sourceName=s,this.input=o,this.tokens=i}}class d{constructor({source:e,tokens:t}){Object.defineProperties(this,{source:{value:e},tokens:{value:t}})}toJSON(){const e={type:void 0,name:void 0,inheritance:void 0};let t=this;for(;t!==Object.prototype;){const n=Object.getOwnPropertyDescriptors(t);for(const[t,r]of Object.entries(n))(r.enumerable||r.get)&&(e[t]=this[t]);t=Object.getPrototypeOf(t)}return e}}function m(e,t){if(!e.union){const n=t.unique.get(e.idlType);if(!n)return;if("typedef"===n.type){const{typedefIncludesDictionary:r}=t.cache;if(r.has(n))return r.get(n);t.cache.typedefIncludesDictionary.set(n,void 0);const s=m(n.idlType,t);if(t.cache.typedefIncludesDictionary.set(n,s),s)return e}if("dictionary"===n.type)return e}for(const n of e.subtype){const e=m(n,t);if(e)return n.union?e:n}}function f(e,t){const n=e.consume("?");n&&(t.tokens.nullable=n),e.probe("?")&&e.error("Can't nullable more than once")}function y(e,t){let n=function(e,t){const n=e.consume("FrozenArray","Promise","sequence","record");if(!n)return;const r=new h({source:e.source,tokens:{base:n}});switch(r.tokens.open=e.consume("<")||e.error(`No opening bracket after ${n.type}`),n.type){case"Promise":{e.probe("[")&&e.error("Promise type cannot have extended attribute");const n=q(e,t)||e.error("Missing Promise subtype");r.subtype.push(n);break}case"sequence":case"FrozenArray":{const s=E(e,t)||e.error(`Missing ${n.type} subtype`);r.subtype.push(s);break}case"record":{e.probe("[")&&e.error("Record key cannot have extended attribute");const n=e.consume(...i)||e.error(`Record key must be one of: ${i.join(", ")}`),s=new h({source:e.source,tokens:{base:n}});s.tokens.separator=e.consume(",")||e.error("Missing comma after record key type"),s.type=t;const o=E(e,t)||e.error("Error parsing generic type record");r.subtype.push(s,o);break}}return r.idlType||e.error(`Error parsing generic type ${n.type}`),r.tokens.close=e.consume(">")||e.error(`Missing closing bracket after ${n.type}`),r}(e,t)||O(e);if(!n){const t=e.consume("identifier",...i);if(!t)return;n=new h({source:e.source,tokens:{base:t}}),e.probe("<")&&e.error(`Unsupported generic type ${t.value}`)}return"Promise"===n.generic&&e.probe("?")&&e.error("Promise type cannot be nullable"),n.type=t||null,f(e,n),n.nullable&&"any"===n.idlType&&e.error("Type `any` cannot be made nullable"),n}class h extends d{static parse(e,t){return y(e,t)||function(e,t){const n={};if(n.open=e.consume("("),!n.open)return;const r=new h({source:e.source,tokens:n});for(r.type=t||null;;){const t=E(e)||e.error("No type after open parenthesis or 'or' in union type");"any"===t.idlType&&e.error("Type `any` cannot be included in a union type"),r.subtype.push(t);const n=e.consume("or");if(!n)break;t.tokens.separator=n}return r.idlType.length<2&&e.error("At least two types are expected in a union type but found less"),n.close=e.consume(")")||e.error("Unterminated union type"),f(e,r),r}(e,t)}constructor({source:e,tokens:t}){super({source:e,tokens:t}),Object.defineProperty(this,"subtype",{value:[]}),this.extAttrs=[]}get generic(){return this.subtype.length&&this.tokens.base?this.tokens.base.value:""}get nullable(){return Boolean(this.tokens.nullable)}get union(){return Boolean(this.subtype.length)&&!this.tokens.base}get idlType(){if(this.subtype.length)return this.subtype;return M([this.tokens.prefix,this.tokens.base,this.tokens.postfix].filter(e=>e).map(e=>e.value).join(" "))}*validate(e){const t=!this.union&&e.unique.get(this.idlType),n=this.union?this:t&&"typedef"===t.type?t.idlType:void 0;if(n&&this.nullable){const t=m(n,e);if(t){const e=(this.union?t:this).tokens.base,n="Nullable union cannot include a dictionary type";yield s(this.source,e,this,n)}}else for(const t of this.subtype)yield*t.validate(e)}}class k extends d{static parse(e){const t=e.consume("=");if(!t)return null;const n=I(e)||e.consume("string","null","[","{")||e.error("No value for default"),r=[n];if("["===n.type){const t=e.consume("]")||e.error("Default sequence value must be empty");r.push(t)}else if("{"===n.type){const t=e.consume("}")||e.error("Default dictionary value must be empty");r.push(t)}return new k({source:e.source,tokens:{assign:t},expression:r})}constructor({source:e,tokens:t,expression:n}){super({source:e,tokens:t}),Object.defineProperty(this,"expression",{value:n})}get type(){return j(this.expression[0]).type}get value(){return j(this.expression[0]).value}get negative(){return j(this.expression[0]).negative}}class b extends Array{constructor({source:e,tokens:t}){super(),Object.defineProperties(this,{source:{value:e},tokens:{value:t}})}}class g extends d{static parse(e){const t={assign:e.consume("=")},n=new g({source:e.source,tokens:t});return t.assign&&(t.secondaryName=e.consume("identifier","decimal","integer","string")),t.open=e.consume("("),t.open?(n.list="identifier-list"===n.rhsType?function(e){const t=$(e,{parser:T.parser(e,"identifier"),listName:"identifier list"});t.length||e.error("Expected identifiers but none found");return t}(e):P(e),t.close=e.consume(")")||e.error("Unexpected token in extended attribute argument list")):n.hasRhs&&!t.secondaryName&&e.error("No right hand side to extended attribute assignment"),n}get rhsType(){return this.tokens.assign?this.tokens.secondaryName?this.tokens.secondaryName.type:"identifier-list":null}}class v extends d{static parse(e){const t=e.consume("identifier");if(t)return new v({source:e.source,tokens:{name:t},params:g.parse(e)})}constructor({source:e,tokens:t,params:n}){super({source:e,tokens:t}),Object.defineProperty(this,"params",{value:n})}get type(){return"extended-attribute"}get name(){return this.tokens.name.value}get rhs(){const{rhsType:e,tokens:t,list:n}=this.params;return e?{type:e,value:"identifier-list"===e?n:t.secondaryName.value}:null}get arguments(){const{rhsType:e,list:t}=this.params;return t&&"identifier-list"!==e?t:[]}*validate(e){if("NoInterfaceObject"===this.name){const e="`[NoInterfaceObject]` extended attribute is an undesirable feature that may be removed from Web IDL in the future. Refer to the [relevant upstream PR](https://github.com/heycam/webidl/pull/609) for more information.";yield s(this.source,this.tokens.name,this,e,{level:"warning"})}for(const t of this.arguments)yield*t.validate(e)}}class x extends b{static parse(e){const t={};if(t.open=e.consume("["),!t.open)return new x({});const n=new x({source:e.source,tokens:t});return n.push(...$(e,{parser:v.parse,listName:"extended attribute"})),t.close=e.consume("]")||e.error("Unexpected closing token of extended attribute"),n.length||e.error("Found an empty extended attribute"),e.probe("[")&&e.error("Illegal double extended attribute lists, consider merging them"),n}*validate(e){for(const t of this)yield*t.validate(e)}}class w extends d{static parse(e){const t=e.position,n={},r=new w({source:e.source,tokens:n});return r.extAttrs=x.parse(e),n.optional=e.consume("optional"),r.idlType=E(e,"argument-type"),r.idlType?(n.optional||(n.variadic=e.consume("...")),n.name=e.consume("identifier",...a),n.name?(r.default=n.optional?k.parse(e):null,r):e.unconsume(t)):e.unconsume(t)}get type(){return"argument"}get optional(){return!!this.tokens.optional}get variadic(){return!!this.tokens.variadic}get name(){return M(this.tokens.name.value)}*validate(e){if(yield*this.idlType.validate(e),m(this.idlType,e)){if(this.optional&&!this.default){const e="Optional dictionary arguments must have a default value of `{}`.";yield s(this.source,this.tokens.name,this,e)}if(this.idlType.nullable){const e="Dictionary arguments cannot be nullable.";yield s(this.source,this.tokens.name,this,e)}}}}class T extends d{static parser(e,t){return()=>{const n=e.consume(t);if(n)return new T({source:e.source,tokens:{value:n}})}}get value(){return this.tokens.value.value}}class A extends d{static parse(e,{special:t,regular:n}={}){const r={special:t},s=new A({source:e.source,tokens:r});return t&&"stringifier"===t.value&&(r.termination=e.consume(";"),r.termination)?(s.arguments=[],s):(t||n||(r.special=e.consume("getter","setter","deleter")),s.idlType=q(e)||e.error("Missing return type"),r.name=e.consume("identifier"),r.open=e.consume("(")||e.error("Invalid operation"),s.arguments=P(e),r.close=e.consume(")")||e.error("Unterminated operation"),r.termination=e.consume(";")||e.error("Unterminated operation, expected `;`"),s)}get type(){return"operation"}get name(){const{name:e}=this.tokens;return e?M(e.value):""}get special(){return this.tokens.special?this.tokens.special.value:""}*validate(e){this.idlType&&(yield*this.idlType.validate(e));for(const t of this.arguments)yield*t.validate(e)}}class N extends d{static parse(e,{special:t,noInherit:n=!1,readonly:r=!1}={}){const s=e.position,o={special:t},i=new N({source:e.source,tokens:o});if(t||n||(o.special=e.consume("inherit")),"inherit"===i.special&&e.probe("readonly")&&e.error("Inherited attributes cannot be read-only"),o.readonly=e.consume("readonly"),r&&!o.readonly&&e.probe("attribute")&&e.error("Attributes must be readonly in this context"),o.base=e.consume("attribute"),o.base){switch(i.idlType=E(e,"attribute-type")||e.error("Attribute lacks a type"),i.idlType.generic){case"sequence":case"record":e.error(`Attributes cannot accept ${i.idlType.generic} types`)}return o.name=e.consume("identifier","required")||e.error("Attribute lacks a name"),o.termination=e.consume(";")||e.error("Unterminated attribute, expected `;`"),i}e.unconsume(s)}get type(){return"attribute"}get special(){return this.tokens.special?this.tokens.special.value:""}get readonly(){return!!this.tokens.readonly}get name(){return M(this.tokens.name.value)}*validate(e){yield*this.idlType.validate(e)}}function M(e){return e.startsWith("_")?e.slice(1):e}function $(e,{parser:t,allowDangler:n,listName:r="list"}){const s=t(e);if(!s)return[];s.tokens.separator=e.consume(",");const o=[s];for(;s.tokens.separator;){const s=t(e);if(!s){n||e.error(`Trailing comma in ${r}`);break}if(s.tokens.separator=e.consume(","),o.push(s),!s.tokens.separator)break}return o}function I(e){return e.consume("true","false","Infinity","-Infinity","NaN","decimal","integer")}function j({type:e,value:t}){switch(e){case"true":case"false":return{type:"boolean",value:"true"===e};case"Infinity":case"-Infinity":return{type:"Infinity",negative:e.startsWith("-")};case"[":return{type:"sequence",value:[]};case"{":return{type:"dictionary"};case"decimal":case"integer":return{type:"number",value:t};case"string":return{type:"string",value:t.slice(1,-1)};default:return{type:e}}}function O(e){const{source:t}=e,n=function(){const n=e.consume("unsigned"),r=e.consume("short","long");if(r){const s=e.consume("long");return new h({source:t,tokens:{prefix:n,base:r,postfix:s}})}n&&e.error("Failed to parse integer type")}()||function(){const n=e.consume("unrestricted"),r=e.consume("float","double");if(r)return new h({source:t,tokens:{prefix:n,base:r}});n&&e.error("Failed to parse float type")}();if(n)return n;const r=e.consume("boolean","byte","octet");return r?new h({source:t,tokens:{base:r}}):void 0}function P(e){return $(e,{parser:w.parse,listName:"arguments list"})}function E(e,t){const n=x.parse(e),r=h.parse(e,t);return r&&(r.extAttrs=n),r}function q(e,t){const n=h.parse(e,t||"return-type");if(n)return n;const r=e.consume("void");if(r){const t=new h({source:e.source,tokens:{base:r}});return t.type="return-type",t}}function D(e){const t=e.consume("stringifier");if(t)return N.parse(e,{special:t})||A.parse(e,{special:t})||e.error("Unterminated stringifier")}class U extends T{static parse(e){const t=e.consume("string");if(t)return new U({source:e.source,tokens:{value:t}})}get type(){return"enum-value"}get value(){return super.value.slice(1,-1)}}class S extends d{static parse(e){const t={};if(t.base=e.consume("enum"),!t.base)return;t.name=e.consume("identifier")||e.error("No name for enum");const n=e.current=new S({source:e.source,tokens:t});return t.open=e.consume("{")||e.error("Bodyless enum"),n.values=$(e,{parser:U.parse,allowDangler:!0,listName:"enumeration"}),e.probe("string")&&e.error("No comma between enum values"),t.close=e.consume("}")||e.error("Unexpected value in enum"),n.values.length||e.error("No value in enum"),t.termination=e.consume(";")||e.error("No semicolon after enum"),n}get type(){return"enum"}get name(){return M(this.tokens.name.value)}}class W extends d{static parse(e){const t=e.consume("identifier");if(!t)return;const n={target:t};if(n.includes=e.consume("includes"),n.includes)return n.mixin=e.consume("identifier")||e.error("Incomplete includes statement"),n.termination=e.consume(";")||e.error("No terminating ; for includes statement"),new W({source:e.source,tokens:n});e.unconsume(t.index)}get type(){return"includes"}get target(){return M(this.tokens.target.value)}get includes(){return M(this.tokens.mixin.value)}}class _ extends d{static parse(e){const t={},n=new _({source:e.source,tokens:t});if(t.base=e.consume("typedef"),t.base)return n.idlType=E(e,"typedef-type")||e.error("Typedef lacks a type"),t.name=e.consume("identifier")||e.error("Typedef lacks a name"),e.current=n,t.termination=e.consume(";")||e.error("Unterminated typedef, expected `;`"),n}get type(){return"typedef"}get name(){return M(this.tokens.name.value)}*validate(e){yield*this.idlType.validate(e)}}class F extends d{static parse(e,t){const n={base:t},r=new F({source:e.source,tokens:n});return n.name=e.consume("identifier")||e.error("Callback lacks a name"),e.current=r,n.assign=e.consume("=")||e.error("Callback lacks an assignment"),r.idlType=q(e)||e.error("Callback lacks a return type"),n.open=e.consume("(")||e.error("Callback lacks parentheses for arguments"),r.arguments=P(e),n.close=e.consume(")")||e.error("Unterminated callback"),n.termination=e.consume(";")||e.error("Unterminated callback, expected `;`"),r}get type(){return"callback"}get name(){return M(this.tokens.name.value)}*validate(e){yield*this.idlType.validate(e)}}class R extends d{static parse(e,t,{type:n,inheritable:r,allowedMembers:s}){const{tokens:o}=t;for(o.name=e.consume("identifier")||e.error(`Missing name in ${t.type}`),e.current=t,r&&Object.assign(o,function(e){const t=e.consume(":");return t?{colon:t,inheritance:e.consume("identifier")||e.error("Inheritance lacks a type")}:{}}(e)),o.open=e.consume("{")||e.error(`Bodyless ${n}`),t.members=[];;){if(o.close=e.consume("}"),o.close)return o.termination=e.consume(";")||e.error(`Missing semicolon after ${n}`),t;const r=x.parse(e);let i;for(const[t,...n]of s)if(i=t(e,...n))break;i||e.error("Unknown member"),i.extAttrs=r,t.members.push(i)}}get partial(){return!!this.tokens.partial}get name(){return M(this.tokens.name.value)}get inheritance(){return this.tokens.inheritance?M(this.tokens.inheritance.value):null}*validate(e){for(const t of this.members)t.validate&&(yield*t.validate(e))}}class C extends d{static parse(e){const t={};if(t.base=e.consume("const"),!t.base)return;let n=O(e);if(!n){const t=e.consume("identifier")||e.error("Const lacks a type");n=new h({source:e.source,tokens:{base:t}})}e.probe("?")&&e.error("Unexpected nullable constant type"),n.type="const-type",t.name=e.consume("identifier")||e.error("Const lacks a name"),t.assign=e.consume("=")||e.error("Const lacks value assignment"),t.value=I(e)||e.error("Const lacks a value"),t.termination=e.consume(";")||e.error("Unterminated const, expected `;`");const r=new C({source:e.source,tokens:t});return r.idlType=n,r}get type(){return"const"}get name(){return unescape(this.tokens.name.value)}get value(){return j(this.tokens.value)}}class z extends d{static parse(e){const t=e.position,n={},r=new z({source:e.source,tokens:n});if(n.readonly=e.consume("readonly"),n.readonly||(n.async=e.consume("async")),n.base=n.readonly?e.consume("maplike","setlike"):n.async?e.consume("iterable"):e.consume("iterable","maplike","setlike"),!n.base)return void e.unconsume(t);const{type:s}=r,o="maplike"===s||r.async,i=o||"iterable"===s;n.open=e.consume("<")||e.error(`Missing less-than sign \`<\` in ${s} declaration`);const a=E(e)||e.error(`Missing a type argument in ${s} declaration`);return r.idlType=[a],i&&(a.tokens.separator=e.consume(","),a.tokens.separator?r.idlType.push(E(e)):o&&e.error(`Missing second type argument in ${s} declaration`)),n.close=e.consume(">")||e.error(`Missing greater-than sign \`>\` in ${s} declaration`),n.termination=e.consume(";")||e.error(`Missing semicolon after ${s} declaration`),r}get type(){return this.tokens.base.value}get readonly(){return!!this.tokens.readonly}get async(){return!!this.tokens.async}}function L(e){const t=e.consume("static");if(t)return N.parse(e,{special:t})||A.parse(e,{special:t})||e.error("No body in static member")}class B extends R{static parse(e,t,{partial:n=null}={}){const r={partial:n,base:t};return R.parse(e,new B({source:e.source,tokens:r}),{type:"interface",inheritable:!n,allowedMembers:[[C.parse],[L],[D],[z.parse],[N.parse],[A.parse]]})}get type(){return"interface"}*validate(e){if(yield*this.extAttrs.validate(e),!this.partial&&this.extAttrs.every(e=>"Exposed"!==e.name)&&this.extAttrs.every(e=>"NoInterfaceObject"!==e.name)){const e="Interfaces must have `[Exposed]` extended attribute. To fix, add, for example, `[Exposed=Window]`. Please also consider carefully if your interface should also be exposed in a Worker scope. Refer to the [WebIDL spec section on Exposed](https://heycam.github.io/webidl/#Exposed) for more information.";yield s(this.source,this.tokens.name,this,e)}yield*super.validate(e),this.partial||(yield*function*(e,t){const n=new Set(a(t).map(e=>e.name)),r=e.partials.get(t.name)||[],o=e.mixinMap.get(t.name)||[];for(const e of[...r,...o]){const r=a(e);yield*i(r,n,e,t);for(const e of r)n.add(e.name)}function*i(e,t,n,r){for(const o of e){const{name:e}=o;if(e&&t.has(e)){const t=`The operation "${e}" has already been defined for the base interface "${r.name}" either in itself or in a mixin`;yield s(n.source,o.tokens.name,n,t)}}}function a(e){return e.members.filter(({type:e})=>"operation"===e)}}(e,this))}}class Z extends R{static parse(e,t,{partial:n}={}){const r={partial:n,base:t};if(r.mixin=e.consume("mixin"),r.mixin)return R.parse(e,new Z({source:e.source,tokens:r}),{type:"interface mixin",allowedMembers:[[C.parse],[D],[N.parse,{noInherit:!0}],[A.parse,{regular:!0}]]})}get type(){return"interface mixin"}}class V extends d{static parse(e){const t={},n=new V({source:e.source,tokens:t});return n.extAttrs=x.parse(e),t.required=e.consume("required"),n.idlType=E(e,"dictionary-type")||e.error("Dictionary member lacks a type"),t.name=e.consume("identifier")||e.error("Dictionary member lacks a name"),n.default=k.parse(e),t.required&&n.default&&e.error("Required member must not have a default"),t.termination=e.consume(";")||e.error("Unterminated dictionary member, expected `;`"),n}get type(){return"field"}get name(){return M(this.tokens.name.value)}get required(){return!!this.tokens.required}*validate(e){yield*this.idlType.validate(e)}}class J extends R{static parse(e,{partial:t}={}){const n={partial:t};if(n.base=e.consume("dictionary"),n.base)return R.parse(e,new J({source:e.source,tokens:n}),{type:"dictionary",inheritable:!t,allowedMembers:[[V.parse]]})}get type(){return"dictionary"}}class X extends R{static parse(e,{partial:t}={}){const n={partial:t};if(n.base=e.consume("namespace"),n.base)return R.parse(e,new X({source:e.source,tokens:n}),{type:"namespace",allowedMembers:[[N.parse,{noInherit:!0,readonly:!0}],[A.parse,{regular:!0}]]})}get type(){return"namespace"}*validate(e){if(!this.partial&&this.extAttrs.every(e=>"Exposed"!==e.name)){const e="Namespaces must have [Exposed] extended attribute. To fix, add, for example, [Exposed=Window]. Please also consider carefully if your namespace should also be exposed in a Worker scope. Refer to the [WebIDL spec section on Exposed](https://heycam.github.io/webidl/#Exposed) for more information.";yield s(this.source,this.tokens.name,this,e)}yield*super.validate(e)}}class G extends R{static parse(e,t,{partial:n=null}={}){const r={callback:t};if(r.base=e.consume("interface"),r.base)return R.parse(e,new G({source:e.source,tokens:r}),{type:"callback interface",inheritable:!n,allowedMembers:[[C.parse],[A.parse,{regular:!0}]]})}get type(){return"callback interface"}}function H(e,t){const n=e.source;function r(t){e.error(t)}function s(...t){return e.consume(...t)}function o(t){const n=s("interface");if(n)return Z.parse(e,n,t)||B.parse(e,n,t)||r("Interface has no proper body")}function i(){return function(){const t=s("callback");if(t)return e.probe("interface")?G.parse(e,t):F.parse(e,t)}()||o()||function(){const t=s("partial");if(t)return J.parse(e,{partial:t})||o({partial:t})||X.parse(e,{partial:t})||r("Partial doesn't apply to anything")}()||J.parse(e)||S.parse(e)||_.parse(e)||W.parse(e)||X.parse(e)}const a=function(){if(!n.length)return[];const o=[];for(;;){const t=x.parse(e),n=i();if(!n){t.length&&r("Stray extended attributes");break}n.extAttrs=t,o.push(n)}const a=s("eof");return t.concrete&&o.push(a),o}();return e.position<n.length&&r("Unrecognised tokens"),a}function K(e,t={}){const n=new l(e);return void 0!==t.sourceName&&(n.source.name=t.sourceName),H(n,t)}function Q(e){return e}const Y={wrap:e=>e.join(""),trivia:Q,name:Q,reference:Q,type:Q,generic:Q,inheritance:Q,definition:Q,extendedAttribute:Q,extendedAttributeReference:Q};function ee(e,{templates:t=Y}={}){function n(e,{unescaped:n,context:r}){return n||(n=e.startsWith("_")?e.slice(1):e),t.reference(e,n,r)}function r(e,n=Q,...r){if(!e)return"";const s=n(e.value,...r);return t.wrap([t.trivia(e.trivia),s])}function s(e,t){return r(e,n,{context:t})}function o(e,n){return r(e,t.name,n)}function i(e){if(e.union||e.generic)return t.wrap([r(e.tokens.base,t.generic),r(e.tokens.open),...e.subtype.map(a),r(e.tokens.close)]);const s=e.tokens.prefix||e.tokens.base,o=e.tokens.prefix?[e.tokens.prefix.value,t.trivia(e.tokens.base.trivia)]:[],i=n(t.wrap([...o,e.tokens.base.value,r(e.tokens.postfix)]),{unescaped:e.idlType,context:e});return t.wrap([t.trivia(s.trivia),i])}function a(e){return t.wrap([p(e.extAttrs),i(e),r(e.tokens.nullable),r(e.tokens.separator)])}function c(e){return e?t.wrap([r(e.tokens.assign),...e.expression.map(e=>r(e))]):""}function u(e){return t.wrap([p(e.extAttrs),r(e.tokens.optional),t.type(a(e.idlType)),r(e.tokens.variadic),o(e.tokens.name,{data:e}),c(e.default),r(e.tokens.separator)])}function l(e){const{rhsType:n}=e.params;return t.wrap([t.trivia(e.tokens.name.trivia),t.extendedAttribute(t.wrap([t.extendedAttributeReference(e.name),r(e.params.tokens.assign),s(e.params.tokens.secondaryName,e),r(e.params.tokens.open),...e.params.list?e.params.list.map("identifier-list"===n?n=>(function(e,n){return t.wrap([s(e.tokens.value,n),r(e.tokens.separator)])})(n,e):u):[],r(e.params.tokens.close)])),r(e.tokens.separator)])}function p(e){return e.length?t.wrap([r(e.tokens.open),...e.map(l),r(e.tokens.close)]):""}function d(e){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.callback),r(e.tokens.partial),r(e.tokens.base),r(e.tokens.mixin),o(e.tokens.name,{data:e}),(s=e,s.tokens.inheritance?t.wrap([r(s.tokens.colon),t.trivia(s.tokens.inheritance.trivia),t.inheritance(n(s.tokens.inheritance.value,{context:s}))]):""),r(e.tokens.open),y(e.members,e),r(e.tokens.close),r(e.tokens.termination)]),{data:e});var s}function m(e,n){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.readonly),r(e.tokens.async),r(e.tokens.base,t.generic),r(e.tokens.open),t.wrap(e.idlType.map(a)),r(e.tokens.close),r(e.tokens.termination)]),{data:e,parent:n})}t=Object.assign({},Y,t);const f={interface:d,"interface mixin":d,namespace:d,operation:function(e,n){const s=e.idlType?[t.type(a(e.idlType)),o(e.tokens.name,{data:e,parent:n}),r(e.tokens.open),t.wrap(e.arguments.map(u)),r(e.tokens.close)]:[];return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.special),...s,r(e.tokens.termination)]),{data:e,parent:n})},attribute:function(e,n){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.special),r(e.tokens.readonly),r(e.tokens.base),t.type(a(e.idlType)),o(e.tokens.name,{data:e,parent:n}),r(e.tokens.termination)]),{data:e,parent:n})},dictionary:d,field:function(e,n){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.required),t.type(a(e.idlType)),o(e.tokens.name,{data:e,parent:n}),c(e.default),r(e.tokens.termination)]),{data:e,parent:n})},const:function(e,n){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.base),t.type(a(e.idlType)),o(e.tokens.name,{data:e,parent:n}),r(e.tokens.assign),r(e.tokens.value),r(e.tokens.termination)]),{data:e,parent:n})},typedef:function(e){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.base),t.type(a(e.idlType)),o(e.tokens.name,{data:e}),r(e.tokens.termination)]),{data:e})},includes:function(e){return t.definition(t.wrap([p(e.extAttrs),s(e.tokens.target,e),r(e.tokens.includes),s(e.tokens.mixin,e),r(e.tokens.termination)]),{data:e})},callback:function(e){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.base),o(e.tokens.name,{data:e}),r(e.tokens.assign),t.type(a(e.idlType)),r(e.tokens.open),...e.arguments.map(u),r(e.tokens.close),r(e.tokens.termination)]),{data:e})},enum:function(e){return t.definition(t.wrap([p(e.extAttrs),r(e.tokens.base),o(e.tokens.name,{data:e}),r(e.tokens.open),y(e.values,e),r(e.tokens.close),r(e.tokens.termination)]),{data:e})},"enum-value":function(e,n){return t.wrap([t.trivia(e.tokens.value.trivia),t.definition(t.wrap(['"',t.name(e.value,{data:e,parent:n}),'"']),{data:e,parent:n}),r(e.tokens.separator)])},iterable:m,legacyiterable:m,maplike:m,setlike:m,"callback interface":d,eof:function(e){return t.trivia(e.trivia)}};function y(e,n){if(!e)return;const r=e.map(e=>(function(e,t){if(!f[e.type])throw new Error(`Type "${e.type}" is unsupported`);return f[e.type](e,t)})(e,n));return t.wrap(r)}return y(e)}function te(e,t){const n=new Map,r=e.filter(e=>"includes"===e.type);for(const e of r){const r=t.get(e.includes);if(!r)continue;const s=n.get(e.target);s?s.push(r):n.set(e.target,[r])}return n}function*ne(e){const t=function(e){const t=new Map,n=new Set,r=new Map;for(const s of e)if(s.partial){const e=r.get(s.name);e?e.push(s):r.set(s.name,[s])}else s.name&&(t.has(s.name)?n.add(s):t.set(s.name,s));return{all:e,unique:t,partials:r,duplicates:n,mixinMap:te(e,t),cache:{typedefIncludesDictionary:new WeakMap}}}(e);for(const e of t.all)e.validate&&(yield*e.validate(t));yield*function*({unique:e,duplicates:t}){for(const n of t){const{name:t}=n,r=`The name "${t}" of type "${e.get(t).type}" was already seen`;yield s(n.source,n.tokens.name,n,r)}}(t)}function re(e){return[...ne((t=e,t.flat?t.flat():[].concat(...t)))];var t}n.d(t,"parse",function(){return K}),n.d(t,"write",function(){return ee}),n.d(t,"validate",function(){return re})}])});
//# sourceMappingURL=webidl2.js.map

@@ -58,3 +58,3 @@ /**

const inSourceName = source.name ? ` in ${source.name}` : "";
const grammaticalContext = current ? `, ${contextType} \`${current.partial ? "partial " : ""}${current.type} ${current.name}\`` : "";
const grammaticalContext = (current && current.name) ? `, ${contextType} \`${current.partial ? "partial " : ""}${current.type} ${current.name}\`` : "";
const context = `${kind} error at line ${line}${inSourceName}${grammaticalContext}:\n${sourceContext}`;

@@ -61,0 +61,0 @@ return {

@@ -48,2 +48,3 @@ import { Base } from "./base.js";

*validate(defs) {
yield* this.idlType.validate(defs);
if (idlTypeIncludesDictionary(this.idlType, defs)) {

@@ -50,0 +51,0 @@ if (this.optional && !this.default) {

@@ -52,2 +52,6 @@ import { Base } from "./base.js";

}
*validate(defs) {
yield* this.idlType.validate(defs);
}
}

@@ -1,3 +0,3 @@

import { Base } from "./base";
import { return_type, argument_list, unescape } from "./helpers";
import { Base } from "./base.js";
import { return_type, argument_list, unescape } from "./helpers.js";

@@ -28,2 +28,6 @@ export class CallbackFunction extends Base {

}
*validate(defs) {
yield* this.idlType.validate(defs);
}
}

@@ -32,2 +32,6 @@ import { Base } from "./base.js";

}
*validate(defs) {
yield* this.idlType.validate(defs);
}
}

@@ -1,3 +0,3 @@

import { Base } from "./base";
import { type_with_extended_attributes } from "./helpers";
import { Base } from "./base.js";
import { type_with_extended_attributes } from "./helpers.js";

@@ -13,4 +13,8 @@ export class IterableLike extends Base {

tokens.readonly = tokeniser.consume("readonly");
tokens.base = tokens.readonly ?
tokeniser.consume("maplike", "setlike") :
if (!tokens.readonly) {
tokens.async = tokeniser.consume("async");
}
tokens.base =
tokens.readonly ? tokeniser.consume("maplike", "setlike") :
tokens.async ? tokeniser.consume("iterable") :
tokeniser.consume("iterable", "maplike", "setlike");

@@ -23,3 +27,3 @@ if (!tokens.base) {

const { type } = ret;
const secondTypeRequired = type === "maplike";
const secondTypeRequired = type === "maplike" || ret.async;
const secondTypeAllowed = secondTypeRequired || type === "iterable";

@@ -35,4 +39,5 @@

}
else if (secondTypeRequired)
tokeniser.error(`Missing second type argument in ${type} declaration`);
else if (secondTypeRequired) {
tokeniser.error(`Missing second type argument in ${type} declaration`);
}
}

@@ -51,2 +56,5 @@ tokens.close = tokeniser.consume(">") || tokeniser.error(`Missing greater-than sign \`>\` in ${type} declaration`);

}
get async() {
return !!this.tokens.async;
}
}

@@ -48,2 +48,5 @@ import { Base } from "./base.js";

*validate(defs) {
if (this.idlType) {
yield* this.idlType.validate(defs);
}
for (const argument of this.arguments) {

@@ -50,0 +53,0 @@ yield* argument.validate(defs);

import { Base } from "./base.js";
import { unescape, type_with_extended_attributes, return_type, primitive_type } from "./helpers.js";
import { stringTypes } from "../tokeniser.js";
import { validationError } from "../error.js";
import { idlTypeIncludesDictionary } from "../validators/helpers.js";

@@ -146,2 +148,28 @@ /**

}
*validate(defs) {
/*
* If a union is nullable, its subunions cannot include a dictionary
* If not, subunions may include dictionaries if each union is not nullable
*/
const typedef = !this.union && defs.unique.get(this.idlType);
const target =
this.union ? this :
(typedef && typedef.type === "typedef") ? typedef.idlType :
undefined;
if (target && this.nullable) {
// do not allow any dictionary
const reference = idlTypeIncludesDictionary(target, defs);
if (reference) {
const targetToken = (this.union ? reference : this).tokens.base;
const message = `Nullable union cannot include a dictionary type`;
yield validationError(this.source, targetToken, this, message);
}
} else {
// allow some dictionary
for (const subtype of this.subtype) {
yield* subtype.validate(defs);
}
}
}
}

@@ -1,3 +0,3 @@

import { Base } from "./base";
import { type_with_extended_attributes, unescape } from "./helpers";
import { Base } from "./base.js";
import { type_with_extended_attributes, unescape } from "./helpers.js";

@@ -28,2 +28,6 @@ export class Typedef extends Base {

}
*validate(defs) {
yield* this.idlType.validate(defs);
}
}

@@ -53,2 +53,3 @@ import { syntaxError } from "./error.js";

"Promise",
"async",
"boolean",

@@ -55,0 +56,0 @@ "byte",

@@ -0,1 +1,16 @@

/**
* Yields direct references to dictionary within union.
*/
export function* dictionaryWithinUnion(subtypes, defs) {
for (const subtype of subtypes) {
const def = defs.unique.get(subtype.idlType);
if (def && def.type === "dictionary") {
yield subtype;
}
}
}
/**
* @return the type reference that ultimately includes dictionary.
*/
export function idlTypeIncludesDictionary(idlType, defs) {

@@ -5,22 +20,39 @@ if (!idlType.union) {

if (!def) {
return false;
return;
}
if (def.type === "typedef") {
const cached = defs.cache.typedefIncludesDictionary.get(def);
if (cached === null) {
return false; // null means indeterminate, return false for now
const { typedefIncludesDictionary} = defs.cache;
if (typedefIncludesDictionary.has(def)) {
// Note that this also halts when it met indeterminate state
// to prevent infinite recursion
return typedefIncludesDictionary.get(def);
}
defs.cache.typedefIncludesDictionary.set(def, null); // indeterminate state
defs.cache.typedefIncludesDictionary.set(def, undefined); // indeterminate state
const result = idlTypeIncludesDictionary(def.idlType, defs);
defs.cache.typedefIncludesDictionary.set(def, result);
return result;
if (result) {
return idlType;
}
}
return def.type === "dictionary";
if (def.type === "dictionary") {
return idlType;
}
}
for (const subtype of idlType.subtype) {
if (idlTypeIncludesDictionary(subtype, defs)) {
return true;
const result = idlTypeIncludesDictionary(subtype, defs);
if (result) {
if (subtype.union) {
return result;
}
return subtype;
}
}
return false;
}
/**
* @return true if the idlType directly references a typedef.
*/
export function referencesTypedef(idlType, defs) {
const result = defs.unique.get(idlType.idlType);
return result && result.type === "typedef";
}

@@ -260,2 +260,3 @@ "use strict";

token(it.tokens.readonly),
token(it.tokens.async),
token(it.tokens.base, ts.generic),

@@ -262,0 +263,0 @@ token(it.tokens.open),

{
"name": "webidl2",
"description": "A WebIDL Parser",
"version": "23.3.0",
"version": "23.4.0",
"contributors": [

@@ -15,2 +15,3 @@ "Robin Berjon <robin@berjon.com> (https://berjon.com)",

"eslint": "^6.0.1",
"eslint-plugin-import": "^2.18.2",
"expect": "^24.8.0",

@@ -17,0 +18,0 @@ "jsondiffpatch": "0.3.11",

@@ -61,4 +61,9 @@

`parse()` optionally takes an option bag with a boolean field `concrete`. Currently all it does is emitting [EOF](#end-of-file) node.
`parse()` optionally takes an option bag with the following fields:
* `concrete`: Boolean indicating whether the result should include [EOF](#end-of-file)
node or not.
* `sourceName`: The source name, typically a filename. [Errors](#errors) and validation
objects can indicate their origin if you pass a value.
`write()` optionally takes a "templates" object, whose properties are functions that process input in different ways (depending on what is needed for output). Every property is optional. Each property is documented below:

@@ -132,8 +137,11 @@

`validate()` returns semantic errors in a string array form:
`validate()` receives an AST or an array of AST, and returns semantic errors as an
array of objects. Their fields are same as [errors](#errors) have, with one addition:
* `level`: `"error"` or `"warning"`.
```js
const validations = validate(tree);
for (const validation of validations) {
console.log(validation);
console.log(validation.message);
}

@@ -149,4 +157,14 @@ // Validation error on line X: ...

* `message`: the error message
* `message`: the error message with its context. Below is what it looks like.
```
Syntax error at line 1 in callback-noparen.webidl, since `callback YourCall`:
callback YourCall = void;
^ Callback lacks parentheses for arguments
```
* `bareMessage`: the error message without any context description like below.
```
Callback lacks parentheses for arguments
```
* `line`: the line at which the error occurred.
* `sourceName`: the source name you passed to `parse()`.
* `input`: a short peek at the text at the point where the error happened

@@ -699,8 +717,1 @@ * `tokens`: the five tokens at the point of error, as understood by the tokeniser

should be enough once you're set up.
### Browser tests
In order to test in the browser, get inside `test/web` and run `make-web-tests.js`. This
will generate a `browser-tests.html` file that you can open in a browser. As of this
writing tests pass in the latest Firefox, Chrome, Opera, and Safari. Testing on IE
and older versions will happen progressively.

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc