Remove JSON module resolution in TypeScript

Until JSON modules are not experimental in Node, avoid using them to
avoid creating broken ESM packages.
diff --git a/.eslintrc.js b/.eslintrc.js
index 8e628eb..f8e4f1e 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -127,10 +127,7 @@
         'import/no-internal-modules': [
           'error',
           {
-            allow: [
-              'ajv/lib/refs/json-schema-draft-04.json',
-              path.resolve(__dirname, './packages/*/src/**'),
-            ],
+            allow: [path.resolve(__dirname, './packages/*/src/**')],
           },
         ],
         'import/no-relative-parent-imports': 'off',
diff --git a/test/data-model.test.ts b/test/data-model.test.ts
index c52f4e1..b5661a5 100644
--- a/test/data-model.test.ts
+++ b/test/data-model.test.ts
@@ -24,7 +24,6 @@
 import { URL } from 'url';
 
 import Ajv from 'ajv';
-import META_SCHEMA from 'ajv/lib/refs/json-schema-draft-04.json';
 import { assert } from 'chai';
 import fetch from 'node-fetch';
 import resolve from 'resolve';
@@ -45,11 +44,10 @@
   }
 });
 
-function readSchema(schemaPath: string, base: string = 'web-annotation-tests/'): any {
-  const resolverOptions = { extensions: ['.json', '.test'] };
-  const resolvedPath = resolve.sync(`${base}${schemaPath}`, resolverOptions);
-  const schemaUnparsed = fs.readFileSync(resolvedPath);
-  return JSON.parse(schemaUnparsed.toString());
+function requireJSON(name: string): Record<string, unknown> {
+  const resolvedPath = resolve.sync(name);
+  const data = fs.readFileSync(resolvedPath).toString();
+  return JSON.parse(data) as Record<string, unknown>;
 }
 
 const DEFINITIONS = [
@@ -60,40 +58,48 @@
   'id',
   'otherProperties',
   'specificResource',
-].map(name => readSchema(`definitions/${name}`));
+].map(name => requireJSON(`web-annotation-tests/definitions/${name}.json`));
 
-const MUSTS = readSchema('annotations/annotationMusts');
+const MUSTS = requireJSON(
+  'web-annotation-tests/annotations/annotationMusts.test',
+);
 
-const ajv = new Ajv({ schemaId: 'auto' });
+const META_SCHEMA = requireJSON('ajv/lib/refs/json-schema-draft-04.json');
+
+const ajv = new Ajv({ schemaId: 'auto', meta: false });
 ajv.addMetaSchema(META_SCHEMA);
 DEFINITIONS.forEach(schema => ajv.addSchema(schema));
 
 describe('Test JSON against Schemas', () => {
-  let data = '';
+  let data: Record<string, unknown>;
 
   before(async function() {
     if (!found_url) {
       this.skip();
     } else {
       // load the data from the file or URL
-      let url_parsed = new URL(url);
+      const url_parsed = new URL(url);
       if (url_parsed.pathname !== url_parsed.href) {
         const data_response = await fetch(url_parsed.href);
-        data = await data_response.json();
+        data = (await data_response.json()) as Record<string, unknown>;
       } else {
         // assume we have a local file and use that
-        data = JSON.parse(fs.readFileSync(url_parsed.pathname, 'utf8'));
+        data = JSON.parse(
+          fs.readFileSync(url_parsed.pathname, 'utf8'),
+        ) as Record<string, unknown>;
       }
-      if (data === '') {
+
+      if (!data) {
         this.skip();
       }
     }
   });
 
-  MUSTS.assertions.forEach((schemaPath: string) => {
-    const schema = readSchema(schemaPath);
-    it(schema.title, () => {
-      let valid = ajv.validate(schema, data);
+  const assertions = MUSTS.assertions as [string];
+  assertions.forEach((schemaPath: string) => {
+    const schema = requireJSON(`web-annotation-tests/${schemaPath}`);
+    it(schema.title as string, () => {
+      const valid = ajv.validate(schema, data);
       assert.isOk(valid, ajv.errorsText());
     });
   });
diff --git a/tsconfig.json b/tsconfig.json
index cdd2af5..f37c6c5 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -10,7 +10,6 @@
     ],
     "moduleResolution": "node",
     "noEmit": true,
-    "resolveJsonModule": true,
     "paths": {
       "@annotator/*": ["packages/*/src"]
     },