<commit_before><commit_msg>:sparkles: Implement script to automatically update `@jovotech/framework` peer dependencies<commit_after>const fs = require('fs');
const { PackageGraph } = require('@lerna/package-graph');
const { Project } = require('@lerna/project');
const { getFilteredPackages } = require('@lerna/filter-options');
const { join, relative } = require('path');
const log = require('npmlog');

(async () => {
  const cwd = join(__dirname, '..');
  const project = new Project(cwd);
  const packages = await project.getPackages();
  const packageGraph = new PackageGraph(packages);

  const frameworkPackage = packages.find((pkg) => pkg.name === '@jovotech/framework');

  if (!frameworkPackage) {
    throw new Error(`Can not update peerDependencies, could not find @jovotech/framework`);
  }

  log.info('peer', 'Updating @jovotech/framework peer-dependency to %s', frameworkPackage.version);

  const filteredPackages = await getFilteredPackages(
    packageGraph,
    { cwd },
    {
      ignore: [
        '@jovotech/framework',
        '@jovotech/output',
        '@jovotech/output-*',
        '@jovotech/e2e',
        '@jovotech/examples-*',
      ],
    },
  );

  const promises = filteredPackages.map((pkg) => {
    pkg.peerDependencies['@jovotech/framework'] = frameworkPackage.version;
    return pkg.serialize();
  });
  await Promise.all(promises);
})()
  .then(() => {
    console.log('Success');
    process.exit(0);
  })
  .catch((e) => {
    console.error('Failure');
    console.error((e.stdout || e.message).trim());
    console.error(e.stack);
    process.exit(1);
  });

{'fraction_non_alphanumeric': 0.16978776529338327, 'fraction_numerical': 0.0018726591760299626, 'mean_word_length': 3.8283132530120483, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 8, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4651280', 'n_tokens_mistral': 509, 'n_tokens_neox': 491, 'n_words': 97}