Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

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.2.2 to 23.3.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){function o(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 a="eof"!==e[t].type?e[t].line:e.length>1?e[t-1].line:1,c=function(e){const t=e.split("\n");return t[t.length-1]}(i(o(-5),{precedes:!0})),u=o(5),l=i(u),p=c+l.split("\n")[0]+"\n"+(" ".repeat(c.length)+"^"),d="Syntax"===s?"since":"inside",m=`${s} error at line ${a}${e.name?` in ${e.name}`:""}${n?`, ${d} \`${n.partial?"partial ":""}${n.type} ${n.name}\``:""}:\n${p}`;return{message:`${m} ${r}`,bareMessage:r,context:m,line:a,sourceName:e.name,input:l,tokens:u}}function s(e,t,n,s){return r(e,t.index,n,s,"Validation")}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","boolean","byte","double","false","float","implements","legacyiterable","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){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(...i)||e.error(`Record key must be one of: ${i.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",...i);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 M([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=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=$(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({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){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(...$(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)console.log(t),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",...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(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?M(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},i=new A({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=P(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)}}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 N(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 $(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 q(e){const t=e.consume("stringifier");if(t)return A.parse(e,{special:t})||T.parse(e,{special:t})||e.error("Unterminated stringifier")}class D extends w{static parse(e){const t=e.consume("string");if(t)return new D({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=$(e,{parser:D.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 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 M(this.tokens.target.value)}get includes(){return M(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 M(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 M(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 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=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=N(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 I(this.tokens.value)}}class R extends d{static parse(e){const t=e.position,n={},r=new R({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,i=o||"iterable"===s;n.open=e.consume("<")||e.error(`Missing less-than sign \`<\` in ${s} declaration`);const a=P(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(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 B extends F{static parse(e,t,{partial:n=null}={}){const r={partial:n,base:t};return F.parse(e,new B({source:e.source,tokens:r}),{type:"interface",inheritable:!n,allowedMembers:[[C.parse],[z],[q],[R.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)){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 L 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 L({source:e.source,tokens:r}),{type:"interface mixin",allowedMembers:[[C.parse],[q],[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 M(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:[[C.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 L.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")?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 a=function(){if(!n.length)return[];const o=[];for(;;){const t=v.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 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 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.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({},Q,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 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 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})}])});
//# sourceMappingURL=webidl2.js.map

@@ -10,6 +10,10 @@ /**

/**
* @typedef {object} WebIDL2ErrorOptions
* @property {"error" | "warning"} level
*
* @param {string} message error message
* @param {"Syntax" | "Validation"} type error type
* @param {"Syntax" | "Validation"} kind error type
* @param {WebIDL2ErrorOptions} [options]
*/
function error(source, position, current, message, type) {
function error(source, position, current, message, kind, { level = "error" } = {}) {
/**

@@ -53,6 +57,6 @@ * @param {number} count

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

@@ -64,2 +68,3 @@ message: `${context} ${message}`,

sourceName: source.name,
level,
input: subsequentText,

@@ -79,5 +84,6 @@ tokens: subsequentTokens

* @param {string} message error message
* @param {WebIDL2ErrorOptions} [options]
*/
export function validationError(source, token, current, message) {
return error(source, token.index, current, message, "Validation");
export function validationError(source, token, current, message, options) {
return error(source, token.index, current, message, "Validation", options);
}
import { Base } from "./base.js";
import { ArrayBase } from "./array-base.js";
import { list, identifiers, argument_list } from "./helpers.js";
import { validationError } from "../error.js";

@@ -44,2 +45,3 @@ class ExtendedAttributeParameters extends Base {

return new SimpleExtendedAttribute({
source: tokeniser.source,
tokens: { name },

@@ -79,2 +81,9 @@ params: ExtendedAttributeParameters.parse(tokeniser)

*validate(defs) {
if (this.name === "NoInterfaceObject") {
const message = `\`[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 validationError(this.source, this.tokens.name, this, message, { level: "warning" });
}
for (const arg of this.arguments) {

@@ -113,3 +122,2 @@ yield* arg.validate(defs);

for (const extAttr of this) {
console.log(extAttr);
yield* extAttr.validate(defs);

@@ -116,0 +124,0 @@ }

@@ -48,4 +48,7 @@ import { Container } from "./container.js";

yield* this.extAttrs.validate(defs);
if (!this.partial && this.extAttrs.every(extAttr => extAttr.name !== "Exposed")) {
if (
!this.partial &&
this.extAttrs.every(extAttr => extAttr.name !== "Exposed") &&
this.extAttrs.every(extAttr => extAttr.name !== "NoInterfaceObject")
) {
const message = `Interfaces must have \`[Exposed]\` extended attribute. \

@@ -52,0 +55,0 @@ To fix, add, for example, \`[Exposed=Window]\`. Please also consider carefully \

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

"float",
"implements",
"legacyiterable",
"long",

@@ -62,0 +60,0 @@ "mixin",

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

@@ -6,0 +6,0 @@ "Robin Berjon <robin@berjon.com> (https://berjon.com)",

@@ -641,9 +641,9 @@

* `type`: One of string, number, boolean, null, Infinity, NaN, or sequence.
* `type`: One of `"string"`, `"number"`, `"boolean"`, `"null"`, `"Infinity"`, `"NaN"`, `"sequence"` or `"dictionary"`.
For string, number, boolean, and sequence:
For `"string"`, `"number"`, `"boolean"`, and `"sequence"`:
* `value`: The value of the given type, as a string. For sequence, the only possible value is `[]`.
For Infinity:
For `"Infinity"`:

@@ -650,0 +650,0 @@ * `negative`: Boolean indicating whether this is negative Infinity or not.

Sorry, the diff of this file is not supported yet

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