From 522b54838e0fc4d7a25a08d5a42f4075c4d544c7 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 10 Apr 2026 23:38:51 -0500 Subject: [PATCH 01/15] Add metadata values to split in helpers. --- shared/helpers.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/shared/helpers.js b/shared/helpers.js index d2a9c8b73..c445e1ea1 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -93,6 +93,39 @@ const splitTextStyleAndMetadata = (brew)=>{ const metadata = yaml.load(metadataSection); Object.assign(brew, _.pick(metadata, ['title', 'description', 'renderer', 'theme', 'lang'])); brew.snippets = yamlSnippetsToText(_.pick(metadata, ['snippets']).snippets || ''); + + // Copy Required Bleed Space or Use defaults + brew.bleed = { + top : _.pick(metadata, ['bleed']).top || '.125in', + bottom : _.pick(metadata, ['bleed']).bottom || '.125in', + left : _.pick(metadata, ['bleed']).left || '.125in', + right : _.pick(metadata, ['bleed']).right || '.125in', + }; + + // Copy Required Safe Space or Use defaults + brew.safetySpace = { + top : _.pick(metadata, ['safetySpace']).top || '.125in', + bottom : _.pick(metadata, ['safetySpace']).bottom || '.125in', + left : _.pick(metadata, ['safetySpace']).left || '.125in', + right : _.pick(metadata, ['safetySpace']).right || '.125in', + }; + + // Set brew paper trim size or default to US Letter + brew.trimSize = { + width : _.pick(metadata, ['trimSize']).width || '8.5in', + height : _.pick(metadata, ['trimSize']).height || '11in', + }; + + // Set Column specs or use defaults + brew.columns = _.pick(metadata, ['columns']) || '2'; + brew.columnGutter = _.pick(metadata, ['columnGutter']) || '.125in'; + + // Set License or set to Unlicensed + brew.license = _.pick(metadata, ['license']) || 'None'; + + // Set Authors legal names or to empty. + brew.legalAuthors = _.pick(metadata, ['legalAuthors']) || ''; + brew.text = brew.text.slice(index + 6); } if(brew.text.startsWith('```css')) { From bda56d4f8d5e35e784cca1e5922c871ee0e623e0 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 11 Apr 2026 00:15:06 -0500 Subject: [PATCH 02/15] Update new meta data save, update tests --- server/homebrew.api.js | 32 +++++++++++ server/homebrew.api.spec.js | 108 ++++++++++++++++++++++++------------ 2 files changed, 106 insertions(+), 34 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 04c6507e8..d4d0f205c 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -220,6 +220,38 @@ const api = { const metadata = _.pick(brew, ['title', 'description', 'tags', 'renderer', 'theme']); const snippetsArray = brewSnippetsToJSON('brew_snippets', brew.snippets, null, false).snippets; metadata.snippets = snippetsArray.length > 0 ? snippetsArray : undefined; + + metadata.bleed = { + top : brew?.bleed?.top || '.125in', + bottom : brew?.bleed?.bottom || '.125in', + left : brew?.bleed?.left || '.125in', + right : brew?.bleed?.right || '.125in', + }; + + // Copy Required Safe Space or Use defaults + metadata.safetySpace = { + top : brew?.safetySpace?.top || '.125in', + bottom : brew?.safetySpace?.bottom || '.125in', + left : brew?.safetySpace?.left || '.125in', + right : brew?.safetySpace?.right || '.125in', + }; + + // Set brew paper trim size or default to US Letter + metadata.trimSize = { + width : brew?.trimSize?.width || '8.5in', + height : brew?.trimSize?.height || '11in', + }; + + // Set Column specs or use defaults + metadata.columns = brew?.columns || '2'; + metadata.columnGutter = brew?.columnGutter || '.125in'; + + // Set License or set to Unlicensed + metadata.license = brew?.license || 'None'; + + // Set Authors legal names or to empty. + metadata.legalAuthors = brew?.legalAuthors || ''; + text = `\`\`\`metadata\n` + `${yaml.dump(metadata)}\n` + `\`\`\`\n\n` + diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 05ae8c51a..a18ab3b43 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -390,7 +390,13 @@ describe('Tests for api', ()=>{ tags : ['something', 'fun'], renderer : 'v3', theme : 'phb', - googleId : '12345' + googleId : '12345', + bleed : { + top : '.125in', + bottom : '.125in', + left : '.125in', + right : '.125in' + } }); expect(result).toEqual(`\`\`\`metadata @@ -401,6 +407,23 @@ tags: - fun renderer: v3 theme: phb +bleed: + top: .125in + bottom: .125in + left: .125in + right: .125in +safetySpace: + top: .125in + bottom: .125in + left: .125in + right: .125in +trimSize: + width: 8.5in + height: 11in +columns: '2' +columnGutter: .125in +license: None +legalAuthors: '' \`\`\` @@ -416,7 +439,7 @@ brew`); tags : ['something', 'fun'], renderer : 'v3', theme : 'phb', - googleId : '12345' + googleId : '12345', }); expect(result).toEqual(`\`\`\`metadata @@ -427,6 +450,23 @@ tags: - fun renderer: v3 theme: phb +bleed: + top: .125in + bottom: .125in + left: .125in + right: .125in +safetySpace: + top: .125in + bottom: .125in + left: .125in + right: .125in +trimSize: + width: 8.5in + height: 11in +columns: '2' +columnGutter: .125in +license: None +legalAuthors: '' \`\`\` @@ -537,16 +577,16 @@ brew`); expect(res.status).toHaveBeenCalledWith(200); expect(res.send).toHaveBeenCalledWith({ - _id : '1', - authors : ['test user'], - createdAt : undefined, - description : '', - editId : expect.any(String), - gDrive : false, - pageCount : 1, - published : false, - renderer : 'V3', - lang : 'en', + _id : '1', + authors : ['test user'], + createdAt : undefined, + description : '', + editId : expect.any(String), + gDrive : false, + pageCount : 1, + published : false, + renderer : 'V3', + lang : 'en', shareId : expect.any(String), style : undefined, tags : [], @@ -595,28 +635,28 @@ brew`); expect(google.newGoogleBrew).toHaveBeenCalled(); expect(res.status).toHaveBeenCalledWith(200); expect(res.send).toHaveBeenCalledWith({ - _id : '1', - authors : ['test user'], - createdAt : undefined, - description : '', - editId : expect.any(String), - gDrive : false, - pageCount : 1, - published : false, - renderer : 'V3', - lang : 'en', - shareId : expect.any(String), - googleId : expect.any(String), - style : undefined, - tags : [], - text : undefined, - textBin : undefined, - theme : '5ePHB', - thumbnail : '', - title : 'asdf', - trashed : false, - updatedAt : undefined, - views : 0 + _id : '1', + authors : ['test user'], + createdAt : undefined, + description : '', + editId : expect.any(String), + gDrive : false, + pageCount : 1, + published : false, + renderer : 'V3', + lang : 'en', + shareId : expect.any(String), + googleId : expect.any(String), + style : undefined, + tags : [], + text : undefined, + textBin : undefined, + theme : '5ePHB', + thumbnail : '', + title : 'asdf', + trashed : false, + updatedAt : undefined, + views : 0 }); }); }); From 5f266d67341ad2663378541e7654815038066072 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 11 Apr 2026 00:17:44 -0500 Subject: [PATCH 03/15] Remove unneeded test value --- server/homebrew.api.spec.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index a18ab3b43..4a469dfed 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -390,13 +390,7 @@ describe('Tests for api', ()=>{ tags : ['something', 'fun'], renderer : 'v3', theme : 'phb', - googleId : '12345', - bleed : { - top : '.125in', - bottom : '.125in', - left : '.125in', - right : '.125in' - } + googleId : '12345' }); expect(result).toEqual(`\`\`\`metadata From d3287b7cd71dcc259782585532cf236f59207584 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 11 Apr 2026 09:46:16 -0500 Subject: [PATCH 04/15] Update defaults based on RPGNow POD https://help.drivethrupartners.com/hc/en-us/articles/12780800178583-Quick-Specifications-for-Print-Books#h_01HP59NC7WJ9C84PEDSFM1WBR9 --- server/homebrew.api.js | 8 ++++---- server/homebrew.api.spec.js | 16 ++++++++-------- shared/helpers.js | 10 +++++----- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index d4d0f205c..58aa4a72e 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -230,10 +230,10 @@ const api = { // Copy Required Safe Space or Use defaults metadata.safetySpace = { - top : brew?.safetySpace?.top || '.125in', - bottom : brew?.safetySpace?.bottom || '.125in', - left : brew?.safetySpace?.left || '.125in', - right : brew?.safetySpace?.right || '.125in', + top : brew?.safetySpace?.top || '.25in', + bottom : brew?.safetySpace?.bottom || '.25in', + outer : brew?.safetySpace?.outer || '.25in', + inner : brew?.safetySpace?.inner || '.5in', }; // Set brew paper trim size or default to US Letter diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 4a469dfed..4f151aeac 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -407,10 +407,10 @@ bleed: left: .125in right: .125in safetySpace: - top: .125in - bottom: .125in - left: .125in - right: .125in + top: .25in + bottom: .25in + outer: .25in + inner: .5in trimSize: width: 8.5in height: 11in @@ -450,10 +450,10 @@ bleed: left: .125in right: .125in safetySpace: - top: .125in - bottom: .125in - left: .125in - right: .125in + top: .25in + bottom: .25in + outer: .25in + inner: .5in trimSize: width: 8.5in height: 11in diff --git a/shared/helpers.js b/shared/helpers.js index c445e1ea1..2d75ae6b8 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -104,10 +104,10 @@ const splitTextStyleAndMetadata = (brew)=>{ // Copy Required Safe Space or Use defaults brew.safetySpace = { - top : _.pick(metadata, ['safetySpace']).top || '.125in', - bottom : _.pick(metadata, ['safetySpace']).bottom || '.125in', - left : _.pick(metadata, ['safetySpace']).left || '.125in', - right : _.pick(metadata, ['safetySpace']).right || '.125in', + top : _.pick(metadata, ['safetySpace']).top || '.25in', + bottom : _.pick(metadata, ['safetySpace']).bottom || '.25in', + outer : _.pick(metadata, ['safetySpace']).outer || '.25in', + inner : _.pick(metadata, ['safetySpace']).inner || '.5in', }; // Set brew paper trim size or default to US Letter @@ -125,7 +125,7 @@ const splitTextStyleAndMetadata = (brew)=>{ // Set Authors legal names or to empty. brew.legalAuthors = _.pick(metadata, ['legalAuthors']) || ''; - + brew.text = brew.text.slice(index + 6); } if(brew.text.startsWith('```css')) { From 2fe733cc063ad2c5777ca94b7436e31a3995bbd5 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 11 Apr 2026 10:19:37 -0500 Subject: [PATCH 05/15] Add test for custom page settings vs defaults and extended metadata Tweak SplitMetadataAndText based on faulty assumptions for setting defaults. --- server/homebrew.api.spec.js | 73 +++++++++++++++++++++++++++++++++++++ shared/helpers.js | 29 ++++++++------- 2 files changed, 88 insertions(+), 14 deletions(-) diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 4f151aeac..60f32c940 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -1127,6 +1127,79 @@ brew`); // Text expect(testBrew.text).toEqual('text\n'); }); + + it('extended metadata', async ()=>{ + const testBrew = { + text : '```metadata\n' + + 'title: title\n' + + 'description: description\n' + + 'tags: [ \'tag a\' , \'tag b\' ]\n' + + 'renderer: legacy\n' + + 'theme: 5ePHB\n' + + 'lang: en\n' + + 'bleed:\n' + + ' top: 1.5in\n' + + ' bottom: 1.5in\n' + + ' left: 1.5in\n' + + ' right: 1.5in\n' + + 'safetySpace:\n' + + ' top: 1.25in\n' + + ' bottom: 1.25in\n' + + ' outer: 1.25in\n' + + ' inner: 1.5in\n' + + 'trimSize:\n' + + ' width: 18.5in\n' + + ' height: 111in\n' + + 'columns: 12\n' + + 'columnGutter: 1.125in\n' + + 'license: AELF\n' + + 'legalAuthors: Tom Bombadil\n' + + '\n' + + '```\n' + + '\n' + + '```css\n' + + 'style\n' + + 'style\n' + + 'style\n' + + '```\n' + + '\n' + + 'text\n' + }; + + splitTextStyleAndMetadata(testBrew); + + // Metadata + expect(testBrew.title).toEqual('title'); + expect(testBrew.description).toEqual('description'); + expect(testBrew.renderer).toEqual('legacy'); + expect(testBrew.theme).toEqual('5ePHB'); + expect(testBrew.lang).toEqual('en'); + // Paper Specfications + expect(testBrew.bleed.top).toEqual('1.5in'); + expect(testBrew.bleed.bottom).toEqual('1.5in'); + expect(testBrew.bleed.left).toEqual('1.5in'); + expect(testBrew.bleed.right).toEqual('1.5in'); + + expect(testBrew.safetySpace.top).toEqual('1.25in'); + expect(testBrew.safetySpace.bottom).toEqual('1.25in'); + expect(testBrew.safetySpace.inner).toEqual('1.5in'); + expect(testBrew.safetySpace.outer).toEqual('1.25in'); + + expect(testBrew.trimSize.width).toEqual('18.5in'); + expect(testBrew.trimSize.height).toEqual('111in'); + + expect(testBrew.columns).toEqual(12); + expect(testBrew.columnGutter).toEqual('1.125in'); + + // Extended Metadata + expect(testBrew.license).toEqual('AELF'); + expect(testBrew.legalAuthors).toEqual('Tom Bombadil'); + + // Style + expect(testBrew.style).toEqual('style\nstyle\nstyle\n'); + // Text + expect(testBrew.text).toEqual('text\n'); + }); }); describe('updateBrew', ()=>{ diff --git a/shared/helpers.js b/shared/helpers.js index 2d75ae6b8..18dd127ff 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -95,36 +95,37 @@ const splitTextStyleAndMetadata = (brew)=>{ brew.snippets = yamlSnippetsToText(_.pick(metadata, ['snippets']).snippets || ''); // Copy Required Bleed Space or Use defaults + brew.bleed = { - top : _.pick(metadata, ['bleed']).top || '.125in', - bottom : _.pick(metadata, ['bleed']).bottom || '.125in', - left : _.pick(metadata, ['bleed']).left || '.125in', - right : _.pick(metadata, ['bleed']).right || '.125in', + top : _.pick(metadata, ['bleed']).bleed?.top || '.125in', + bottom : _.pick(metadata, ['bleed']).bleed?.bottom || '.125in', + left : _.pick(metadata, ['bleed']).bleed?.left || '.125in', + right : _.pick(metadata, ['bleed']).bleed?.right || '.125in', }; // Copy Required Safe Space or Use defaults brew.safetySpace = { - top : _.pick(metadata, ['safetySpace']).top || '.25in', - bottom : _.pick(metadata, ['safetySpace']).bottom || '.25in', - outer : _.pick(metadata, ['safetySpace']).outer || '.25in', - inner : _.pick(metadata, ['safetySpace']).inner || '.5in', + top : _.pick(metadata, ['safetySpace']).safetySpace?.top || '.25in', + bottom : _.pick(metadata, ['safetySpace']).safetySpace?.bottom || '.25in', + outer : _.pick(metadata, ['safetySpace']).safetySpace?.outer || '.25in', + inner : _.pick(metadata, ['safetySpace']).safetySpace?.inner || '.5in', }; // Set brew paper trim size or default to US Letter brew.trimSize = { - width : _.pick(metadata, ['trimSize']).width || '8.5in', - height : _.pick(metadata, ['trimSize']).height || '11in', + width : _.pick(metadata, ['trimSize']).trimSize?.width || '8.5in', + height : _.pick(metadata, ['trimSize']).trimSize?.height || '11in', }; // Set Column specs or use defaults - brew.columns = _.pick(metadata, ['columns']) || '2'; - brew.columnGutter = _.pick(metadata, ['columnGutter']) || '.125in'; + brew.columns = metadata?.columns || 2; + brew.columnGutter = metadata?.columnGutter || '.125in'; // Set License or set to Unlicensed - brew.license = _.pick(metadata, ['license']) || 'None'; + brew.license = metadata?.license || 'None'; // Set Authors legal names or to empty. - brew.legalAuthors = _.pick(metadata, ['legalAuthors']) || ''; + brew.legalAuthors = metadata.legalAuthors || ''; brew.text = brew.text.slice(index + 6); } From f0dc66bf2bb38839bda2f5583fb05bfa2aa496ff Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 27 Jun 2026 16:03:10 -0500 Subject: [PATCH 06/15] Bleed should follow safetySpace dimension names ( inner/outer vs left/right ) --- shared/helpers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/helpers.js b/shared/helpers.js index b3231e176..b2cf76998 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -99,8 +99,8 @@ const splitTextStyleAndMetadata = (brew)=>{ brew.bleed = { top : _.pick(metadata, ['bleed']).bleed?.top || '.125in', bottom : _.pick(metadata, ['bleed']).bleed?.bottom || '.125in', - left : _.pick(metadata, ['bleed']).bleed?.left || '.125in', - right : _.pick(metadata, ['bleed']).bleed?.right || '.125in', + inner : _.pick(metadata, ['bleed']).bleed?.inner || '.125in', + outer : _.pick(metadata, ['bleed']).bleed?.outer || '.125in', }; // Copy Required Safe Space or Use defaults From 1e2d76885fa5ea16db5be903c49e286385a14d27 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 27 Jun 2026 16:08:07 -0500 Subject: [PATCH 07/15] Missed references fixed --- server/homebrew.api.js | 4 ++-- server/homebrew.api.spec.js | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 3bab31c8a..026ff2eda 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -224,8 +224,8 @@ const api = { metadata.bleed = { top : brew?.bleed?.top || '.125in', bottom : brew?.bleed?.bottom || '.125in', - left : brew?.bleed?.left || '.125in', - right : brew?.bleed?.right || '.125in', + inner : brew?.bleed?.inner || '.125in', + outer : brew?.bleed?.outer || '.125in', }; // Copy Required Safe Space or Use defaults diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 60f32c940..02ebbf0c2 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -404,8 +404,8 @@ theme: phb bleed: top: .125in bottom: .125in - left: .125in - right: .125in + outer: .125in + inner: .125in safetySpace: top: .25in bottom: .25in @@ -447,8 +447,8 @@ theme: phb bleed: top: .125in bottom: .125in - left: .125in - right: .125in + outer: .125in + inner: .125in safetySpace: top: .25in bottom: .25in @@ -1140,8 +1140,8 @@ brew`); 'bleed:\n' + ' top: 1.5in\n' + ' bottom: 1.5in\n' + - ' left: 1.5in\n' + - ' right: 1.5in\n' + + ' outer: 1.5in\n' + + ' inner: 1.5in\n' + 'safetySpace:\n' + ' top: 1.25in\n' + ' bottom: 1.25in\n' + @@ -1177,8 +1177,8 @@ brew`); // Paper Specfications expect(testBrew.bleed.top).toEqual('1.5in'); expect(testBrew.bleed.bottom).toEqual('1.5in'); - expect(testBrew.bleed.left).toEqual('1.5in'); - expect(testBrew.bleed.right).toEqual('1.5in'); + expect(testBrew.bleed.inner).toEqual('1.5in'); + expect(testBrew.bleed.outer).toEqual('1.5in'); expect(testBrew.safetySpace.top).toEqual('1.25in'); expect(testBrew.safetySpace.bottom).toEqual('1.25in'); From f25c5a182d53b9e348f546b0d6afd4f13d5c7ef3 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 4 Jul 2026 15:24:01 -0500 Subject: [PATCH 08/15] Fix Tests, YAML order --- server/homebrew.api.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 02ebbf0c2..8d0bfa9fc 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -404,8 +404,8 @@ theme: phb bleed: top: .125in bottom: .125in - outer: .125in inner: .125in + outer: .125in safetySpace: top: .25in bottom: .25in @@ -447,8 +447,8 @@ theme: phb bleed: top: .125in bottom: .125in - outer: .125in inner: .125in + outer: .125in safetySpace: top: .25in bottom: .25in From 7cc3611e4c6f90f5e409e41ae98c944160dda862 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 17 Jul 2026 20:01:29 -0500 Subject: [PATCH 09/15] Directly access metadata attributes instead of _.picking the object. --- shared/helpers.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/shared/helpers.js b/shared/helpers.js index d074b75ac..ab78caf71 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -97,24 +97,24 @@ const splitTextStyleAndMetadata = (brew)=>{ // Copy Required Bleed Space or Use defaults brew.bleed = { - top : _.pick(metadata, ['bleed']).bleed?.top || '.125in', - bottom : _.pick(metadata, ['bleed']).bleed?.bottom || '.125in', - inner : _.pick(metadata, ['bleed']).bleed?.inner || '.125in', - outer : _.pick(metadata, ['bleed']).bleed?.outer || '.125in', + top : metadata.bleed?.top || '.125in', + bottom : metadata.bleed?.bottom || '.125in', + inner : metadata.bleed?.inner || '.125in', + outer : metadata.bleed?.outer || '.125in', }; // Copy Required Safe Space or Use defaults brew.safetySpace = { - top : _.pick(metadata, ['safetySpace']).safetySpace?.top || '.25in', - bottom : _.pick(metadata, ['safetySpace']).safetySpace?.bottom || '.25in', - outer : _.pick(metadata, ['safetySpace']).safetySpace?.outer || '.25in', - inner : _.pick(metadata, ['safetySpace']).safetySpace?.inner || '.5in', + top : metadata.safetySpace?.top || '.25in', + bottom : metadata.safetySpace?.bottom || '.25in', + outer : metadata.safetySpace?.outer || '.25in', + inner : metadata.safetySpace?.inner || '.5in', }; // Set brew paper trim size or default to US Letter brew.trimSize = { - width : _.pick(metadata, ['trimSize']).trimSize?.width || '8.5in', - height : _.pick(metadata, ['trimSize']).trimSize?.height || '11in', + width : metadata.trimSize?.width || '8.5in', + height : metadata.trimSize?.height || '11in', }; // Set Column specs or use defaults From 6d40525286543c11c6ea99c81ebba9299ebba5ca Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 17 Jul 2026 20:09:26 -0500 Subject: [PATCH 10/15] Remove relocate failover defaults to brewDefaults --- server/brewDefaults.js | 23 +++++++++++++++++++++-- shared/helpers.js | 28 ++++++++++++++-------------- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/server/brewDefaults.js b/server/brewDefaults.js index 501914735..fecdfa052 100644 --- a/server/brewDefaults.js +++ b/server/brewDefaults.js @@ -20,8 +20,27 @@ const DEFAULT_BREW = { published : false, pageCount : 1, gDrive : false, - trashed : false - + trashed : false, + bleed : { + top : '.125in', + bottom : '.125in', + inner : '.125in', + outer : '.125in' + }, + safetySpace : { + top : '.25in', + bottom : '.25in', + outer : '.25in', + inner : '.5in', + }, + trimSize : { + width : '8.5in', + height : '11in', + }, + columns : '2', + columnGutter : '.125in', + license : 'None', + legalAuthors : '' }; // Default values for older brews with missing properties // e.g., missing "renderer" is assumed to be "legacy" diff --git a/shared/helpers.js b/shared/helpers.js index ab78caf71..63d348bb5 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -97,35 +97,35 @@ const splitTextStyleAndMetadata = (brew)=>{ // Copy Required Bleed Space or Use defaults brew.bleed = { - top : metadata.bleed?.top || '.125in', - bottom : metadata.bleed?.bottom || '.125in', - inner : metadata.bleed?.inner || '.125in', - outer : metadata.bleed?.outer || '.125in', + top : metadata.bleed?.top, + bottom : metadata.bleed?.bottom, + inner : metadata.bleed?.inner, + outer : metadata.bleed?.outer, }; // Copy Required Safe Space or Use defaults brew.safetySpace = { - top : metadata.safetySpace?.top || '.25in', - bottom : metadata.safetySpace?.bottom || '.25in', - outer : metadata.safetySpace?.outer || '.25in', - inner : metadata.safetySpace?.inner || '.5in', + top : metadata.safetySpace?.top, + bottom : metadata.safetySpace?.bottom, + outer : metadata.safetySpace?.outer, + inner : metadata.safetySpace?.inner, }; // Set brew paper trim size or default to US Letter brew.trimSize = { - width : metadata.trimSize?.width || '8.5in', - height : metadata.trimSize?.height || '11in', + width : metadata.trimSize?.width, + height : metadata.trimSize?.height, }; // Set Column specs or use defaults - brew.columns = metadata?.columns || 2; - brew.columnGutter = metadata?.columnGutter || '.125in'; + brew.columns = metadata?.columns; + brew.columnGutter = metadata?.columnGutter; // Set License or set to Unlicensed - brew.license = metadata?.license || 'None'; + brew.license = metadata?.license; // Set Authors legal names or to empty. - brew.legalAuthors = metadata.legalAuthors || ''; + brew.legalAuthors = metadata.legalAuthors; brew.text = brew.text.slice(index + 6); } From 4f7c7e1c4b1be3cb21ec9d96ce4e67c1e3836788 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 17 Jul 2026 20:15:06 -0500 Subject: [PATCH 11/15] Remove extra failover values. --- server/homebrew.api.js | 38 +++++++------------------------------- 1 file changed, 7 insertions(+), 31 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 026ff2eda..1995dc07f 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -220,37 +220,13 @@ const api = { const metadata = _.pick(brew, ['title', 'description', 'tags', 'renderer', 'theme']); const snippetsArray = brewSnippetsToJSON('brew_snippets', brew.snippets, null, false).snippets; metadata.snippets = snippetsArray.length > 0 ? snippetsArray : undefined; - - metadata.bleed = { - top : brew?.bleed?.top || '.125in', - bottom : brew?.bleed?.bottom || '.125in', - inner : brew?.bleed?.inner || '.125in', - outer : brew?.bleed?.outer || '.125in', - }; - - // Copy Required Safe Space or Use defaults - metadata.safetySpace = { - top : brew?.safetySpace?.top || '.25in', - bottom : brew?.safetySpace?.bottom || '.25in', - outer : brew?.safetySpace?.outer || '.25in', - inner : brew?.safetySpace?.inner || '.5in', - }; - - // Set brew paper trim size or default to US Letter - metadata.trimSize = { - width : brew?.trimSize?.width || '8.5in', - height : brew?.trimSize?.height || '11in', - }; - - // Set Column specs or use defaults - metadata.columns = brew?.columns || '2'; - metadata.columnGutter = brew?.columnGutter || '.125in'; - - // Set License or set to Unlicensed - metadata.license = brew?.license || 'None'; - - // Set Authors legal names or to empty. - metadata.legalAuthors = brew?.legalAuthors || ''; + metadata.bleed = { top: brew?.bleed?.top, bottom: brew?.bleed?.bottom, inner: brew?.bleed?.inner, outer: brew?.bleed?.outer }; + metadata.safetySpace = { top: brew?.safetySpace?.top, bottom: brew?.safetySpace?.bottom, outer: brew?.safetySpace?.outer, inner: brew?.safetySpace?.inner }; + metadata.trimSize = { width: brew?.trimSize?.width, height: brew?.trimSize?.height }; + metadata.columns = brew?.columns; + metadata.columnGutter = brew?.columnGutter; + metadata.license = brew?.license; + metadata.legalAuthors = brew?.legalAuthors; text = `\`\`\`metadata\n` + `${yaml.dump(metadata)}\n` + From 1472e39bc8b4704b41747296bb151135b7fbbb11 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 17 Jul 2026 20:19:16 -0500 Subject: [PATCH 12/15] Reduce unnecessary linespacing and comments. --- server/brewDefaults.js | 57 ++++++++++++++++-------------------------- shared/helpers.js | 31 +++-------------------- 2 files changed, 25 insertions(+), 63 deletions(-) diff --git a/server/brewDefaults.js b/server/brewDefaults.js index fecdfa052..abf39a86c 100644 --- a/server/brewDefaults.js +++ b/server/brewDefaults.js @@ -2,41 +2,28 @@ import _ from 'lodash'; // Default properties for newly-created brews const DEFAULT_BREW = { - title : '', - text : '', - style : undefined, - description : '', - editId : undefined, - shareId : undefined, - createdAt : undefined, - updatedAt : undefined, - renderer : 'V3', - theme : '5ePHB', - authors : [], - tags : [], - lang : 'en', - thumbnail : '', - views : 0, - published : false, - pageCount : 1, - gDrive : false, - trashed : false, - bleed : { - top : '.125in', - bottom : '.125in', - inner : '.125in', - outer : '.125in' - }, - safetySpace : { - top : '.25in', - bottom : '.25in', - outer : '.25in', - inner : '.5in', - }, - trimSize : { - width : '8.5in', - height : '11in', - }, + title : '', + text : '', + style : undefined, + description : '', + editId : undefined, + shareId : undefined, + createdAt : undefined, + updatedAt : undefined, + renderer : 'V3', + theme : '5ePHB', + authors : [], + tags : [], + lang : 'en', + thumbnail : '', + views : 0, + published : false, + pageCount : 1, + gDrive : false, + trashed : false, + bleed : { top: '.125in', bottom: '.125in', inner: '.125in', outer: '.125in' }, + safetySpace : { top: '.25in', bottom: '.25in', outer: '.25in', inner: '.5in' }, + trimSize : { width: '8.5in', height: '11in' }, columns : '2', columnGutter : '.125in', license : 'None', diff --git a/shared/helpers.js b/shared/helpers.js index 63d348bb5..5800dd563 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -94,37 +94,12 @@ const splitTextStyleAndMetadata = (brew)=>{ Object.assign(brew, _.pick(metadata, ['title', 'description', 'renderer', 'theme', 'lang'])); brew.snippets = yamlSnippetsToText(_.pick(metadata, ['snippets']).snippets || ''); - // Copy Required Bleed Space or Use defaults - - brew.bleed = { - top : metadata.bleed?.top, - bottom : metadata.bleed?.bottom, - inner : metadata.bleed?.inner, - outer : metadata.bleed?.outer, - }; - - // Copy Required Safe Space or Use defaults - brew.safetySpace = { - top : metadata.safetySpace?.top, - bottom : metadata.safetySpace?.bottom, - outer : metadata.safetySpace?.outer, - inner : metadata.safetySpace?.inner, - }; - - // Set brew paper trim size or default to US Letter - brew.trimSize = { - width : metadata.trimSize?.width, - height : metadata.trimSize?.height, - }; - - // Set Column specs or use defaults + brew.bleed = { top: metadata.bleed?.top, bottom: metadata.bleed?.bottom, inner: metadata.bleed?.inner, outer: metadata.bleed?.outer }; + brew.safetySpace = { top: metadata.safetySpace?.top, bottom: metadata.safetySpace?.bottom, outer: metadata.safetySpace?.outer, inner: metadata.safetySpace?.inner }; + brew.trimSize = { width: metadata.trimSize?.width, height: metadata.trimSize?.height }; brew.columns = metadata?.columns; brew.columnGutter = metadata?.columnGutter; - - // Set License or set to Unlicensed brew.license = metadata?.license; - - // Set Authors legal names or to empty. brew.legalAuthors = metadata.legalAuthors; brew.text = brew.text.slice(index + 6); From ed2b24649439b861a04febc2415d724cbadb14e6 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 7 Aug 2026 10:52:14 -0500 Subject: [PATCH 13/15] Change bleed to bleedSize --- server/brewDefaults.js | 2 +- server/homebrew.api.js | 2 +- server/homebrew.api.spec.js | 14 +++++++------- shared/helpers.js | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/server/brewDefaults.js b/server/brewDefaults.js index abf39a86c..cb3114467 100644 --- a/server/brewDefaults.js +++ b/server/brewDefaults.js @@ -21,7 +21,7 @@ const DEFAULT_BREW = { pageCount : 1, gDrive : false, trashed : false, - bleed : { top: '.125in', bottom: '.125in', inner: '.125in', outer: '.125in' }, + bleedSize : { top: '.125in', bottom: '.125in', inner: '.125in', outer: '.125in' }, safetySpace : { top: '.25in', bottom: '.25in', outer: '.25in', inner: '.5in' }, trimSize : { width: '8.5in', height: '11in' }, columns : '2', diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 1995dc07f..b7b73b8dc 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -220,7 +220,7 @@ const api = { const metadata = _.pick(brew, ['title', 'description', 'tags', 'renderer', 'theme']); const snippetsArray = brewSnippetsToJSON('brew_snippets', brew.snippets, null, false).snippets; metadata.snippets = snippetsArray.length > 0 ? snippetsArray : undefined; - metadata.bleed = { top: brew?.bleed?.top, bottom: brew?.bleed?.bottom, inner: brew?.bleed?.inner, outer: brew?.bleed?.outer }; + metadata.bleedSize = { top: brew?.bleedSize?.top, bottom: brew?.bleedSize?.bottom, inner: brew?.bleedSize?.inner, outer: brew?.bleedSize?.outer }; metadata.safetySpace = { top: brew?.safetySpace?.top, bottom: brew?.safetySpace?.bottom, outer: brew?.safetySpace?.outer, inner: brew?.safetySpace?.inner }; metadata.trimSize = { width: brew?.trimSize?.width, height: brew?.trimSize?.height }; metadata.columns = brew?.columns; diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 8d0bfa9fc..1b5f69687 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -401,7 +401,7 @@ tags: - fun renderer: v3 theme: phb -bleed: +bleedSize: top: .125in bottom: .125in inner: .125in @@ -444,7 +444,7 @@ tags: - fun renderer: v3 theme: phb -bleed: +bleedSize: top: .125in bottom: .125in inner: .125in @@ -1137,7 +1137,7 @@ brew`); 'renderer: legacy\n' + 'theme: 5ePHB\n' + 'lang: en\n' + - 'bleed:\n' + + 'bleedSize:\n' + ' top: 1.5in\n' + ' bottom: 1.5in\n' + ' outer: 1.5in\n' + @@ -1175,10 +1175,10 @@ brew`); expect(testBrew.theme).toEqual('5ePHB'); expect(testBrew.lang).toEqual('en'); // Paper Specfications - expect(testBrew.bleed.top).toEqual('1.5in'); - expect(testBrew.bleed.bottom).toEqual('1.5in'); - expect(testBrew.bleed.inner).toEqual('1.5in'); - expect(testBrew.bleed.outer).toEqual('1.5in'); + expect(testBrew.bleedSize.top).toEqual('1.5in'); + expect(testBrew.bleedSize.bottom).toEqual('1.5in'); + expect(testBrew.bleedSize.inner).toEqual('1.5in'); + expect(testBrew.bleedSize.outer).toEqual('1.5in'); expect(testBrew.safetySpace.top).toEqual('1.25in'); expect(testBrew.safetySpace.bottom).toEqual('1.25in'); diff --git a/shared/helpers.js b/shared/helpers.js index 5800dd563..34c0e74bf 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -94,7 +94,7 @@ const splitTextStyleAndMetadata = (brew)=>{ Object.assign(brew, _.pick(metadata, ['title', 'description', 'renderer', 'theme', 'lang'])); brew.snippets = yamlSnippetsToText(_.pick(metadata, ['snippets']).snippets || ''); - brew.bleed = { top: metadata.bleed?.top, bottom: metadata.bleed?.bottom, inner: metadata.bleed?.inner, outer: metadata.bleed?.outer }; + brew.bleedSize = { top: metadata.bleedSize?.top, bottom: metadata.bleedSize?.bottom, inner: metadata.bleedSize?.inner, outer: metadata.bleedSize?.outer }; brew.safetySpace = { top: metadata.safetySpace?.top, bottom: metadata.safetySpace?.bottom, outer: metadata.safetySpace?.outer, inner: metadata.safetySpace?.inner }; brew.trimSize = { width: metadata.trimSize?.width, height: metadata.trimSize?.height }; brew.columns = metadata?.columns; From 02c227b304693ec36797be23a2ebbce713ffe179 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 7 Aug 2026 22:10:08 -0500 Subject: [PATCH 14/15] Fix tests to reflect moving defaults --- server/homebrew.api.spec.js | 106 +++++++++++++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 3 deletions(-) diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 1b5f69687..cae613c6c 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -360,7 +360,27 @@ describe('Tests for api', ()=>{ style : undefined, trashed : false, updatedAt : undefined, - views : 0 + views : 0, + bleedSize: { + top: '.125in', + bottom: '.125in', + inner: '.125in', + outer: '.125in', + }, + columns: '2', + columnGutter: '.125in', + legalAuthors: '', + license: 'None', + safetySpace: { + top: '.25in', + bottom: '.25in', + outer: '.25in', + inner: '.5in', + }, + trimSize: { + width: '8.5in', + height: '11in', + }, }); expect(next).toHaveBeenCalled(); expect(api.getId).toHaveBeenCalledWith(req); @@ -390,7 +410,27 @@ describe('Tests for api', ()=>{ tags : ['something', 'fun'], renderer : 'v3', theme : 'phb', - googleId : '12345' + googleId : '12345', + bleedSize: { + top: '.125in', + bottom: '.125in', + inner: '.125in', + outer: '.125in', + }, + columns: '2', + columnGutter: '.125in', + legalAuthors: '', + license: 'None', + safetySpace: { + top: '.25in', + bottom: '.25in', + outer: '.25in', + inner: '.5in', + }, + trimSize: { + width: '8.5in', + height: '11in', + }, }); expect(result).toEqual(`\`\`\`metadata @@ -434,6 +474,26 @@ brew`); renderer : 'v3', theme : 'phb', googleId : '12345', + bleedSize: { + top: '.125in', + bottom: '.125in', + inner: '.125in', + outer: '.125in', + }, + columns: '2', + columnGutter: '.125in', + legalAuthors: '', + license: 'None', + safetySpace: { + top: '.25in', + bottom: '.25in', + outer: '.25in', + inner: '.5in', + }, + trimSize: { + width: '8.5in', + height: '11in', + }, }); expect(result).toEqual(`\`\`\`metadata @@ -591,7 +651,27 @@ brew`); title : 'asdf', trashed : false, updatedAt : undefined, - views : 0 + views : 0, + bleedSize: { + top: '.125in', + bottom: '.125in', + inner: '.125in', + outer: '.125in', + }, + columns: '2', + columnGutter: '.125in', + legalAuthors: '', + license: 'None', + safetySpace: { + top: '.25in', + bottom: '.25in', + outer: '.25in', + inner: '.5in', + }, + trimSize: { + width: '8.5in', + height: '11in', + }, }); }); @@ -631,6 +711,14 @@ brew`); expect(res.send).toHaveBeenCalledWith({ _id : '1', authors : ['test user'], + bleedSize: { + top: '.125in', + bottom: '.125in', + inner: '.125in', + outer: '.125in', + }, + columns: '2', + columnGutter: '.125in', createdAt : undefined, description : '', editId : expect.any(String), @@ -640,6 +728,14 @@ brew`); renderer : 'V3', lang : 'en', shareId : expect.any(String), + legalAuthors: '', + license: 'None', + safetySpace: { + top: '.25in', + bottom: '.25in', + outer: '.25in', + inner: '.5in', + }, googleId : expect.any(String), style : undefined, tags : [], @@ -649,6 +745,10 @@ brew`); thumbnail : '', title : 'asdf', trashed : false, + trimSize: { + width: '8.5in', + height: '11in', + }, updatedAt : undefined, views : 0 }); From 002e03b572faa76b01b78a1df26fe3857068588e Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 21 Aug 2026 11:59:38 -0500 Subject: [PATCH 15/15] Convert literal member copies to spread operators for simplicity and future-proofing --- package-lock.json | 16 ---------------- shared/helpers.js | 6 +++--- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 21e46a992..a4701ccac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10862,22 +10862,6 @@ "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose/node_modules/gcp-metadata": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", - "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/mongoose/node_modules/mongodb": { "version": "7.5.0", "license": "Apache-2.0", diff --git a/shared/helpers.js b/shared/helpers.js index 91983882c..667d7b6b1 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -94,9 +94,9 @@ const splitTextStyleAndMetadata = (brew)=>{ Object.assign(brew, _.pick(metadata, ['title', 'description', 'renderer', 'theme', 'lang'])); brew.snippets = yamlSnippetsToText(_.pick(metadata, ['snippets']).snippets || ''); - brew.bleedSize = { top: metadata.bleedSize?.top, bottom: metadata.bleedSize?.bottom, inner: metadata.bleedSize?.inner, outer: metadata.bleedSize?.outer }; - brew.safetySpace = { top: metadata.safetySpace?.top, bottom: metadata.safetySpace?.bottom, outer: metadata.safetySpace?.outer, inner: metadata.safetySpace?.inner }; - brew.trimSize = { width: metadata.trimSize?.width, height: metadata.trimSize?.height }; + brew.bleedSize = { ...metadata.bleedSize }; + brew.safetySpace = { ...metadata.safetySpace }; + brew.trimSize = { ...metadata.trimSize }; brew.columns = metadata?.columns; brew.columnGutter = metadata?.columnGutter; brew.license = metadata?.license;