UNPKG

webidl2

Version:
62 lines (58 loc) 1.83 kB
import { Container } from "./container.js"; import { Attribute } from "./attribute.js"; import { Operation } from "./operation.js"; import { validationError } from "../error.js"; import { autofixAddExposedWindow } from "./helpers.js"; import { Constant } from "./constant.js"; export class Namespace extends Container { /** * @param {import("../tokeniser.js").Tokeniser} tokeniser * @param {object} [options] * @param {import("./container.js").AllowedMember[]} [options.extMembers] * @param {import("../tokeniser.js").Token} [options.partial] */ static parse(tokeniser, { extMembers = [], partial } = {}) { const tokens = { partial }; tokens.base = tokeniser.consume("namespace"); if (!tokens.base) { return; } return Container.parse( tokeniser, new Namespace({ source: tokeniser.source, tokens }), { allowedMembers: [ ...extMembers, [Attribute.parse, { noInherit: true, readonly: true }], [Constant.parse], [Operation.parse, { regular: true }], ], }, ); } get type() { return "namespace"; } *validate(defs) { if ( !this.partial && this.extAttrs.every((extAttr) => extAttr.name !== "Exposed") ) { const message = `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 validationError( this.tokens.name, this, "require-exposed", message, { autofix: autofixAddExposedWindow(this), }, ); } yield* super.validate(defs); } }