== Why is this an issue?

Assigning a value to an import variable will cause a runtime error and will raise a compilation error in TypeScript.

=== Named imports

When using named imports, the imported identifier is a _live binding_ exported by another module. Live bindings can be updated or reassigned by the exporting module, and the imported value would also change. The importing module cannot reassign it.

[source,javascript]
----
import { exportedObject } from 'module.js';
exportedObject = 'hello world!';   // Noncompliant: TypeError: Assignment to constant variable.
----

This rule will *not* raise an issue when a module mutates the imported object. Be aware that all other modules importing the same value will observe the mutated value.

[source,javascript]
----
import { exportedObject } from 'module.js';
exportedObject.newAttribute = 'hello world!'; // exportedObject now contains newAttribute and can be seen from all other modules importing it
----

=== Namespace and dynamic imports

This rule will raise an issue when modifying members of a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import#module_namespace_object[_module namespace object_]. A module namespace object is a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal[sealed object] that describes all exports from a module.

This can be done using

* a namespace import
[source,javascript]
----
import * as module from 'module.js';
module.newObject = module.exportedObject; // Noncompliant: TypeError: Cannot add property readPath, object is not extensible
----

* the fulfillment value of a dynamic import.

[source,javascript]
----
import('module.js').then(module => {
  module.newObject = module.exportedObject; // Noncompliant: TypeError: Cannot add property readPath, object is not extensible
})
----

=== Default imports

Default imports are live bindings to the `default` export. As with the other forms of `import` declarations, the importing module cannot reassign it.

[source,javascript]
----
import module from 'module.js';
module = 'hello world!';   // Noncompliant: TypeError: Assignment to constant variable.
----

However, the object which `default` refers to is not a _live binding_ and may still be mutated by importing modules.

[source,javascript]
----
import moduleDefault from 'module.js';
moduleDefault.newAttribute = 'hello world!'; // module.default now contains newAttribute and can be seen from all other modules importing it
----

== Resources

=== Documentation

* MDN web docs - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import[import]
* MDN web docs - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import#module_namespace_object[Module namespace object]
* MDN web docs - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed#description[Sealed Objects]

//=== Articles & blog posts
//=== Conference presentations
//=== Standards
