function buildData()

in build_data.js [29:137]


function buildData() {
  if (_currBuild) return _currBuild;

  const START = '🏗   ' + colors.yellow('Building data...');
  const END = '👍  ' + colors.green('data built');

  console.log('');
  console.log(START);
  console.time(END);

  // Create symlinks if necessary..  { 'target': 'source' }
  const symlinks = {
    'land.html': 'dist/land.html',
    img: 'dist/img'
  };

  for (let target of Object.keys(symlinks)) {
    if (!shell.test('-L', target)) {
      console.log(`Creating symlink:  ${target} -> ${symlinks[target]}`);
      shell.ln('-sf', symlinks[target], target);
    }
  }

  // Translation strings
  let tstrings = {
    categories: {},
    groups: {},
    fields: {},
    presets: {}
  };

  // Font Awesome icons used
  let faIcons = {
    'fas-smile-beam': {},
    'fas-grin-beam': {},
    'fas-laugh-beam': {},
    'fas-sun': {},
    'fas-moon': {},
    'fas-edit': {},
    'fas-map-marked-alt': {},
    'fas-toolbox': {},
    'fas-clock': {},
    'fas-birthday-cake': {},
    'fas-i-cursor': {},
    'fas-lock': {},
    'fas-long-arrow-alt-right': {},
    'fas-th-list': {}
  };

  // The Noun Project icons used
  let tnpIcons = {};

  // all fields searchable under "add field"
  let searchableFieldIDs = {};

  // Start clean
  shell.rm('-f', [
    'data/presets/categories.json',
    'data/presets/fields.json',
    'data/presets/presets.json',
    'data/presets.yaml',
    'data/taginfo.json',
    'data/territory-languages.json',
    'dist/locales/en.json',
    'svg/fontawesome/*.svg',
  ]);

  var groups = generateGroups(tstrings);
  let categories = generateCategories(tstrings, faIcons, tnpIcons);
  let fields = generateFields(tstrings, faIcons, tnpIcons, searchableFieldIDs);
  let presets = generatePresets(tstrings, faIcons, tnpIcons, searchableFieldIDs);
  let defaults = read('data/presets/defaults.json');
  let translations = generateTranslations(fields, presets, tstrings, searchableFieldIDs);
  let taginfo = generateTaginfo(presets, fields);
  let territoryLanguages = generateTerritoryLanguages();

  // Additional consistency checks
  validateCategoryPresets(categories, presets);
  validatePresetFields(presets, fields);
  validateDefaults(defaults, categories, presets);

  // Save individual data files
  let tasks = [
    writeFileProm('data/presets/categories.json', prettyStringify({ categories: categories }) ),
    writeFileProm('data/presets/fields.json', prettyStringify({ fields: fields }, { maxLength: 9999 }) ),
    writeFileProm('data/presets/presets.json', prettyStringify({ presets: presets }, { maxLength: 9999 }) ),
    writeFileProm('data/presets.yaml', translationsToYAML(translations) ),
    writeFileProm('data/presets/groups.json', prettyStringify({ groups: groups }, { maxLength: 1000 })),
    writeFileProm('data/taginfo.json', prettyStringify(taginfo, { maxLength: 9999 }) ),
    writeFileProm('data/territory-languages.json', prettyStringify({ dataTerritoryLanguages: territoryLanguages }, { maxLength: 9999 }) ),
    writeEnJson(tstrings),
    writeFaIcons(faIcons),
    writeTnpIcons(tnpIcons)
  ];

  return _currBuild =
    Promise.all(tasks)
    .then(() => {
      console.timeEnd(END);
      console.log('');
      _currBuild = null;
    })
    .catch((err) => {
      console.error(err);
      console.log('');
      _currBuild = null;
      process.exit(1);
    });
}