| import { parseFrom, parseWith } from './partParsers.js'; |
| import { addError, getPosition, spacesRegExp, stripComments } from './utils.js'; |
| /** |
| * Adds error of parsing named `export` statement. |
| */ |
| export const onNamedExportError = (importsExports, _source, { start, end, match: { groups } }) => addError(importsExports, `Cannot find end of \`export ${groups['type'] === undefined ? '' : 'type '}{...} ...\` statement`, start, end); |
| /** |
| * Parses named `export` statement. |
| */ |
| export const onNamedExportParse = (importsExports, source, { start, end: unparsedStart, comments, match: startMatch }, { start: unparsedEnd, end: exportEnd, match: endMatch }) => { |
| var _a; |
| var end = exportEnd; |
| var maybeFrom; |
| var unparsed = stripComments(source, unparsedStart, unparsedEnd, comments); |
| const { groups } = endMatch; |
| const quote = (_a = groups.quote) !== null && _a !== void 0 ? _a : groups.with; |
| var isType = false; |
| if (startMatch.groups['type'] !== undefined) { |
| isType = true; |
| } |
| var withAttributes; |
| if (quote !== undefined) { |
| const { from, index } = parseFrom(quote[0], unparsed); |
| if (index === -1) { |
| return addError(importsExports, 'Cannot find start of `from` string literal of reexport', start, end); |
| } |
| maybeFrom = from; |
| unparsed = unparsed.slice(0, index); |
| const braceCloseIndex = unparsed.lastIndexOf('}'); |
| if (braceCloseIndex === -1) { |
| return addError(importsExports, `Cannot find end of reexports list (\`}\`) for reexport from \`${maybeFrom}\``, start, end); |
| } |
| unparsed = unparsed.slice(0, braceCloseIndex); |
| if (groups.with !== undefined) { |
| if (isType) { |
| return addError(importsExports, `Cannot use import attributes (\`with {...}\`) in \`export type\` statement for reexport from \`${from}\``, start, end); |
| } |
| const attributes = parseWith(exportEnd, source); |
| if (attributes === undefined) { |
| return addError(importsExports, `Cannot find end of import attributes (\`with {...}\`) for reexport from \`${from}\``, start, end); |
| } |
| end = attributes.endIndex; |
| withAttributes = attributes.with; |
| if (withAttributes === undefined) { |
| return addError(importsExports, `Cannot parse import attributes (\`with {...}\`) for reexport from \`${from}\``, start, end); |
| } |
| } |
| } |
| const namedExport = getPosition(importsExports, start, end); |
| const namesString = unparsed.trim().replace(spacesRegExp, ' '); |
| const namesList = namesString.split(','); |
| var names; |
| var types; |
| for (let name of namesList) { |
| let isTypeName = false; |
| name = name.trim(); |
| if (name === '') { |
| continue; |
| } |
| const nameObject = {}; |
| if (name.startsWith('type ')) { |
| if (isType) { |
| return addError(importsExports, `Cannot use \`type\` modifier in \`export type {...}\` statement for type \`${name.slice(5)}\`${maybeFrom === undefined ? '' : ` for reexport from \`${maybeFrom}\``}`, start, end); |
| } |
| isTypeName = true; |
| name = name.slice(5); |
| } |
| const asIndex = name.indexOf(' as '); |
| if (asIndex !== -1) { |
| nameObject.by = name.slice(0, asIndex); |
| name = name.slice(asIndex + 4); |
| } |
| if (isTypeName) { |
| if (types === undefined) { |
| types = { __proto__: null }; |
| } |
| else if (name in types) { |
| return addError(importsExports, `Duplicate exported type \`${name}\` ${maybeFrom === undefined ? 'in named export' : `for reexport from \`${maybeFrom}\``}`, start, end); |
| } |
| types[name] = nameObject; |
| } |
| else { |
| if (names === undefined) { |
| names = { __proto__: null }; |
| } |
| else if (name in names) { |
| return addError(importsExports, `Duplicate exported name \`${name}\` ${maybeFrom === undefined ? 'in named export' : `for reexport from \`${maybeFrom}\``}`, start, end); |
| } |
| names[name] = nameObject; |
| } |
| } |
| if (names !== undefined) { |
| namedExport.names = names; |
| } |
| if (types !== undefined) { |
| namedExport.types = types; |
| } |
| if (maybeFrom === undefined) { |
| const key = isType ? 'typeNamedExports' : 'namedExports'; |
| let exports = importsExports[key]; |
| if (exports === undefined) { |
| importsExports[key] = [namedExport]; |
| } |
| else { |
| exports.push(namedExport); |
| } |
| } |
| else { |
| const key = isType ? 'typeNamedReexports' : 'namedReexports'; |
| const namedReexport = withAttributes === undefined ? namedExport : { ...namedExport, with: withAttributes }; |
| let reexports = importsExports[key]; |
| reexports !== null && reexports !== void 0 ? reexports : (reexports = importsExports[key] = { __proto__: null }); |
| let reexportsList = reexports[maybeFrom]; |
| if (reexportsList === undefined) { |
| reexports[maybeFrom] = [namedReexport]; |
| } |
| else { |
| reexportsList.push(namedReexport); |
| } |
| } |
| return end; |
| }; |