How to export constants defined using object destructuring

Viewed 1888

Guided by eslint's prefer-destructuring rule, I defined some constants like this:

const {
    NODE_ENV,
    API_URL,
} = process.env;

Is it possible to export these constants by prefixing the statement by export?

export const {
    NODE_ENV,
    API_URL,
} = process.env;

This would seem natural, but eslint-plugin-import complains about a violation of the import/named rule: API_URL not found in '../constants'. In fact, this usage of export is also not described on the relevant MDN page.

Do we then have to repeat all constants in a separate export statement?

const {
    NODE_ENV,
    API_URL,
} = process.env;

export {
    NODE_ENV,
    API_URL,
};
2 Answers

Is it possible to export these constants by prefixing the statement by export?

export const {
    NODE_ENV,
    API_URL,
} = process.env;

Yes, this is totally valid according to the spec. You can use destructuring patterns in the declarations of exported consts.

This would seem natural, but eslint-plugin-import complains about a violation of the import/named rule: API_URL not found in '../constants'.

Sounds like that plugin is broken. In fact, your exact use case was reported as working before.

Article 15.2.2.3 of the spec says:

 ...
ExportDeclaration : export VariableStatement
ExportDeclaration : export Declaration

Article 13.1.4 says:

Declaration : LexicalDeclaration

Article 13.3 says:

LexicalDeclaration:
   LetOrConst BindingList;

LetOrConst :
 let
 const

BindingList :
 LexicalBinding
 BindingList, LexicalBinding

 LexicalBinding:
  BindingPattern Initializer

Therefore this:

 // ExportDeclaration
  export  // export
    // Declaration
    // LexicalDeclaration:
    const // LetOrConst
     // LexicalBindingList
     // LexicalBinding
     { NODE_ENV, API_URL } // BindingPattern
      = process.env; // Initializer

is totally valid JavaScript.

Related