Est-ce que «export {foo comme défaut}" ES2015 valide?

J'ai reçu un problème sur GitHub au sujet de mon module de validation ES2015 module d'authentification pour ESLint ne reconnaissant pas l'exportation default dans la syntaxe suivante:

 export { foo as default, bar } 

Où mon plugin se lint la syntaxe suivante (équivalent?) Pas de problème:

 export default foo; export const bar = ..; 

Babel et Esprima analysent une syntaxe similaire sans erreurs, et cela fonctionne pour le code utilisant Babel aux deux extrémités (importation et exportation).

Cependant, je ne suis pas convaincu que la spécification permet l'ancienne forme export { x as default } :

Pour chaque nom d' IdentifierName n dans ReferencedBindings of ExportClause : il s'agit d'une erreur de syntaxe si StringValue de n est un réservé ou si StringValue de n est l'un de: "implémente", "interface", "let", "package", "private" , "Protégé", "public", "statique" ou "rendement".

ReservedWord inclut default , mais je pense que l'on pourrait argumenter que ReferencedBindings se réfère spécifiquement aux noms d'identifiants de module-local qui sont exportés (c.-à-d. foo ) et non au nom exporté lui-même.

Il semble généralement étrange de pouvoir exporter des mots réservés; Babel va volontiers aussi permettre quelque chose comme

 // ./foo.js export { foo as yield } // ./mod.js import { yield as nonReservedIdentifier } from './foo' 

Donc, en résumé: l' export { foo as default } une manière valable d'exporter une valeur par défaut dans ES2015?

Oui, ReferencedBindings se réfère uniquement au First IdentifierName. Alors

 export { default as something } // or export { default } 

Est invalide, mais

 export { something as default } 

n'est pas. ESLint aura besoin d'un correctif ici.

Oui, c'est valide. Je vais le décomposer.

  1. :

     export { foo as default } 

    Cela correspond aux productions suivantes (du moins au plus précis):

     export ExportClause ExportClause : { ExportsList } ExportsList : ExportSpecifier ExportSpecifier : IdentifierName as IdentifierName 
  2. Ensuite, vous avez la sémantique d'erreur précoce :

    15.2.3.1 Sémantique statique: erreurs précoce

    ExportDeclaration : export ExportClause ;

    Pour chaque nom d' IdentifierName n dans ReferencedBindings of ExportClause : il s'agit d'une erreur de syntaxe si StringValue de n est StringValue

    Ceux-ci s'appliquent à toutes les productions correspondant à export ExportClause , y compris votre syntaxe d'exemple. Ceci invoque l'algorithme de Feuilles ReferencedBindings .

  3. L'algorithme ReferencedBindings qui s'applique à la production la plus spécifique associée à cette syntaxe est:

    ExportSpecifier : IdentifierName as IdentifierName

    Renvoie une List contenant le premier IdentifierName .

Vous voyez donc que la restriction relative à ReservedWord et aux autres valeurs indiquées ne s'applique qu'à la partie de la syntaxe dans votre exemple.