Home Reference Source

src/loadDataset.js

import { DATA_PATH, getDataDir } from "./config";
import { store } from "./store";
/**
 * Load a single dataset into the store.
 * @private
 * @param {Object} dataset - The dataset to load
 * @param {string} [context] - The context for data storage (e.g., 'benin' for Benin-specific data)
 * @return {Promise} a promise that resolves when the dataset has been loaded
 */
export const loadDataset = (dataset, context) => {
  // If dataset is loaded (or loading), return existing data (or promise)
  if (store[dataset] !== undefined) return Promise.resolve(store[dataset]);

  // Load data via readJson (server) or fetch (browser), depending on environment
  if (typeof window === "undefined" || typeof fetch === "undefined") {
    // Server
    const path = require("path");
    const fse = require("fs-extra");
    const dataDir = getDataDir(context);
    const datasetPath = path.resolve(dataDir, `${dataset}.json`);
    store[dataset] = fse.readJson(datasetPath);
  } else {
    const subdirectory = context ? `${context}/` : "";
    // Browser
    store[dataset] = fetch(`${DATA_PATH}${subdirectory}${dataset}.json`).then(
      (res) => res.json()
    );
  }

  // When loading is done, replace promise with actual data
  store[dataset].then((data) => {
    Object.assign(store, data);
    return store[dataset];
  });

  return store[dataset];
};