123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.importAttributesOrAssertions = exports.importAttributes = exports.importAssertions = void 0;
- var _acorn = _interopRequireWildcard(require("acorn"));
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
- const leftCurlyBrace = "{".charCodeAt(0);
- const space = " ".charCodeAt(0);
- const withKeyword = "with";
- const assertKeyword = "assert";
- const FUNC_STATEMENT = 1,
- FUNC_HANGING_STATEMENT = 2,
- FUNC_NULLABLE_ID = 4;
- const importAttributes = exports.importAttributes = plugin({
- keyword: "with"
- });
- const importAssertions = exports.importAssertions = plugin({
- keyword: "assert"
- });
- const importAttributesOrAssertions = exports.importAttributesOrAssertions = plugin({
- keyword: "with-assert"
- });
- function plugin(options) {
- return function (Parser) {
- return pluginImpl(options, Parser);
- };
- }
- function pluginImpl(options, Parser) {
- // Use supplied version acorn version if present, to avoid
- // reference mismatches due to different acorn versions. This
- // allows this plugin to be used with Rollup which supplies
- // its own internal version of acorn and thereby sidesteps
- // the package manager.
- const acorn = Parser.acorn || _acorn;
- const {
- tokTypes: tt,
- TokenType
- } = acorn;
- const {
- keyword
- } = options;
- const isWithKeyword = keyword.includes(withKeyword);
- const isAssertKeyword = keyword.includes(assertKeyword);
- const isWithOrAssertKeyword = isWithKeyword && isAssertKeyword;
- return class extends Parser {
- constructor(...args) {
- super(...args);
- this.withToken = isWithKeyword && new TokenType(withKeyword);
- this.assertToken = isAssertKeyword && new TokenType(assertKeyword);
- }
- _codeAt(i) {
- return this.input.charCodeAt(i);
- }
- _eat(t) {
- if (this.type !== t) {
- this.unexpected();
- }
- this.next();
- }
- _matchKeywordToken() {
- return isWithOrAssertKeyword && (this.type === this.withToken || this.type === this.assertToken) || isWithKeyword && this.type === this.withToken || isAssertKeyword && this.type === this.assertToken;
- }
- _getProperty() {
- if (isWithOrAssertKeyword) {
- return this.type === this.withToken ? "attributes" : "assertions";
- }
- return isWithKeyword ? "attributes" : "assertions";
- }
- readToken(code) {
- let i = 0;
- let keyword;
- let token;
- if (isWithOrAssertKeyword) {
- if (this.input.slice(this.pos, this.pos + withKeyword.length) === withKeyword) {
- keyword = withKeyword;
- token = this.withToken;
- } else if (this.input.slice(this.pos, this.pos + assertKeyword.length) === assertKeyword) {
- keyword = assertKeyword;
- token = this.assertToken;
- } else {
- return super.readToken(code);
- }
- i += keyword.length;
- } else {
- keyword = isWithKeyword ? withKeyword : assertKeyword;
- token = isWithKeyword ? this.withToken : this.assertToken;
- for (; i < keyword.length; i++) {
- if (this._codeAt(this.pos + i) !== keyword.charCodeAt(i)) {
- return super.readToken(code);
- }
- }
- }
- // ensure that the keyword is at the correct location
- // ie `with{...` or `with {...`
- for (;; i++) {
- if (this._codeAt(this.pos + i) === leftCurlyBrace) {
- // Found '{'
- break;
- } else if (this._codeAt(this.pos + i) === space) {
- // white space is allowed between `with` and `{`, so continue.
- continue;
- } else {
- return super.readToken(code);
- }
- }
- // If we're inside a dynamic import expression we'll parse
- // the `with` keyword as a standard object property name
- // ie `import(""./foo.json", { with: { type: "json" } })`
- if (this.type.label === "{") {
- return super.readToken(code);
- }
- this.pos += keyword.length;
- return this.finishToken(token);
- }
- parseDynamicImport(node) {
- this.next(); // skip `(`
- // Parse node.source.
- node.source = this.parseMaybeAssign();
- if (this.eat(tt.comma)) {
- const expr = this.parseExpression();
- node.arguments = [expr];
- }
- this._eat(tt.parenR);
- return this.finishNode(node, "ImportExpression");
- }
- // ported from acorn/src/statement.js pp.parseExport
- parseExport(node, exports) {
- this.next();
- // export * from '...'
- if (this.eat(tt.star)) {
- if (this.options.ecmaVersion >= 11) {
- if (this.eatContextual("as")) {
- node.exported = this.parseIdent(true);
- this.checkExport(exports, node.exported.name, this.lastTokStart);
- } else {
- node.exported = null;
- }
- }
- this.expectContextual("from");
- if (this.type !== tt.string) {
- this.unexpected();
- }
- node.source = this.parseExprAtom();
- if (this._matchKeywordToken()) {
- const property = this._getProperty();
- this.next();
- const attributes = this.parseImportAttributes();
- if (attributes) {
- node[property] = attributes;
- }
- }
- this.semicolon();
- return this.finishNode(node, "ExportAllDeclaration");
- }
- if (this.eat(tt._default)) {
- // export default ...
- this.checkExport(exports, "default", this.lastTokStart);
- var isAsync;
- if (this.type === tt._function || (isAsync = this.isAsyncFunction())) {
- var fNode = this.startNode();
- this.next();
- if (isAsync) {
- this.next();
- }
- node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync);
- } else if (this.type === tt._class) {
- var cNode = this.startNode();
- node.declaration = this.parseClass(cNode, "nullableID");
- } else {
- node.declaration = this.parseMaybeAssign();
- this.semicolon();
- }
- return this.finishNode(node, "ExportDefaultDeclaration");
- }
- // export var|const|let|function|class ...
- if (this.shouldParseExportStatement()) {
- node.declaration = this.parseStatement(null);
- if (node.declaration.type === "VariableDeclaration") {
- this.checkVariableExport(exports, node.declaration.declarations);
- } else {
- this.checkExport(exports, node.declaration.id.name, node.declaration.id.start);
- }
- node.specifiers = [];
- node.source = null;
- } else {
- // export { x, y as z } [from '...']
- node.declaration = null;
- node.specifiers = this.parseExportSpecifiers(exports);
- if (this.eatContextual("from")) {
- if (this.type !== tt.string) {
- this.unexpected();
- }
- node.source = this.parseExprAtom();
- if (this._matchKeywordToken()) {
- const property = this._getProperty();
- this.next();
- const attributes = this.parseImportAttributes();
- if (attributes) {
- node[property] = attributes;
- }
- }
- } else {
- for (var i = 0, list = node.specifiers; i < list.length; i += 1) {
- // check for keywords used as local names
- var spec = list[i];
- this.checkUnreserved(spec.local);
- // check if export is defined
- this.checkLocalExport(spec.local);
- }
- node.source = null;
- }
- this.semicolon();
- }
- return this.finishNode(node, "ExportNamedDeclaration");
- }
- parseImport(node) {
- this.next();
- // import '...'
- if (this.type === tt.string) {
- node.specifiers = [];
- node.source = this.parseExprAtom();
- } else {
- node.specifiers = this.parseImportSpecifiers();
- this.expectContextual("from");
- node.source = this.type === tt.string ? this.parseExprAtom() : this.unexpected();
- }
- if (this._matchKeywordToken()) {
- const property = this._getProperty();
- this.next();
- const attributes = this.parseImportAttributes();
- if (attributes) {
- node[property] = attributes;
- }
- }
- this.semicolon();
- return this.finishNode(node, "ImportDeclaration");
- }
- parseImportAttributes() {
- this._eat(tt.braceL);
- const attrs = this.parsewithEntries();
- this._eat(tt.braceR);
- return attrs;
- }
- parsewithEntries() {
- const attrs = [];
- const attrNames = new Set();
- do {
- if (this.type === tt.braceR) {
- break;
- }
- const node = this.startNode();
- // parse withionKey : IdentifierName, StringLiteral
- let withionKeyNode;
- if (this.type === tt.string) {
- withionKeyNode = this.parseLiteral(this.value);
- } else {
- withionKeyNode = this.parseIdent(true);
- }
- this.next();
- node.key = withionKeyNode;
- // check if we already have an entry for an attribute
- // if a duplicate entry is found, throw an error
- // for now this logic will come into play only when someone declares `type` twice
- if (attrNames.has(node.key.name)) {
- this.raise(this.pos, "Duplicated key in attributes");
- }
- attrNames.add(node.key.name);
- if (this.type !== tt.string) {
- this.raise(this.pos, "Only string is supported as an attribute value");
- }
- node.value = this.parseLiteral(this.value);
- attrs.push(this.finishNode(node, "ImportAttribute"));
- } while (this.eat(tt.comma));
- return attrs;
- }
- };
- }
|