Require extensions for non-package imports
diff --git a/.eslintrc.js b/.eslintrc.js
index 414bb5c..1c99acd 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -14,6 +14,7 @@
   },
   plugins: ['import', 'prettier'],
   rules: {
+    'import/extensions': ['error', 'always', { ignorePackages: true }],
     'import/no-default-export': 'error',
     'import/order': 'error',
     'import/unambiguous': 'error',
diff --git a/packages/fragment-identifier/src/index.js b/packages/fragment-identifier/src/index.js
index fd4f317..c7d85ea 100644
--- a/packages/fragment-identifier/src/index.js
+++ b/packages/fragment-identifier/src/index.js
@@ -13,7 +13,7 @@
  * the License.
  */
 
-export { SyntaxError, parse } from './fragment';
+export { SyntaxError, parse } from './fragment.js';
 
 /**
  * Convert a Selector or State into a fragment identifier string.
diff --git a/packages/range/src/index.js b/packages/range/src/index.js
index f2af25d..f1fc4d7 100644
--- a/packages/range/src/index.js
+++ b/packages/range/src/index.js
@@ -13,7 +13,7 @@
  * the License.
  */
 
-import { product } from './cartesian';
+import { product } from './cartesian.js';
 
 export function createRangeSelector({ createAnySelector }) {
   const startSelector = createAnySelector();