From 3712d7d4f534b539947c223243512d4704bf9b67 Mon Sep 17 00:00:00 2001
From: Hyeseong Kim <cometkim.kr@gmail.com>
Date: Fri, 6 Sep 2019 02:14:53 +0900
Subject: [PATCH] Debounce writeTypeDefinition() to batch multiple calls in 1s

---
 gatsby-node.ts | 43 ++++++++++++++++++++++---------------------
 package.json   |  4 +++-
 yarn.lock      | 17 +++++++++++++++++
 3 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/gatsby-node.ts b/gatsby-node.ts
index 6f84e7b..083cceb 100644
--- a/gatsby-node.ts
+++ b/gatsby-node.ts
@@ -2,6 +2,7 @@ import path from 'path';
 import fs from 'fs';
 import crypto from 'crypto';
 import chokidar from 'chokidar';
+import debounce from 'lodash.debounce';
 import { codegen } from '@graphql-codegen/core';
 import * as typescriptPlugin from '@graphql-codegen/typescript';
 import { loadDocuments, loadSchema } from 'graphql-toolkit';
@@ -35,34 +36,34 @@ export const onPostBootstrap: GatsbyNode['onPostBootstrap'] = async ({ store })
   const documents = await loadDocuments(resolve('src/**/*.{ts,tsx}'));
   log('Documents have been loaded');
 
-  const writeTypeDefinition = async () => {
-    const config = {
-      schemaAst,
-      documents,
-      plugins: [{
-        typescript: {
-          avoidOptionals: true,
-          maybeValue: 'T',
-          namingConvention: {
-            enumValues: 'keep',
-            transformUnderscore: false,
-          },
+  const config = {
+    schemaAst,
+    documents,
+    plugins: [{
+      typescript: {
+        avoidOptionals: true,
+        maybeValue: 'T',
+        namingConvention: {
+          enumValues: 'keep',
+          transformUnderscore: false,
         },
-      }],
-      pluginMap: {
-        typescript: typescriptPlugin,
       },
-      // Not really necessary
-      filename: '',
-      config: {},
-    }
+    }],
+    pluginMap: {
+      typescript: typescriptPlugin,
+    },
+    // Not really necessary
+    filename: '',
+    config: {},
+  }
+
+  const writeTypeDefinition = debounce(async () => {
     // @ts-ignore
     const output = await codegen(config);
     await fs.promises.mkdir(resolve('generated/types'), { recursive: true });
     await fs.promises.writeFile(resolve('generated/types/gatsby.ts'), output, 'utf-8');
     log('Type definitions have been generated');
-  };
-
+  }, 1000);
 
   const watcher = chokidar.watch([
     schemaOutputPath,
diff --git a/package.json b/package.json
index 638eec2..bc7db19 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,8 @@
     "@graphql-codegen/core": "^1.7.0",
     "@graphql-codegen/typescript": "^1.7.0",
     "chokidar": "^3.0.2",
-    "graphql-toolkit": "^0.5.11"
+    "graphql-toolkit": "^0.5.11",
+    "lodash.debounce": "^4.0.8"
   },
   "devDependencies": {
     "@babel/cli": "^7.5.5",
@@ -37,6 +38,7 @@
     "@babel/preset-typescript": "^7.3.3",
     "@types/chokidar": "^2.1.3",
     "@types/graphql": "^14.5.0",
+    "@types/lodash.debounce": "^4.0.6",
     "@types/node": "^12.7.3",
     "babel-preset-gatsby-package": "^0.2.3",
     "gatsby": "^2.15.6",
diff --git a/yarn.lock b/yarn.lock
index a4b880e..1fc4f27 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1064,6 +1064,18 @@
   resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636"
   integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==
 
+"@types/lodash.debounce@^4.0.6":
+  version "4.0.6"
+  resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.6.tgz#c5a2326cd3efc46566c47e4c0aa248dc0ee57d60"
+  integrity sha512-4WTmnnhCfDvvuLMaF3KV4Qfki93KebocUF45msxhYyjMttZDQYzHkO639ohhk8+oco2cluAFL3t5+Jn4mleylQ==
+  dependencies:
+    "@types/lodash" "*"
+
+"@types/lodash@*":
+  version "4.14.138"
+  resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.138.tgz#34f52640d7358230308344e579c15b378d91989e"
+  integrity sha512-A4uJgHz4hakwNBdHNPdxOTkYmXNgmUAKLbXZ7PKGslgeV0Mb8P3BlbYfPovExek1qnod4pDfRbxuzcVs3dlFLg==
+
 "@types/minimatch@*":
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
@@ -6328,6 +6340,11 @@ lockfile@^1.0.4:
   dependencies:
     signal-exit "^3.0.2"
 
+lodash.debounce@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+  integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+
 lodash.every@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash.every/-/lodash.every-4.6.0.tgz#eb89984bebc4364279bb3aefbbd1ca19bfa6c6a7"
-- 
GitLab