All files / schemas/.history index_20220609153052.ts

0% Statements 0/63
0% Branches 0/1
0% Functions 0/1
0% Lines 0/63

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64                                                                                                                               
/**
 * @license
 * Copyright 2022 Open Ag Data Alliance
 *
 * Use of this source code is governed by an MIT-style
 * license that can be found in the LICENSE file or at
 * https://opensource.org/licenses/MIT.
 */

import { createRequire } from 'node:module';
import path from 'node:path';
import url from 'node:url';

import type { JSONSchema8 as Schema } from 'jsonschema8';
import { sync as _glob } from 'glob';

/**
 * Every .schema.ts file we have
 */
export const glob = _glob('/**/*.schema.{ts,js}', {
  cwd: __dirname,
  root: __dirname,
  nomount: true,
}).map((key) => key.replace(/\/+/, '/').replace(/\.(?:ts|js)$/, '.json'));

export const requireSchema: (path: string) => Schema = createRequire(
  path.join(dirname, 'schemas')
);
export class SchemaInfo {
  // Don't load schema until needed
  #schema?: Promise<Schema>;

  key: string;
  path: string;

  constructor(key: string) {
    this.path = join(__dirname, key);
    this.key = key;
  }

  get schema(): Promise<Schema> {
    if (this.#schema === undefined) {
      const inFile = this.key.replace(/^\//, './').replace(/\.json$/, '');
      // eslint-disable-next-line github/no-then
      this.#schema = import(inFile).then(
        ({ default: schema }) => schema as Schema
      );
    }

    return this.#schema;
  }
}

/**
 * Load all the schemas
 */
function* loadAllFormats(): Generator<SchemaInfo, void, void> {
  for (const key of glob) {
    yield new SchemaInfo(key);
  }
}

export default loadAllFormats;