Index: frontend/node_modules/eslint-module-utils/hash.js
===================================================================
--- frontend/node_modules/eslint-module-utils/hash.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/eslint-module-utils/hash.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,66 @@
+/**
+ * utilities for hashing config objects.
+ * basically iteratively updates hash with a JSON-like format
+ */
+
+'use strict';
+
+exports.__esModule = true;
+
+const createHash = require('crypto').createHash;
+
+const stringify = JSON.stringify;
+
+/** @type {import('./hash').default} */
+function hashify(value, hash) {
+  if (!hash) { hash = createHash('sha256'); }
+
+  if (Array.isArray(value)) {
+    hashArray(value, hash);
+  } else if (typeof value === 'function') {
+    hash.update(String(value));
+  } else if (value instanceof Object) {
+    hashObject(value, hash);
+  } else {
+    hash.update(stringify(value) || 'undefined');
+  }
+
+  return hash;
+}
+exports.default = hashify;
+
+/** @type {import('./hash').hashArray} */
+function hashArray(array, hash) {
+  if (!hash) { hash = createHash('sha256'); }
+
+  hash.update('[');
+  for (let i = 0; i < array.length; i++) {
+    hashify(array[i], hash);
+    hash.update(',');
+  }
+  hash.update(']');
+
+  return hash;
+}
+hashify.array = hashArray;
+exports.hashArray = hashArray;
+
+/** @type {import('./hash').hashObject} */
+function hashObject(object, optionalHash) {
+  const hash = optionalHash || createHash('sha256');
+
+  hash.update('{');
+  Object.keys(object).sort().forEach((key) => {
+    hash.update(stringify(key));
+    hash.update(':');
+    // @ts-expect-error the key is guaranteed to exist on the object here
+    hashify(object[key], hash);
+    hash.update(',');
+  });
+  hash.update('}');
+
+  return hash;
+}
+hashify.object = hashObject;
+exports.hashObject = hashObject;
+
