From b1acfbe915e1ad22c5b49ba15b70818790abf65e Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Tue, 17 May 2022 09:28:39 -0400 Subject: [PATCH 01/14] Remove _.isObject --- src/build-headers-program.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build-headers-program.ts b/src/build-headers-program.ts index a7709696..a7ed4b03 100644 --- a/src/build-headers-program.ts +++ b/src/build-headers-program.ts @@ -22,7 +22,7 @@ const getHeaderName = (header: any) => { } const validHeaders = (headers: any, reporter: any) => { - if (!headers || !_.isObject(headers)) { + if (!headers || typeof headers !== 'object') { return false } From 7bd51112ad76a0fe0a53b6d8dbae5639b401c144 Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Tue, 17 May 2022 09:35:04 -0400 Subject: [PATCH 02/14] remove flatmap --- src/build-headers-program.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build-headers-program.ts b/src/build-headers-program.ts index a7ed4b03..0f8bf68e 100644 --- a/src/build-headers-program.ts +++ b/src/build-headers-program.ts @@ -97,7 +97,7 @@ const preloadHeadersByPage = ({ } pages.forEach((page: any) => { - const scripts = _.flatMap(COMMON_BUNDLES, (file) => getScriptPath(file, manifest)) + const scripts = COMMON_BUNDLES.flatMap((file) => getScriptPath(file, manifest)) scripts.push( ...getScriptPath(pathChunkName(page.path), manifest), ...getScriptPath(page.componentChunkName, manifest), From 82cb7e4f70ea44b925fa8b2b8af413b8f6b1f504 Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Tue, 17 May 2022 10:23:51 -0400 Subject: [PATCH 03/14] remove isBoolean --- src/build-headers-program.ts | 3 ++- src/util.ts | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 src/util.ts diff --git a/src/build-headers-program.ts b/src/build-headers-program.ts index 0f8bf68e..fa069468 100644 --- a/src/build-headers-program.ts +++ b/src/build-headers-program.ts @@ -15,6 +15,7 @@ import { NETLIFY_HEADERS_FILENAME, PAGE_DATA_DIR, } from './constants' +import { isBoolean } from './util' const getHeaderName = (header: any) => { const matches = header.match(/^([^:]+):/) @@ -196,7 +197,7 @@ const validateUserOptions = (pluginOptions: any, reporter: any) => (headers: any } [`mergeSecurityHeaders`, `mergeLinkHeaders`, `mergeCachingHeaders`].forEach((mergeOption) => { - if (!_.isBoolean(pluginOptions[mergeOption])) { + if (!isBoolean(pluginOptions[mergeOption])) { throw new TypeError( `The "${mergeOption}" option to gatsby-plugin-netlify must be a boolean. Check your gatsby-config.js.`, ) diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 00000000..d4e87f8b --- /dev/null +++ b/src/util.ts @@ -0,0 +1,6 @@ +export const isBoolean = (val: any): boolean => typeof val === 'boolean' || + ( + typeof val === 'object' && + val !== null && + typeof val.valueOf() === 'boolean' + ) From 0aa877fb1982e96e0d8291c19bdc7d9672bea122 Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Tue, 17 May 2022 10:29:41 -0400 Subject: [PATCH 04/14] fix typo --- src/build-headers-program.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/build-headers-program.ts b/src/build-headers-program.ts index fa069468..139e72c5 100644 --- a/src/build-headers-program.ts +++ b/src/build-headers-program.ts @@ -315,7 +315,7 @@ const applyCachingHeaders = return defaultMerge(headers, cachingHeaders, CACHING_HEADERS) } -const applyTransfromHeaders = +const applyTransformHeaders = ({ transformHeaders }: any) => @@ -337,7 +337,7 @@ const buildHeadersProgram = (pluginData: any, pluginOptions: any, reporter: any) applyCachingHeaders(pluginData, pluginOptions), mapUserLinkAllPageHeaders(pluginData, pluginOptions), applyLinkHeaders(pluginData, pluginOptions), - applyTransfromHeaders(pluginOptions), + applyTransformHeaders(pluginOptions), transformToString, writeHeadersFile(pluginData), )(pluginOptions.headers) From c9780fa817b0cf181a07fefa76ab524639e4f172 Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Tue, 17 May 2022 11:05:54 -0400 Subject: [PATCH 05/14] remove mapvalues --- src/build-headers-program.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/build-headers-program.ts b/src/build-headers-program.ts index 139e72c5..9b8f04c5 100644 --- a/src/build-headers-program.ts +++ b/src/build-headers-program.ts @@ -319,7 +319,10 @@ const applyTransformHeaders = ({ transformHeaders }: any) => - (headers: any) => _.mapValues(headers, transformHeaders) + (headers: any) => Object.fromEntries( + Object.entries(headers).map(([key, value]) => [key, transformHeaders(value)]) + ) + const transformToString = (headers: any) => `${HEADER_COMMENT}\n\n${stringifyHeaders(headers)}` From 7e6148f12d37881a981aeed33e2a5fa91af07e56 Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Tue, 17 May 2022 11:26:47 -0400 Subject: [PATCH 06/14] remove identity --- src/constants.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index 4731e5fc..db0f017b 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,5 +1,3 @@ -import _ from 'lodash' - // Gatsby values export const BUILD_HTML_STAGE = `build-html` export const BUILD_CSS_STAGE = `build-css` @@ -14,7 +12,7 @@ export const DEFAULT_OPTIONS = { mergeSecurityHeaders: true, mergeLinkHeaders: true, mergeCachingHeaders: true, - transformHeaders: _.identity, + transformHeaders: (value) => value, generateMatchPathRewrites: true, } From 438db00f04f3826ddf5676ee64a73311858594ad Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Tue, 17 May 2022 14:16:38 -0400 Subject: [PATCH 07/14] remove union --- src/build-headers-program.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/build-headers-program.ts b/src/build-headers-program.ts index 9b8f04c5..54964370 100644 --- a/src/build-headers-program.ts +++ b/src/build-headers-program.ts @@ -125,17 +125,15 @@ const preloadHeadersByPage = ({ return linksByPage } -const defaultMerge = (...headers: any[]) => { - const unionMerge = (objValue: any, srcValue: any) => { - if (Array.isArray(objValue)) { - return _.union(objValue, srcValue) - } - // opt into default merge behavior +const unionMerge = (objValue: any, srcValue: any) => { + if (Array.isArray(objValue)) { + return [...new Set([...objValue, ...srcValue])] } - - return _.mergeWith({}, ...headers, unionMerge) + // opt into default merge behavior } +const defaultMerge = (...headers: any[]) => _.mergeWith({}, ...headers, unionMerge) + const headersMerge = (userHeaders: any, defaultHeaders: any) => { const merged = {} Object.keys(defaultHeaders).forEach((path) => { From c085304d60566ee81fd1796586b9d2b5de670064 Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Tue, 17 May 2022 14:23:13 -0400 Subject: [PATCH 08/14] switch mergeWith to single import --- package.json | 1 + src/build-headers-program.ts | 3 ++- yarn.lock | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 270a3eb9..738f4f65 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "gatsby-core-utils": "^3.5.2", "kebab-hash": "^0.1.2", "lodash": "^4.17.21", + "lodash.mergewith": "^4.6.2", "webpack-assets-manifest": "^5.0.6" }, "devDependencies": { diff --git a/src/build-headers-program.ts b/src/build-headers-program.ts index 54964370..a3e61905 100644 --- a/src/build-headers-program.ts +++ b/src/build-headers-program.ts @@ -4,6 +4,7 @@ import { parse, posix } from 'path' import { writeFile, existsSync } from 'fs-extra' import kebabHash from 'kebab-hash' import _ from 'lodash' +import mergeWith from 'lodash.mergewith' import { HEADER_COMMENT, @@ -132,7 +133,7 @@ const unionMerge = (objValue: any, srcValue: any) => { // opt into default merge behavior } -const defaultMerge = (...headers: any[]) => _.mergeWith({}, ...headers, unionMerge) +const defaultMerge = (...headers: any[]) => mergeWith({}, ...headers, unionMerge) const headersMerge = (userHeaders: any, defaultHeaders: any) => { const merged = {} diff --git a/yarn.lock b/yarn.lock index 6a2b87ed..86a94a67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9158,6 +9158,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" From b2fddaccf0b488681524b024ca48e2461d5e853a Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Tue, 17 May 2022 14:38:12 -0400 Subject: [PATCH 09/14] remove flow and remove lodash --- package.json | 1 - src/build-headers-program.ts | 8 ++++---- src/util.ts | 5 +++++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 738f4f65..1af34ccd 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "fs-extra": "^10.0.0", "gatsby-core-utils": "^3.5.2", "kebab-hash": "^0.1.2", - "lodash": "^4.17.21", "lodash.mergewith": "^4.6.2", "webpack-assets-manifest": "^5.0.6" }, diff --git a/src/build-headers-program.ts b/src/build-headers-program.ts index a3e61905..4baa23bf 100644 --- a/src/build-headers-program.ts +++ b/src/build-headers-program.ts @@ -3,7 +3,6 @@ import { parse, posix } from 'path' import { writeFile, existsSync } from 'fs-extra' import kebabHash from 'kebab-hash' -import _ from 'lodash' import mergeWith from 'lodash.mergewith' import { @@ -16,7 +15,7 @@ import { NETLIFY_HEADERS_FILENAME, PAGE_DATA_DIR, } from './constants' -import { isBoolean } from './util' +import { isBoolean, flow } from './util' const getHeaderName = (header: any) => { const matches = header.match(/^([^:]+):/) @@ -332,7 +331,8 @@ const writeHeadersFile = (contents: any) => writeFile(publicFolder(NETLIFY_HEADERS_FILENAME), contents) const buildHeadersProgram = (pluginData: any, pluginOptions: any, reporter: any) => - _.flow( + flow( + [ validateUserOptions(pluginOptions, reporter), mapUserLinkHeaders(pluginData), applySecurityHeaders(pluginOptions), @@ -342,7 +342,7 @@ const buildHeadersProgram = (pluginData: any, pluginOptions: any, reporter: any) applyTransformHeaders(pluginOptions), transformToString, writeHeadersFile(pluginData), - )(pluginOptions.headers) + ])(pluginOptions.headers) export default buildHeadersProgram /* eslint-enable max-lines */ diff --git a/src/util.ts b/src/util.ts index d4e87f8b..0d0370b9 100644 --- a/src/util.ts +++ b/src/util.ts @@ -4,3 +4,8 @@ export const isBoolean = (val: any): boolean => typeof val === 'boolean' || val !== null && typeof val.valueOf() === 'boolean' ) + +export const flow = + funcs => + (...args) => + funcs.reduce((prev, fnc) => [fnc(...prev)], args)[0] From 0b895c6af81489858b66e404b8c6cc3462535e9a Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Tue, 17 May 2022 14:49:05 -0400 Subject: [PATCH 10/14] Add comment --- src/util.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/util.ts b/src/util.ts index 0d0370b9..9490a9f7 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,3 +1,4 @@ +// Accounting for true, false, and new Boolean() export const isBoolean = (val: any): boolean => typeof val === 'boolean' || ( typeof val === 'object' && From a327426ada8d46ef38adcdad479b9459aef38627 Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Wed, 18 May 2022 11:20:45 -0400 Subject: [PATCH 11/14] chore: switch to reduce --- src/build-headers-program.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/build-headers-program.ts b/src/build-headers-program.ts index 4baa23bf..1d70440a 100644 --- a/src/build-headers-program.ts +++ b/src/build-headers-program.ts @@ -317,9 +317,11 @@ const applyTransformHeaders = ({ transformHeaders }: any) => - (headers: any) => Object.fromEntries( - Object.entries(headers).map(([key, value]) => [key, transformHeaders(value)]) - ) + (headers: any) => + Object.entries(headers).reduce((temp, [key, value]) => { + temp[key] = transformHeaders(value) + return temp + }, {}) const transformToString = (headers: any) => `${HEADER_COMMENT}\n\n${stringifyHeaders(headers)}` From 98ecacb0300885f761d44796fef0c1a6055382f4 Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Wed, 18 May 2022 12:13:26 -0400 Subject: [PATCH 12/14] Add comments --- src/util.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/util.ts b/src/util.ts index 9490a9f7..884eed5c 100644 --- a/src/util.ts +++ b/src/util.ts @@ -6,7 +6,18 @@ export const isBoolean = (val: any): boolean => typeof val === 'boolean' || typeof val.valueOf() === 'boolean' ) +/** + * + * @param functions - takes in an array of functions + * @returns + */ export const flow = - funcs => +functions => + /** + * + * @param args - In our case, args is only {pluginOptions.headers} (in build-headers-program.ts), + * but in this generic implementation could take in any number of arguments + * @returns The evaluated return value of the last function + */ (...args) => - funcs.reduce((prev, fnc) => [fnc(...prev)], args)[0] + functions.reduce((prev, fnc) => [fnc(...prev)], args)[0] From 97ee4323f6f0513758c7d8c59f69d90ba025e53e Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Wed, 18 May 2022 13:19:11 -0400 Subject: [PATCH 13/14] More comments --- src/util.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/util.ts b/src/util.ts index 884eed5c..758fe707 100644 --- a/src/util.ts +++ b/src/util.ts @@ -9,7 +9,7 @@ export const isBoolean = (val: any): boolean => typeof val === 'boolean' || /** * * @param functions - takes in an array of functions - * @returns + * @returns The function documented below */ export const flow = functions => @@ -17,7 +17,8 @@ functions => * * @param args - In our case, args is only {pluginOptions.headers} (in build-headers-program.ts), * but in this generic implementation could take in any number of arguments - * @returns The evaluated return value of the last function + * @returns The evaluated return value of the last function from the array of functions provided in the + * {functions} parameter */ (...args) => functions.reduce((prev, fnc) => [fnc(...prev)], args)[0] From f0e5b12d267d5ab0ce96e1cbb7a5b1d2a2d7ed96 Mon Sep 17 00:00:00 2001 From: Sarah Etter Date: Wed, 18 May 2022 15:46:18 -0400 Subject: [PATCH 14/14] Modify types --- src/build-headers-program.ts | 7 +++++-- src/util.ts | 15 +++++++++++---- yarn.lock | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/build-headers-program.ts b/src/build-headers-program.ts index 1d70440a..1f571b2b 100644 --- a/src/build-headers-program.ts +++ b/src/build-headers-program.ts @@ -332,8 +332,8 @@ const writeHeadersFile = }: any) => (contents: any) => writeFile(publicFolder(NETLIFY_HEADERS_FILENAME), contents) -const buildHeadersProgram = (pluginData: any, pluginOptions: any, reporter: any) => - flow( +const buildHeadersProgram = (pluginData: any, pluginOptions: any, reporter: any) => { + const returnVal = flow( [ validateUserOptions(pluginOptions, reporter), mapUserLinkHeaders(pluginData), @@ -345,6 +345,9 @@ const buildHeadersProgram = (pluginData: any, pluginOptions: any, reporter: any) transformToString, writeHeadersFile(pluginData), ])(pluginOptions.headers) + console.log({returnVal}) + return returnVal + } export default buildHeadersProgram /* eslint-enable max-lines */ diff --git a/src/util.ts b/src/util.ts index 758fe707..67cba94e 100644 --- a/src/util.ts +++ b/src/util.ts @@ -6,19 +6,26 @@ export const isBoolean = (val: any): boolean => typeof val === 'boolean' || typeof val.valueOf() === 'boolean' ) +type Header = string +type Headers = Header[] + +// TODO: better return type +type FlowableFunction = (...flowArgs: Headers) => any; /** * * @param functions - takes in an array of functions * @returns The function documented below */ export const flow = -functions => +>(functions: FlowableFunction[]) => /** * - * @param args - In our case, args is only {pluginOptions.headers} (in build-headers-program.ts), + * @param headers - In our case, headers is only {pluginOptions.headers} (in build-headers-program.ts), * but in this generic implementation could take in any number of arguments + * * @returns The evaluated return value of the last function from the array of functions provided in the * {functions} parameter */ - (...args) => - functions.reduce((prev, fnc) => [fnc(...prev)], args)[0] + (...headers: Headers): FlowReturnType => functions.reduce((resultOfPrev, func) => [func(...resultOfPrev)], headers)[0] + + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 86a94a67..5b38c6cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9190,7 +9190,7 @@ lodash.zip@^4.2.0: lodash@4.17.21, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loose-envify@^1.0.0, loose-envify@^1.4.0: