From 854c21639a1b30085613ed31439042554d0bdf82 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 20 Jan 2024 11:58:17 -0600 Subject: [PATCH 001/239] CSS based ToC exclusion system either I am building the lookup incorrectly or Chrome is not letting me see variables via computedStyles. --- .../V3/5ePHB/snippets/tableOfContents.gen.js | 47 ++++++++++++------- themes/V3/5ePHB/style.less | 3 ++ 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 97d82ed40..1be583ba1 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -1,7 +1,7 @@ const _ = require('lodash'); const dedent = require('dedent-tabs').default; -const getTOC = (pages)=>{ +const getTOC = ()=>{ const add1 = (title, page)=>{ res.push({ title : title, @@ -27,32 +27,45 @@ const getTOC = (pages)=>{ }); }; + const getParentPageNumber = (e)=>{ + let tE = e; + while (tE?.tagName != 'BODY') { + if((tE.className == 'page') || (tE.className.split(' ')?.includes('Page'))) { + // Test for excluded pages here. + return parseInt(tE.id.replace(/^p/, '')); + } + tE = tE.parentElement; + } + return -1; + }; + const res = []; - _.each(pages, (page, pageNum)=>{ - if(!page.includes("{{frontCover}}") && !page.includes("{{insideCover}}") && !page.includes("{{partCover}}") && !page.includes("{{backCover}}")) { - const lines = page.split('\n'); - _.each(lines, (line)=>{ - if(_.startsWith(line, '# ')){ - const title = line.replace('# ', ''); - add1(title, pageNum); + const iframe = document.getElementById('BrewRenderer'); + const iframeDocument = iframe.contentDocument || iframe.contentWindow.document; + const headings = iframeDocument.querySelectorAll('h1, h2, h3'); + + _.each(headings, (heading)=>{ + const onPage = getParentPageNumber(heading); + if(getComputedStyle(heading).getPropertyValue('--TOC') != 'exclude') { + if(onPage != -1) { + const headingText = heading.innerText; + if(heading.tagName == 'H1') { + add1(headingText, onPage); } - if(_.startsWith(line, '## ')){ - const title = line.replace('## ', ''); - add2(title, pageNum); + if(heading.tagName == 'H2') { + add2(headingText, onPage); } - if(_.startsWith(line, '### ')){ - const title = line.replace('### ', ''); - add3(title, pageNum); + if(heading.tagName == 'H3') { + add3(headingText, onPage); } - }); + } } }); return res; }; module.exports = function(props){ - const pages = props.brew.text.split('\\page'); - const TOC = getTOC(pages); + const TOC = getTOC(); const markdown = _.reduce(TOC, (r, g1, idx1)=>{ if(g1.title !== null) { r.push(`- ### [{{ ${g1.title}}}{{ ${g1.page}}}](#p${g1.page})`); diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 6c6634ce7..fba45df42 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -314,6 +314,7 @@ border-image : @monsterBorderImage 14 round; border-image-outset : 0px 2px; box-shadow : 1px 4px 14px #888888; + --TOC : "exclude"; } position : relative; @@ -329,11 +330,13 @@ margin-bottom : 0; font-size : 0.304cm; //Monster size and type subtext } + --TOC : "exclude"; } h3 { font-family : 'ScalySansSmallCapsRemake'; font-size : 0.45cm; border-bottom : 1.5px solid var(--HB_Color_HeaderText); + --TOC : "exclude"; } //Triangle dividers From 622827efda8de694d1fd428ef5cdcb073b717133 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 20 Jan 2024 20:47:27 -0600 Subject: [PATCH 002/239] Fix Exclusion examination --- themes/V3/5ePHB/snippets/tableOfContents.gen.js | 17 +++-------------- themes/V3/5ePHB/style.less | 10 ++++++++++ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 1be583ba1..c6ac0671d 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -27,26 +27,15 @@ const getTOC = ()=>{ }); }; - const getParentPageNumber = (e)=>{ - let tE = e; - while (tE?.tagName != 'BODY') { - if((tE.className == 'page') || (tE.className.split(' ')?.includes('Page'))) { - // Test for excluded pages here. - return parseInt(tE.id.replace(/^p/, '')); - } - tE = tE.parentElement; - } - return -1; - }; - const res = []; const iframe = document.getElementById('BrewRenderer'); const iframeDocument = iframe.contentDocument || iframe.contentWindow.document; const headings = iframeDocument.querySelectorAll('h1, h2, h3'); _.each(headings, (heading)=>{ - const onPage = getParentPageNumber(heading); - if(getComputedStyle(heading).getPropertyValue('--TOC') != 'exclude') { + const onPage = parseInt(heading.closest('.page,.phb').id.replace(/^p/, '')); + const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC'); + if(ToCExclude != '"exclude"') { if(onPage != -1) { const headingText = heading.innerText; if(heading.tagName == 'H1') { diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index fba45df42..03dc021c7 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -799,6 +799,16 @@ // ***************************** // * TABLE OF CONTENTS // *****************************/ + +.page:has(.frontCover), +.page:has(.backCover), +.page:has(.insideCover), +.page:has(.partCover), +.monster h3, +.monster h4, +h5, h6, +.toc { --TOC: exclude; } + .page { &:has(.toc)::after { display : none; } .toc { From 26c4b1afa6ccd4c061a7fdd4c2698a0f7742b0e8 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sun, 21 Jan 2024 08:58:14 -0600 Subject: [PATCH 003/239] Add toggle-on classes. --- themes/V3/5ePHB/style.less | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 03dc021c7..5c7771350 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -314,7 +314,6 @@ border-image : @monsterBorderImage 14 round; border-image-outset : 0px 2px; box-shadow : 1px 4px 14px #888888; - --TOC : "exclude"; } position : relative; @@ -330,13 +329,11 @@ margin-bottom : 0; font-size : 0.304cm; //Monster size and type subtext } - --TOC : "exclude"; } h3 { font-family : 'ScalySansSmallCapsRemake'; font-size : 0.45cm; border-bottom : 1.5px solid var(--HB_Color_HeaderText); - --TOC : "exclude"; } //Triangle dividers @@ -800,15 +797,22 @@ // * TABLE OF CONTENTS // *****************************/ +// Default Exclusions .page:has(.frontCover), .page:has(.backCover), .page:has(.insideCover), .page:has(.partCover), -.monster h3, -.monster h4, -h5, h6, +.monster, +.noToC, .toc { --TOC: exclude; } +// Manual Inclusion classes + +.addToC, +.addh1, .addh2, .addh3, .addh4, .addh5, .addh6, .addh1h2 h1, .addh1h2 h2, +.addh1h3 h1, .addh1h3 h2, .addh1h3 h3, .addh1h4 h1, .addh1h4 h2, .addh1h4 h3, .addh1h4 h4, +.addh1h5 h1, .addh1h5 h2, .addh1h5 h3, .addh1h5 h4, .addh1h5 h5 { --TOC: include; } + .page { &:has(.toc)::after { display : none; } .toc { From b8ee696b69cd676c3adb4982c773e8f543fa5358 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 24 Jan 2024 15:42:22 -0600 Subject: [PATCH 004/239] Add manual exclusion classes for ToC exclusion. --- themes/V3/5ePHB/style.less | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 5c7771350..a06817566 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -813,6 +813,11 @@ .addh1h3 h1, .addh1h3 h2, .addh1h3 h3, .addh1h4 h1, .addh1h4 h2, .addh1h4 h3, .addh1h4 h4, .addh1h5 h1, .addh1h5 h2, .addh1h5 h3, .addh1h5 h4, .addh1h5 h5 { --TOC: include; } +// Manual Exclusion classes +.noh1, .noh2, .noh3, .noh4, .noh5, .noh6, .noh1h2 h1, .noh1h2 h2, +.noh1h3 h1, .noh1h3 h2, .noh1h3 h3, .noh1h4 h1, .noh1h4 h2, .noh1h4 h3, .noh1h4 h4, +.noh1h5 h1, .noh1h5 h2, .noh1h5 h3, .noh1h5 h4, .noh1h5 h5 { --TOC: exclude; } + .page { &:has(.toc)::after { display : none; } .toc { From 85caf0a892644e6bf85129b1a763323334025f4f Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 29 Jan 2024 20:14:52 -0600 Subject: [PATCH 005/239] Add fixes to account for no page numbers Clear out manual toggles. --- themes/V3/5ePHB/snippets/tableOfContents.gen.js | 4 ++-- themes/V3/5ePHB/style.less | 12 ------------ 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index c6ac0671d..150b67c30 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -33,10 +33,10 @@ const getTOC = ()=>{ const headings = iframeDocument.querySelectorAll('h1, h2, h3'); _.each(headings, (heading)=>{ - const onPage = parseInt(heading.closest('.page,.phb').id.replace(/^p/, '')); + const onPage = parseInt(heading.closest('.page,.phb').id?.replace(/^p/, '')); const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC'); if(ToCExclude != '"exclude"') { - if(onPage != -1) { + if(!isNaN(onPage)) { const headingText = heading.innerText; if(heading.tagName == 'H1') { add1(headingText, onPage); diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index a06817566..1047ed729 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -806,18 +806,6 @@ .noToC, .toc { --TOC: exclude; } -// Manual Inclusion classes - -.addToC, -.addh1, .addh2, .addh3, .addh4, .addh5, .addh6, .addh1h2 h1, .addh1h2 h2, -.addh1h3 h1, .addh1h3 h2, .addh1h3 h3, .addh1h4 h1, .addh1h4 h2, .addh1h4 h3, .addh1h4 h4, -.addh1h5 h1, .addh1h5 h2, .addh1h5 h3, .addh1h5 h4, .addh1h5 h5 { --TOC: include; } - -// Manual Exclusion classes -.noh1, .noh2, .noh3, .noh4, .noh5, .noh6, .noh1h2 h1, .noh1h2 h2, -.noh1h3 h1, .noh1h3 h2, .noh1h3 h3, .noh1h4 h1, .noh1h4 h2, .noh1h4 h3, .noh1h4 h4, -.noh1h5 h1, .noh1h5 h2, .noh1h5 h3, .noh1h5 h4, .noh1h5 h5 { --TOC: exclude; } - .page { &:has(.toc)::after { display : none; } .toc { From a3b1d7fb7cc7a1f9db5c7c6cfab3924c4e6d10b6 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 17 Feb 2024 11:01:21 -0600 Subject: [PATCH 006/239] Use a brew as a theme, three ways. This has been implemented three different ways to allow for comparison and discussion - /api/css/:id : This returns the style frontmatter of the referenced document as a text/css document. /api/theme/:id : This returns an object with the reference'd object's theme and style frontmatter. /api/csstheme/:id : This returns the stylye frontmatter of the referenced document as a text/css document and adds the theme as an @import ( if not using the legacy renderer ) --- server/homebrew.api.js | 58 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 20e13ec71..a972895ae 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -205,6 +205,60 @@ const api = { res.status(200).send(saved); }, + getBrewTheme : async (req, res)=>{ + req.brew.text = req.brew.text.replaceAll('\r\n', '\n'); + if(req.brew.text.startsWith('```metadata')) { + const index = req.brew.text.indexOf('```\n\n'); + const metadataSection = req.brew.text.slice(12, index - 1); + const metadata = yaml.load(metadataSection); + Object.assign(req.brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer', 'theme', 'lang'])); + req.brew.text = req.brew.text.slice(index + 5); + } + if(req.brew.text.startsWith('```css')) { + const index = req.brew.text.indexOf('```\n\n'); + req.brew.style = req.brew.text.slice(7, index - 1); + req.brew.text = req.brew.text.slice(index + 5); + } + return res.status(200).send(JSON.stringify({ + parent : req.brew.theme, + theme : req.brew.style + })); + }, + getBrewThemeAsCSS : async (req, res)=>{ + req.brew.text = req.brew.text.replaceAll('\r\n', '\n'); + if(req.brew.text.startsWith('```metadata')) { + const index = req.brew.text.indexOf('```\n\n'); + const metadataSection = req.brew.text.slice(12, index - 1); + const metadata = yaml.load(metadataSection); + Object.assign(req.brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer', 'theme', 'lang'])); + req.brew.text = req.brew.text.slice(index + 5); + } + if(req.brew.text.startsWith('```css')) { + const index = req.brew.text.indexOf('```\n\n'); + req.brew.style = req.brew.text.slice(7, index - 1); + req.brew.text = req.brew.text.slice(index + 5); + } + res.setHeader('Content-Type', 'text/css'); + return res.status(200).send(req.brew.style); + }, + getBrewThemeWithCSS : async (req, res)=>{ + req.brew.text = req.brew.text.replaceAll('\r\n', '\n'); + if(req.brew.text.startsWith('```metadata')) { + const index = req.brew.text.indexOf('```\n\n'); + const metadataSection = req.brew.text.slice(12, index - 1); + const metadata = yaml.load(metadataSection); + Object.assign(req.brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer', 'theme', 'lang'])); + req.brew.text = req.brew.text.slice(index + 5); + } + if(req.brew.text.startsWith('```css')) { + const index = req.brew.text.indexOf('```\n\n'); + req.brew.style = req.brew.text.slice(7, index - 1); + req.brew.text = req.brew.text.slice(index + 5); + } + res.setHeader('Content-Type', 'text/css'); + const parentThemeImport = `@import /themes/${req.brew.renderer}/${req.brew.theme}/styles.css\n\n`; + return res.status(200).send(`${req.brew.renderer != 'legacy' ? '' : parentThemeImport}${req.brew.style}`); + }, updateBrew : async (req, res)=>{ // Initialize brew from request and body, destructure query params, and set the initial value for the after-save method const brewFromClient = api.excludePropsFromUpdate(req.body); @@ -365,5 +419,9 @@ router.put('/api/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api router.put('/api/update/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.updateBrew)); router.delete('/api/:id', asyncHandler(api.deleteBrew)); router.get('/api/remove/:id', asyncHandler(api.deleteBrew)); +router.get('/api/theme/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.getBrewTheme)); +router.get('/api/css/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.getBrewThemeAsCSS)); +router.get('/api/csstheme/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.getBrewThemeWithCSS)); + module.exports = api; From 8e48df5de16f02edeb3488f21db759409351101d Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sun, 18 Feb 2024 12:45:14 -0600 Subject: [PATCH 007/239] Partial Code coverage for new endpoints --- server/homebrew.api.js | 14 +++++--- server/homebrew.api.spec.js | 72 +++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 5 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index a972895ae..49ab43893 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -219,10 +219,10 @@ const api = { req.brew.style = req.brew.text.slice(7, index - 1); req.brew.text = req.brew.text.slice(index + 5); } - return res.status(200).send(JSON.stringify({ + return res.status(200).send({ parent : req.brew.theme, theme : req.brew.style - })); + }); }, getBrewThemeAsCSS : async (req, res)=>{ req.brew.text = req.brew.text.replaceAll('\r\n', '\n'); @@ -238,7 +238,9 @@ const api = { req.brew.style = req.brew.text.slice(7, index - 1); req.brew.text = req.brew.text.slice(index + 5); } - res.setHeader('Content-Type', 'text/css'); + if(res.hasOwnProperty('set')) { + res.set('Content-Type', 'text/css'); + } return res.status(200).send(req.brew.style); }, getBrewThemeWithCSS : async (req, res)=>{ @@ -255,9 +257,11 @@ const api = { req.brew.style = req.brew.text.slice(7, index - 1); req.brew.text = req.brew.text.slice(index + 5); } - res.setHeader('Content-Type', 'text/css'); + if(res.hasOwnProperty('set')) { + res.set('Content-Type', 'text/css'); + } const parentThemeImport = `@import /themes/${req.brew.renderer}/${req.brew.theme}/styles.css\n\n`; - return res.status(200).send(`${req.brew.renderer != 'legacy' ? '' : parentThemeImport}${req.brew.style}`); + return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}${req.brew.style}`); }, updateBrew : async (req, res)=>{ // Initialize brew from request and body, destructure query params, and set the initial value for the after-save method diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 55a8c414f..cc8ae8044 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -569,6 +569,78 @@ brew`); }); }); + describe('getBrewTheme', ()=>{ + it('should collect parent theme and brew style', async ()=>{ + const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); + model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', style: 'I Have a style!' })); + const brewResults = { + authors : [], + createdAt : undefined, + description : '', + editId : undefined, + gDrive : false, + lang : 'en', + pageCount : 1, + published : false, + renderer : 'legacy', + shareId : undefined, + style : 'I Have a style!', + systems : [], + tags : [], + text : '', + theme : '5ePHB', + thumbnail : '', + title : 'test brew', + trashed : false, + updatedAt : undefined, + views : 0 + }; + const fn = api.getBrew('share', true); + const req = { brew: {} }; + const next = jest.fn(); + await fn(req, null, next); + + api.getBrewTheme(req, res); + const sent = res.send.mock.calls[0][0]; + expect(req.brew).toStrictEqual(brewResults); + expect(res.status).toHaveBeenCalledWith(200); + expect(sent.parent).toBe('5ePHB'); + expect(sent.theme).toBe('I Have a style!'); + }); + }); + + describe('getBrewAsThemeCSS', ()=>{ + it('should collect the brew style - returning as css', async ()=>{ + const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); + model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', style: 'I Have a style!' })); + const fn = api.getBrew('share', true); + const req = { brew: {} }; + const next = jest.fn(); + await fn(req, null, next); + + api.getBrewThemeAsCSS(req, res); + const sent = res.send.mock.calls[0][0]; + expect(sent).toBe('I Have a style!'); + expect(res.status).toHaveBeenCalledWith(200); + }); + }); + + describe('getBrewThemeWithCSS', ()=>{ + it('should collect parent theme and brew style - returning as css with parent imported.', async ()=>{ + const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); + model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', renderer: 'V3', style: 'I Have a style!' })); + const fn = api.getBrew('share', true); + const req = { brew: {} }; + const next = jest.fn(); + await fn(req, null, next); + + api.getBrewThemeWithCSS(req, res); + const sent = res.send.mock.calls[0][0]; + expect(sent).toBe(`@import /themes/V3/5ePHB/styles.css\n\nI Have a style!`); + expect(res.status).toHaveBeenCalledWith(200); + }); + }); + describe('deleteBrew', ()=>{ it('should handle case where fetching the brew returns an error', async ()=>{ api.getBrew = jest.fn(()=>async ()=>{ throw { message: 'err', HBErrorCode: '02' }; }); From e2ef9b812245a8d4528089ecc0387153ac2e59ce Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 20 Feb 2024 16:44:17 -0600 Subject: [PATCH 008/239] Report Theme title with CSS This adds a comment/field ( depending on endpoint ) that reports the name of the Brew being used as a theming source. --- server/homebrew.api.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 49ab43893..e99b1b1d9 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -220,8 +220,9 @@ const api = { req.brew.text = req.brew.text.slice(index + 5); } return res.status(200).send({ - parent : req.brew.theme, - theme : req.brew.style + parent : req.brew.theme, + theme : req.brew.style, + themeName : req.brew.title }); }, getBrewThemeAsCSS : async (req, res)=>{ @@ -241,7 +242,7 @@ const api = { if(res.hasOwnProperty('set')) { res.set('Content-Type', 'text/css'); } - return res.status(200).send(req.brew.style); + return res.status(200).send(`// From Theme: ${req.brew.title}\n\n${req.brew.style}`); }, getBrewThemeWithCSS : async (req, res)=>{ req.brew.text = req.brew.text.replaceAll('\r\n', '\n'); @@ -260,7 +261,7 @@ const api = { if(res.hasOwnProperty('set')) { res.set('Content-Type', 'text/css'); } - const parentThemeImport = `@import /themes/${req.brew.renderer}/${req.brew.theme}/styles.css\n\n`; + const parentThemeImport = `// From Theme: ${req.brew.title}\n\n@import /themes/${req.brew.renderer}/${req.brew.theme}/styles.css\n\n`; return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}${req.brew.style}`); }, updateBrew : async (req, res)=>{ From c319d6bcfa45f9ee6b9fecbdba4d3e17fcbec695 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 20 Feb 2024 23:15:37 -0600 Subject: [PATCH 009/239] Consolidate and add theme parent walking This consolidates the style/theme endpoint to a singular method, adds interpretation of static themes, and allow parent theme recursion. I am not 100% sure this will order styles correctly. --- server/homebrew.api.js | 106 +++++++++++++++----------------- server/homebrew.api.spec.js | 118 ++++++++++++++++++------------------ 2 files changed, 108 insertions(+), 116 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index e99b1b1d9..f77c429e2 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -11,6 +11,19 @@ const { nanoid } = require('nanoid'); const { DEFAULT_BREW, DEFAULT_BREW_LOAD } = require('./brewDefaults.js'); +const themes = require('../themes/themes.json'); + +const isStaticTheme = (engine, themeName)=>{ + if(!themes.hasOwnProperty(engine)) { + return undefined; + } + if(themes[engine].hasOwnProperty(themeName)) { + return themes[engine][themeName].baseTheme; + } else { + return undefined; + } +}; + // const getTopBrews = (cb) => { // HomebrewModel.find().sort({ views: -1 }).limit(5).exec(function(err, brews) { // cb(brews); @@ -19,6 +32,22 @@ const { DEFAULT_BREW, DEFAULT_BREW_LOAD } = require('./brewDefaults.js'); const MAX_TITLE_LENGTH = 100; +const splitTextStyleAndMetadata = (brew)=>{ + brew.text = brew.text.replaceAll('\r\n', '\n'); + if(brew.text.startsWith('```metadata')) { + const index = brew.text.indexOf('```\n\n'); + const metadataSection = brew.text.slice(12, index - 1); + const metadata = yaml.load(metadataSection); + Object.assign(brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer', 'theme', 'lang'])); + brew.text = brew.text.slice(index + 5); + } + if(brew.text.startsWith('```css')) { + const index = brew.text.indexOf('```\n\n'); + brew.style = brew.text.slice(7, index - 1); + brew.text = brew.text.slice(index + 5); + } +}; + const api = { homebrewApi : router, getId : (req)=>{ @@ -40,6 +69,7 @@ const api = { getBrew : (accessType, stubOnly = false)=>{ // Create middleware with the accessType passed in as part of the scope return async (req, res, next)=>{ + // Get relevant IDs for the brew const { id, googleId } = api.getId(req); @@ -205,65 +235,29 @@ const api = { res.status(200).send(saved); }, - getBrewTheme : async (req, res)=>{ - req.brew.text = req.brew.text.replaceAll('\r\n', '\n'); - if(req.brew.text.startsWith('```metadata')) { - const index = req.brew.text.indexOf('```\n\n'); - const metadataSection = req.brew.text.slice(12, index - 1); - const metadata = yaml.load(metadataSection); - Object.assign(req.brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer', 'theme', 'lang'])); - req.brew.text = req.brew.text.slice(index + 5); - } - if(req.brew.text.startsWith('```css')) { - const index = req.brew.text.indexOf('```\n\n'); - req.brew.style = req.brew.text.slice(7, index - 1); - req.brew.text = req.brew.text.slice(index + 5); - } - return res.status(200).send({ - parent : req.brew.theme, - theme : req.brew.style, - themeName : req.brew.title - }); - }, - getBrewThemeAsCSS : async (req, res)=>{ - req.brew.text = req.brew.text.replaceAll('\r\n', '\n'); - if(req.brew.text.startsWith('```metadata')) { - const index = req.brew.text.indexOf('```\n\n'); - const metadataSection = req.brew.text.slice(12, index - 1); - const metadata = yaml.load(metadataSection); - Object.assign(req.brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer', 'theme', 'lang'])); - req.brew.text = req.brew.text.slice(index + 5); - } - if(req.brew.text.startsWith('```css')) { - const index = req.brew.text.indexOf('```\n\n'); - req.brew.style = req.brew.text.slice(7, index - 1); - req.brew.text = req.brew.text.slice(index + 5); - } - if(res.hasOwnProperty('set')) { - res.set('Content-Type', 'text/css'); - } - return res.status(200).send(`// From Theme: ${req.brew.title}\n\n${req.brew.style}`); - }, getBrewThemeWithCSS : async (req, res)=>{ - req.brew.text = req.brew.text.replaceAll('\r\n', '\n'); - if(req.brew.text.startsWith('```metadata')) { - const index = req.brew.text.indexOf('```\n\n'); - const metadataSection = req.brew.text.slice(12, index - 1); - const metadata = yaml.load(metadataSection); - Object.assign(req.brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer', 'theme', 'lang'])); - req.brew.text = req.brew.text.slice(index + 5); - } - if(req.brew.text.startsWith('```css')) { - const index = req.brew.text.indexOf('```\n\n'); - req.brew.style = req.brew.text.slice(7, index - 1); - req.brew.text = req.brew.text.slice(index + 5); - } + const brew = req.brew; + splitTextStyleAndMetadata(brew); if(res.hasOwnProperty('set')) { res.set('Content-Type', 'text/css'); } - const parentThemeImport = `// From Theme: ${req.brew.title}\n\n@import /themes/${req.brew.renderer}/${req.brew.theme}/styles.css\n\n`; + const staticTheme = `/api/css/${req.brew.renderer}/${req.brew.theme}/styles.css`; + const userTheme = `/api/css/${req.brew.theme.slice(1)}`; + const parentThemeImport = `// From Theme: ${req.brew.title}\n\n@import ${req.brew.theme[0] != '#' ? staticTheme : userTheme}\n\n`; return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}${req.brew.style}`); }, + getStaticTheme : async(req, res)=>{ + const themeParent = isStaticTheme(req.params.engine, req.params.id); + if(themeParent === undefined){ + res.status(404).send(`Invalid Theme - Engine: ${req.params.engine}, Name: ${req.params.id}`); + } else { + if(res.hasOwnProperty('set')) { + res.set('Content-Type', 'text/css'); + } + const parentTheme = themeParent ? `@import /api/css/${req.params.engine}/${themeParent}\n` : ''; + return res.status(200).send(`${parentTheme}@import /themes/${req.params.engine}/${req.params.id}\n`); + } + }, updateBrew : async (req, res)=>{ // Initialize brew from request and body, destructure query params, and set the initial value for the after-save method const brewFromClient = api.excludePropsFromUpdate(req.body); @@ -424,9 +418,7 @@ router.put('/api/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api router.put('/api/update/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.updateBrew)); router.delete('/api/:id', asyncHandler(api.deleteBrew)); router.get('/api/remove/:id', asyncHandler(api.deleteBrew)); -router.get('/api/theme/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.getBrewTheme)); -router.get('/api/css/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.getBrewThemeAsCSS)); -router.get('/api/csstheme/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.getBrewThemeWithCSS)); - +router.get('/api/css/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.getBrewThemeWithCSS)); +router.get('/api/css/:engine/:id/', asyncHandler(api.getStaticTheme)); module.exports = api; diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index cc8ae8044..760e1ae75 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -569,64 +569,8 @@ brew`); }); }); - describe('getBrewTheme', ()=>{ - it('should collect parent theme and brew style', async ()=>{ - const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); - model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', style: 'I Have a style!' })); - const brewResults = { - authors : [], - createdAt : undefined, - description : '', - editId : undefined, - gDrive : false, - lang : 'en', - pageCount : 1, - published : false, - renderer : 'legacy', - shareId : undefined, - style : 'I Have a style!', - systems : [], - tags : [], - text : '', - theme : '5ePHB', - thumbnail : '', - title : 'test brew', - trashed : false, - updatedAt : undefined, - views : 0 - }; - const fn = api.getBrew('share', true); - const req = { brew: {} }; - const next = jest.fn(); - await fn(req, null, next); - - api.getBrewTheme(req, res); - const sent = res.send.mock.calls[0][0]; - expect(req.brew).toStrictEqual(brewResults); - expect(res.status).toHaveBeenCalledWith(200); - expect(sent.parent).toBe('5ePHB'); - expect(sent.theme).toBe('I Have a style!'); - }); - }); - - describe('getBrewAsThemeCSS', ()=>{ - it('should collect the brew style - returning as css', async ()=>{ - const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); - model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', style: 'I Have a style!' })); - const fn = api.getBrew('share', true); - const req = { brew: {} }; - const next = jest.fn(); - await fn(req, null, next); - - api.getBrewThemeAsCSS(req, res); - const sent = res.send.mock.calls[0][0]; - expect(sent).toBe('I Have a style!'); - expect(res.status).toHaveBeenCalledWith(200); - }); - }); - - describe('getBrewThemeWithCSS', ()=>{ - it('should collect parent theme and brew style - returning as css with parent imported.', async ()=>{ + describe('getBrewThemeWithStaticParent', ()=>{ + it('should collect parent theme and brew style - returning as css with static parent imported.', async ()=>{ const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', renderer: 'V3', style: 'I Have a style!' })); const fn = api.getBrew('share', true); @@ -636,11 +580,67 @@ brew`); api.getBrewThemeWithCSS(req, res); const sent = res.send.mock.calls[0][0]; - expect(sent).toBe(`@import /themes/V3/5ePHB/styles.css\n\nI Have a style!`); + expect(sent).toBe(`// From Theme: test brew\n\n@import /api/css/V3/5ePHB/styles.css\n\nI Have a style!`); expect(res.status).toHaveBeenCalledWith(200); }); }); + describe('getBrewThemeWithUserParent', ()=>{ + it('should collect parent theme and brew style - returning as css with user-theme parent imported.', async ()=>{ + const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); + model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', renderer: 'V3', theme: '#IamATheme', style: 'I Have a style!' })); + const fn = api.getBrew('share', true); + const req = { brew: {} }; + const next = jest.fn(); + await fn(req, null, next); + + api.getBrewThemeWithCSS(req, res); + const sent = res.send.mock.calls[0][0]; + expect(sent).toBe(`// From Theme: test brew\n\n@import /api/css/IamATheme\n\nI Have a style!`); + expect(res.status).toHaveBeenCalledWith(200); + }); + }); + + describe('getStaticTheme', ()=>{ + it('should return an import of the theme without including a parent.', async ()=>{ + const req = { + params : { + engine : 'V3', + id : '5ePHB' + } + }; + api.getStaticTheme(req, res); + const sent = res.send.mock.calls[0][0]; + expect(sent).toBe('@import /themes/V3/5ePHB\n'); + expect(res.status).toHaveBeenCalledWith(200); + }); + it('should return an import of the theme including a parent.', async ()=>{ + const req = { + params : { + engine : 'V3', + id : '5eDMG' + } + }; + api.getStaticTheme(req, res); + const sent = res.send.mock.calls[0][0]; + expect(sent).toBe('@import /api/css/V3/5ePHB\n@import /themes/V3/5eDMG\n'); + expect(res.status).toHaveBeenCalledWith(200); + }); + it('should fail for an invalid static theme.', async()=>{ + const req = { + params : { + engine : 'V3', + id : '5eDMGGGG' + } + }; + api.getStaticTheme(req, res); + const sent = res.send.mock.calls[0][0]; + expect(sent).toBe('Invalid Theme - Engine: V3, Name: 5eDMGGGG'); + expect(res.status).toHaveBeenCalledWith(404); + }); + }); + + describe('deleteBrew', ()=>{ it('should handle case where fetching the brew returns an error', async ()=>{ api.getBrew = jest.fn(()=>async ()=>{ throw { message: 'err', HBErrorCode: '02' }; }); From ae2bb3a02857bba2ff0b74d55c19866e91908661 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 20 Feb 2024 23:26:09 -0600 Subject: [PATCH 010/239] Add missing style.css --- server/homebrew.api.js | 2 +- server/homebrew.api.spec.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index f77c429e2..36b885cb0 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -255,7 +255,7 @@ const api = { res.set('Content-Type', 'text/css'); } const parentTheme = themeParent ? `@import /api/css/${req.params.engine}/${themeParent}\n` : ''; - return res.status(200).send(`${parentTheme}@import /themes/${req.params.engine}/${req.params.id}\n`); + return res.status(200).send(`${parentTheme}@import /themes/${req.params.engine}/${req.params.id}/style.css\n`); } }, updateBrew : async (req, res)=>{ diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 760e1ae75..c82ce5227 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -611,7 +611,7 @@ brew`); }; api.getStaticTheme(req, res); const sent = res.send.mock.calls[0][0]; - expect(sent).toBe('@import /themes/V3/5ePHB\n'); + expect(sent).toBe('@import /themes/V3/5ePHB/style.css\n'); expect(res.status).toHaveBeenCalledWith(200); }); it('should return an import of the theme including a parent.', async ()=>{ @@ -623,7 +623,7 @@ brew`); }; api.getStaticTheme(req, res); const sent = res.send.mock.calls[0][0]; - expect(sent).toBe('@import /api/css/V3/5ePHB\n@import /themes/V3/5eDMG\n'); + expect(sent).toBe('@import /api/css/V3/5ePHB\n@import /themes/V3/5eDMG/style.css\n'); expect(res.status).toHaveBeenCalledWith(200); }); it('should fail for an invalid static theme.', async()=>{ From f60090e5fa866be8e5e5124f802c02e91185e942 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Thu, 22 Feb 2024 21:12:56 -0600 Subject: [PATCH 011/239] Update Theme Picker to use Brews tagged as a theme This updates the theme picker to include brews tagged as themes owned by the user. Some supporting functions were updated. User themes are loaded on /edit and added to the request. --- .../editor/metadataEditor/metadataEditor.jsx | 16 ++++++--- config/default.json | 1 + server/app.js | 33 ++++++++++++++++++- server/homebrew.model.js | 4 +-- 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 074879b05..58c44ded9 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -8,6 +8,8 @@ const request = require('../../utils/request-middleware.js'); const Nav = require('naturalcrit/nav/nav.jsx'); const Combobox = require('client/components/combobox.jsx'); const StringArrayEditor = require('../stringArrayEditor/stringArrayEditor.jsx'); +const HomebrewModel = require('../../../../server/homebrew.model.js').model; + const Themes = require('themes/themes.json'); const validations = require('./validations.js'); @@ -192,20 +194,23 @@ const MetadataEditor = createClass({ renderThemeDropdown : function(){ if(!global.enable_themes) return; + const mergedThemes = { ...Themes, ...this.props.metadata.userThemes }; + const listThemes = (renderer)=>{ - return _.map(_.values(Themes[renderer]), (theme)=>{ - return
this.handleTheme(theme)} title={''}> - {`${theme.renderer} : ${theme.name}`} + return _.map(_.values(mergedThemes[renderer]), (theme)=>{ + const preview = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`; + return
this.handleTheme(theme)} title={''}> + {`${renderer} : ${theme.name}`}
{`${theme.name}`} preview
- +
; }); }; - const currentTheme = Themes[`${_.upperFirst(this.props.metadata.renderer)}`][this.props.metadata.theme]; + const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.renderer)}`][this.props.metadata.theme]; let dropdown; if(this.props.metadata.renderer == 'legacy') { @@ -223,6 +228,7 @@ const MetadataEditor = createClass({
{/*listThemes('Legacy')*/} {listThemes('V3')} + {listThemes('Brew')} ; } diff --git a/config/default.json b/config/default.json index 70c90593e..12b35e6cf 100644 --- a/config/default.json +++ b/config/default.json @@ -4,6 +4,7 @@ "secret" : "secret", "web_port" : 8000, "enable_v3" : true, + "enable_themes" : true, "local_environments" : ["docker", "local"], "publicUrl" : "https://homebrewery.naturalcrit.com" } diff --git a/server/app.js b/server/app.js index fc5d4a035..af842f2bf 100644 --- a/server/app.js +++ b/server/app.js @@ -42,6 +42,36 @@ const sanitizeBrew = (brew, accessType)=>{ return brew; }; +const getUsersBrewThemes = async (username)=>{ + const fields = [ + 'title', + 'tags', + 'editId', + 'thumbnail' + ]; + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] } }) //lean() converts results to JSObjects + .catch((error)=>{throw 'Can not find brews';}); + + const userThemes = { + Brew : { + + } + }; + + brews.forEach((brew)=>{ + userThemes.Brew[brew.editId] = { + name : brew.title, + renderer : 'V3', + baseTheme : false, + baseSnippets : false, + path : `#${brew.editId}`, + thumbnail : brew.thumbnail + }; + }); + + return userThemes; +}; + app.use('/', serveCompressedStaticAssets(`build`)); app.use(require('./middleware/content-negotiation.js')); app.use(require('body-parser').json({ limit: '25mb' })); @@ -278,7 +308,7 @@ app.get('/user/:username', async (req, res, next)=>{ }); //Edit Page -app.get('/edit/:id', asyncHandler(getBrew('edit')), (req, res, next)=>{ +app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{ req.brew = req.brew.toObject ? req.brew.toObject() : req.brew; req.ogMeta = { ...defaultMetaTags, @@ -288,6 +318,7 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), (req, res, next)=>{ type : 'article' }; + req.brew.userThemes = await getUsersBrewThemes(req.account.username); sanitizeBrew(req.brew, 'edit'); splitTextStyleAndMetadata(req.brew); res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save. diff --git a/server/homebrew.model.js b/server/homebrew.model.js index 36c9aa192..c8db8fdcc 100644 --- a/server/homebrew.model.js +++ b/server/homebrew.model.js @@ -50,8 +50,8 @@ HomebrewSchema.statics.get = async function(query, fields=null){ return brew; }; -HomebrewSchema.statics.getByUser = async function(username, allowAccess=false, fields=null){ - const query = { authors: username, published: true }; +HomebrewSchema.statics.getByUser = async function(username, allowAccess=false, fields=null, filter=null){ + const query = { authors: username, published: true, ...filter }; if(allowAccess){ delete query.published; } From f9307986cd9f519848cbac62093b23b37b684d7d Mon Sep 17 00:00:00 2001 From: David Bolack Date: Thu, 22 Feb 2024 23:06:40 -0600 Subject: [PATCH 012/239] WIP @import statements are just not working. Uploaded for other eyes. --- client/homebrew/brewRenderer/brewRenderer.jsx | 17 ++++++++++++---- server/app.js | 8 +++++++- server/homebrew.api.js | 20 +++++++++---------- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 9208a2b90..f2216c52b 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -176,10 +176,19 @@ const BrewRenderer = (props)=>{ document.dispatchEvent(new MouseEvent('click')); }; - const rendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; + let rendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; const themePath = props.theme ?? '5ePHB'; const baseThemePath = Themes[rendererPath][themePath].baseTheme; + // Override static theme values if a Brew theme. + + if(themePath[0] == '#') { + themePath.slice(1); + rendererPath = ''; + } else { + rendererPath += '/'; + } + return ( <> {/*render dummy page while iFrame is mounting.*/} @@ -206,11 +215,11 @@ const BrewRenderer = (props)=>{ - + {baseThemePath && - + } - + {/* Apply CSS from Style tab and render pages from Markdown tab */} {state.isMounted diff --git a/server/app.js b/server/app.js index af842f2bf..7d1eaf577 100644 --- a/server/app.js +++ b/server/app.js @@ -9,7 +9,7 @@ const yaml = require('js-yaml'); const app = express(); const config = require('./config.js'); -const { homebrewApi, getBrew } = require('./homebrew.api.js'); +const { homebrewApi, getBrew, getBrewThemeWithCSS, getStaticTheme} = require('./homebrew.api.js'); const GoogleActions = require('./googleActions.js'); const serveCompressedStaticAssets = require('./static-assets.mv.js'); const sanitizeFilename = require('sanitize-filename'); @@ -120,6 +120,12 @@ app.get('/robots.txt', (req, res)=>{ return res.sendFile(`robots.txt`, { root: process.cwd() }); }); +// Theme + +app.get('/css/:id', asyncHandler(getBrew('edit', true)), asyncHandler(getBrewThemeWithCSS)); +app.get('/css/:engine/:id/', asyncHandler(getStaticTheme)); + + //Home page app.get('/', (req, res, next)=>{ req.brew = { diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 36b885cb0..f01c7320c 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -238,12 +238,12 @@ const api = { getBrewThemeWithCSS : async (req, res)=>{ const brew = req.brew; splitTextStyleAndMetadata(brew); - if(res.hasOwnProperty('set')) { - res.set('Content-Type', 'text/css'); - } + // if(res.hasOwnProperty('set')) { + // res.set('Content-Type', 'text/css'); + // } const staticTheme = `/api/css/${req.brew.renderer}/${req.brew.theme}/styles.css`; const userTheme = `/api/css/${req.brew.theme.slice(1)}`; - const parentThemeImport = `// From Theme: ${req.brew.title}\n\n@import ${req.brew.theme[0] != '#' ? staticTheme : userTheme}\n\n`; + const parentThemeImport = `@import url(\"${req.brew.theme[0] != '#' ? staticTheme : userTheme}\");\n\n// From Theme: ${req.brew.title}\n\n`; return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}${req.brew.style}`); }, getStaticTheme : async(req, res)=>{ @@ -251,11 +251,11 @@ const api = { if(themeParent === undefined){ res.status(404).send(`Invalid Theme - Engine: ${req.params.engine}, Name: ${req.params.id}`); } else { - if(res.hasOwnProperty('set')) { - res.set('Content-Type', 'text/css'); - } - const parentTheme = themeParent ? `@import /api/css/${req.params.engine}/${themeParent}\n` : ''; - return res.status(200).send(`${parentTheme}@import /themes/${req.params.engine}/${req.params.id}/style.css\n`); + // if(res.hasOwnProperty('set')) { + // res.set('Content-Type', 'text/css'); + // } + const parentTheme = themeParent ? `@import url(\"/css/${req.params.engine}/${themeParent}\");\n` : ''; + return res.status(200).send(`${parentTheme}@import url(\"/themes/${req.params.engine}/${req.params.id}/style.css\");\n`); } }, updateBrew : async (req, res)=>{ @@ -418,7 +418,5 @@ router.put('/api/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api router.put('/api/update/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.updateBrew)); router.delete('/api/:id', asyncHandler(api.deleteBrew)); router.get('/api/remove/:id', asyncHandler(api.deleteBrew)); -router.get('/api/css/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.getBrewThemeWithCSS)); -router.get('/api/css/:engine/:id/', asyncHandler(api.getStaticTheme)); module.exports = api; From 3e66647f9ff2318575c4f1923da7984ef8214c32 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 23 Feb 2024 14:43:29 -0600 Subject: [PATCH 013/239] Fix @import loading on Chrome. --- server/app.js | 2 +- server/homebrew.api.js | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/server/app.js b/server/app.js index 7d1eaf577..38e4f2112 100644 --- a/server/app.js +++ b/server/app.js @@ -9,7 +9,7 @@ const yaml = require('js-yaml'); const app = express(); const config = require('./config.js'); -const { homebrewApi, getBrew, getBrewThemeWithCSS, getStaticTheme} = require('./homebrew.api.js'); +const { homebrewApi, getBrew, getBrewThemeWithCSS, getStaticTheme } = require('./homebrew.api.js'); const GoogleActions = require('./googleActions.js'); const serveCompressedStaticAssets = require('./static-assets.mv.js'); const sanitizeFilename = require('sanitize-filename'); diff --git a/server/homebrew.api.js b/server/homebrew.api.js index f01c7320c..feeecfbbc 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -238,12 +238,10 @@ const api = { getBrewThemeWithCSS : async (req, res)=>{ const brew = req.brew; splitTextStyleAndMetadata(brew); - // if(res.hasOwnProperty('set')) { - // res.set('Content-Type', 'text/css'); - // } + res.set('Content-Type', 'text/css'); const staticTheme = `/api/css/${req.brew.renderer}/${req.brew.theme}/styles.css`; const userTheme = `/api/css/${req.brew.theme.slice(1)}`; - const parentThemeImport = `@import url(\"${req.brew.theme[0] != '#' ? staticTheme : userTheme}\");\n\n// From Theme: ${req.brew.title}\n\n`; + const parentThemeImport = `@import url(\"${req.brew.theme[0] != '#' ? staticTheme : userTheme}\");\n\n/* From Brew: ${req.brew.title}*/\n\n`; return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}${req.brew.style}`); }, getStaticTheme : async(req, res)=>{ @@ -251,11 +249,10 @@ const api = { if(themeParent === undefined){ res.status(404).send(`Invalid Theme - Engine: ${req.params.engine}, Name: ${req.params.id}`); } else { - // if(res.hasOwnProperty('set')) { - // res.set('Content-Type', 'text/css'); - // } - const parentTheme = themeParent ? `@import url(\"/css/${req.params.engine}/${themeParent}\");\n` : ''; - return res.status(200).send(`${parentTheme}@import url(\"/themes/${req.params.engine}/${req.params.id}/style.css\");\n`); + res.setHeader('Content-Type', 'text/css'); + res.setHeader('Cache-Control', 'public, max-age: 43200, must-revalidate'); + const parentTheme = themeParent ? `@import url(\"/css/${req.params.engine}/${themeParent}\");\n/* Static Theme ${themes[req.params.engine][themeParent].name} */\n` : ''; + return res.status(200).send(`${parentTheme}@import url(\"/themes/${req.params.engine}/${req.params.id}/style.css\");\n/* Static Theme ${themes[req.params.engine][req.params.id].name} */\n`); } }, updateBrew : async (req, res)=>{ From 2456432844c990772ba01979e91862e7834085c0 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 23 Feb 2024 17:12:54 -0600 Subject: [PATCH 014/239] Exclude self from brew themes list to prevent circular ref. --- server/app.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/server/app.js b/server/app.js index 38e4f2112..f55296c8a 100644 --- a/server/app.js +++ b/server/app.js @@ -42,7 +42,7 @@ const sanitizeBrew = (brew, accessType)=>{ return brew; }; -const getUsersBrewThemes = async (username)=>{ +const getUsersBrewThemes = async (username,id)=>{ const fields = [ 'title', 'tags', @@ -59,14 +59,16 @@ const getUsersBrewThemes = async (username)=>{ }; brews.forEach((brew)=>{ - userThemes.Brew[brew.editId] = { - name : brew.title, - renderer : 'V3', - baseTheme : false, - baseSnippets : false, - path : `#${brew.editId}`, - thumbnail : brew.thumbnail - }; + if(id!=brew.editId) { + userThemes.Brew[brew.editId] = { + name : brew.title, + renderer : 'V3', + baseTheme : false, + baseSnippets : false, + path : `#${brew.editId}`, + thumbnail : brew.thumbnail + }; + } }); return userThemes; @@ -324,7 +326,7 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{ type : 'article' }; - req.brew.userThemes = await getUsersBrewThemes(req.account.username); + req.brew.userThemes = await getUsersBrewThemes(req.account.username, req.brew.editId); sanitizeBrew(req.brew, 'edit'); splitTextStyleAndMetadata(req.brew); res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save. From 7b3a1eb4ffab50a1de6841e57f06e00b17a099a5 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 27 Feb 2024 13:41:51 -0600 Subject: [PATCH 015/239] Functional user theme loading though noising console --- client/homebrew/brewRenderer/brewRenderer.jsx | 28 ++++++++-- client/homebrew/editor/editor.jsx | 1 + .../editor/metadataEditor/metadataEditor.jsx | 10 ++-- .../homebrew/editor/snippetbar/snippetbar.jsx | 2 +- client/homebrew/pages/editPage/editPage.jsx | 6 ++ server/app.js | 45 +++------------ server/homebrew.api.js | 56 ++++++++++++++++++- 7 files changed, 99 insertions(+), 49 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 55116dea1..a9aefed07 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -14,7 +14,7 @@ const NotificationPopup = require('./notificationPopup/notificationPopup.jsx'); const Frame = require('react-frame-component').default; const dedent = require('dedent-tabs').default; -const Themes = require('themes/themes.json'); +const staticThemes = require('themes/themes.json'); const PAGE_HEIGHT = 1056; @@ -182,18 +182,34 @@ const BrewRenderer = (props)=>{ }; let rendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; - const themePath = props.theme ?? '5ePHB'; - const baseThemePath = Themes[rendererPath][themePath].baseTheme; + let baseRendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; + const blankRendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; + if(props.theme[0] === '#') { + rendererPath = 'Brew'; + } + let themePath = props.theme ?? '5ePHB'; + console.log(`props.userThemes`); + console.log(props); + console.log(`props.userThemes`); + const Themes = { ...staticThemes, ...props.userThemes }; + let baseThemePath = Themes[rendererPath][themePath]?.baseTheme; // Override static theme values if a Brew theme. if(themePath[0] == '#') { - themePath.slice(1); + themePath = themePath.slice(1); rendererPath = ''; } else { rendererPath += '/'; } + if(baseThemePath && baseThemePath[0] == '#') { + baseThemePath = baseThemePath.slice(1); + baseRendererPath = ''; + } else { + baseRendererPath += '/'; + } + return ( <> {/*render dummy page while iFrame is mounting.*/} @@ -220,9 +236,9 @@ const BrewRenderer = (props)=>{ - + {baseThemePath && - + } diff --git a/client/homebrew/editor/editor.jsx b/client/homebrew/editor/editor.jsx index d79d2ce4e..5791c4ee3 100644 --- a/client/homebrew/editor/editor.jsx +++ b/client/homebrew/editor/editor.jsx @@ -378,6 +378,7 @@ const Editor = createClass({ showEditButtons={this.props.showEditButtons} renderer={this.props.renderer} theme={this.props.brew.theme} + userThemes={this.props.brew.userThemes} undo={this.undo} redo={this.redo} foldCode={this.foldCode} diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 58c44ded9..963ebd1f7 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -38,6 +38,7 @@ const MetadataEditor = createClass({ authors : [], systems : [], renderer : 'legacy', + themeClass : 'V3', theme : '5ePHB', lang : 'en' }, @@ -110,8 +111,9 @@ const MetadataEditor = createClass({ }); }, - handleTheme : function(theme){ + handleTheme : function(theme, themeClass){ this.props.metadata.renderer = theme.renderer; + this.props.metadata.themeClass = themeClass; this.props.metadata.theme = theme.path; this.props.onChange(this.props.metadata); }, @@ -199,7 +201,7 @@ const MetadataEditor = createClass({ const listThemes = (renderer)=>{ return _.map(_.values(mergedThemes[renderer]), (theme)=>{ const preview = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`; - return
this.handleTheme(theme)} title={''}> + return
this.handleTheme(theme, renderer)} title={''}> {`${renderer} : ${theme.name}`}
@@ -210,7 +212,7 @@ const MetadataEditor = createClass({ }); }; - const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.renderer)}`][this.props.metadata.theme]; + const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.themeClass?this.props.metadata.themeClass:this.props.metadata.renderer)}`][this.props.metadata.theme]; let dropdown; if(this.props.metadata.renderer == 'legacy') { @@ -224,7 +226,7 @@ const MetadataEditor = createClass({ dropdown =
- {`${_.upperFirst(currentTheme.renderer)} : ${currentTheme.name}`} + {`${_.upperFirst(this.props.metadata.themeClass?this.props.metadata.themeClass:this.props.metadata.renderer)} : ${currentTheme.name}`}
{/*listThemes('Legacy')*/} {listThemes('V3')} diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index 75fe0d736..cb7570a44 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -84,7 +84,7 @@ const Snippetbar = createClass({ compileSnippets : function(rendererPath, themePath, snippets) { let compiledSnippets = snippets; - const baseSnippetsPath = Themes[rendererPath][themePath].baseSnippets; + const baseSnippetsPath = themePath[0] != '#' ? Themes[rendererPath][themePath].baseSnippets : false; const objB = _.keyBy(compiledSnippets, 'groupName'); diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index d5af310b5..a061d33b8 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -388,6 +388,10 @@ const EditPage = createClass({ return
{this.renderNavbar()} + {console.log('state')} + {console.log(this.state)} + {console.log('props')} + {console.log(this.props)}
@@ -407,6 +411,8 @@ const EditPage = createClass({ theme={this.state.brew.theme} errors={this.state.htmlErrors} lang={this.state.brew.lang} + userThemes={this.props.brew.userThemes} + themeClass={this.state.brew.themeClass} currentEditorPage={this.state.currentEditorPage} /> diff --git a/server/app.js b/server/app.js index f55296c8a..3ecaa2df9 100644 --- a/server/app.js +++ b/server/app.js @@ -42,38 +42,6 @@ const sanitizeBrew = (brew, accessType)=>{ return brew; }; -const getUsersBrewThemes = async (username,id)=>{ - const fields = [ - 'title', - 'tags', - 'editId', - 'thumbnail' - ]; - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] } }) //lean() converts results to JSObjects - .catch((error)=>{throw 'Can not find brews';}); - - const userThemes = { - Brew : { - - } - }; - - brews.forEach((brew)=>{ - if(id!=brew.editId) { - userThemes.Brew[brew.editId] = { - name : brew.title, - renderer : 'V3', - baseTheme : false, - baseSnippets : false, - path : `#${brew.editId}`, - thumbnail : brew.thumbnail - }; - } - }); - - return userThemes; -}; - app.use('/', serveCompressedStaticAssets(`build`)); app.use(require('./middleware/content-negotiation.js')); app.use(require('body-parser').json({ limit: '25mb' })); @@ -318,6 +286,9 @@ app.get('/user/:username', async (req, res, next)=>{ //Edit Page app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{ req.brew = req.brew.toObject ? req.brew.toObject() : req.brew; + console.log('edit'); + console.log(req); + console.log('edit'); req.ogMeta = { ...defaultMetaTags, title : req.brew.title || 'Untitled Brew', @@ -326,7 +297,6 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{ type : 'article' }; - req.brew.userThemes = await getUsersBrewThemes(req.account.username, req.brew.editId); sanitizeBrew(req.brew, 'edit'); splitTextStyleAndMetadata(req.brew); res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save. @@ -344,7 +314,7 @@ app.get('/new/:id', asyncHandler(getBrew('share')), (req, res, next)=>{ style : req.brew.style, renderer : req.brew.renderer, theme : req.brew.theme, - tags : req.brew.tags + tags : req.brew.tags, }; req.brew = _.defaults(brew, DEFAULT_BREW); @@ -378,13 +348,15 @@ app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, r await HomebrewModel.increaseView({ shareId: brew.shareId }); } }; + req.brew.userThemes = await getUsersBrewThemes(req.account.username, req.brew.editId); sanitizeBrew(req.brew, 'share'); splitTextStyleAndMetadata(req.brew); return next(); })); //Print Page -app.get('/print/:id', asyncHandler(getBrew('share')), (req, res, next)=>{ +app.get('/print/:id', asyncHandler(getBrew('share')), async (req, res, next)=>{ + req.brew.userThemes = await getUsersBrewThemes(req.account.username, req.brew.editId); sanitizeBrew(req.brew, 'share'); splitTextStyleAndMetadata(req.brew); next(); @@ -477,7 +449,8 @@ const renderPage = async (req, res)=>{ enable_v3 : config.get('enable_v3'), enable_themes : config.get('enable_themes'), config : configuration, - ogMeta : req.ogMeta + ogMeta : req.ogMeta, + userThemes : req.userThemes }; const title = req.brew ? req.brew.title : ''; const page = await templateFn('homebrew', title, props) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index feeecfbbc..7a896b9e0 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -46,8 +46,54 @@ const splitTextStyleAndMetadata = (brew)=>{ brew.style = brew.text.slice(7, index - 1); brew.text = brew.text.slice(index + 5); } + console.log(brew.theme); }; +const getUsersBrewThemes = async (username, id)=>{ + console.log(username); + console.log(id); + const fields = [ + 'title', + 'tags', + 'editId', + 'thumbnail', + 'textBin' + ]; + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] } }) //lean() converts results to JSObjects + .catch((error)=>{throw 'Can not find brews';}); + + const userThemes = { + Brew : { + + } + }; + + console.log(`Length of user brews ${brews.size}`); + + brews.forEach(async (brew)=>{ + b = await HomebrewModel.get({ editId: brew.editId }, ['textBin']); + splitTextStyleAndMetadata(b); + console.log(`whee!!!! ${b.theme}`); + console.log(id); + console.log(brew.editId); + if(id!=brew.editId) { + + userThemes.Brew[`#${brew.editId}`] = { + name : brew.title, + renderer : 'V3', + baseTheme : b.theme, + baseSnippets : false, + path : `#${brew.editId}`, + thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' + }; + console.log(`Wheee! ${userThemes.Brew[`#${brew.editId}`].baseTheme}`); + } + }); + + return userThemes; +}; + + const api = { homebrewApi : router, getId : (req)=>{ @@ -119,11 +165,14 @@ const api = { throw { name: 'BrewLoad Error', message: 'Brew not found', status: 404, HBErrorCode: '05', accessType: accessType, brewId: id }; } + const userID = accessType === 'edit' ? req.account.username : stub.authors.split(',')[0]; + // Clean up brew: fill in missing fields with defaults / fix old invalid values if(stub) { stub.tags = stub.tags || undefined; // Clear empty strings stub.renderer = stub.renderer || undefined; // Clear empty strings stub = _.defaults(stub, DEFAULT_BREW_LOAD); // Fill in blank fields + stub.userThemes = await getUsersBrewThemes(userID, id); } req.brew = stub ?? {}; @@ -239,8 +288,8 @@ const api = { const brew = req.brew; splitTextStyleAndMetadata(brew); res.set('Content-Type', 'text/css'); - const staticTheme = `/api/css/${req.brew.renderer}/${req.brew.theme}/styles.css`; - const userTheme = `/api/css/${req.brew.theme.slice(1)}`; + const staticTheme = `/css/${req.brew.renderer}/${req.brew.theme}`; + const userTheme = `/css/${req.brew.theme.slice(1)}`; const parentThemeImport = `@import url(\"${req.brew.theme[0] != '#' ? staticTheme : userTheme}\");\n\n/* From Brew: ${req.brew.title}*/\n\n`; return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}${req.brew.style}`); }, @@ -273,6 +322,9 @@ const api = { brew.title = brew.title.trim(); brew.description = brew.description.trim() || ''; brew.text = api.mergeBrewText(brew); + const userID = req?.account?.username ? req.account.username : brew.authors.split(',')[0]; + brew.userThemes = await getUsersBrewThemes(userID, brew.editId); + if(brew.googleId && removeFromGoogle) { // If the google id exists and we're removing it from google, set afterSave to delete the google brew and mark the brew's google id as undefined From 4f4659b0e2490a7db355dd21c9bb99006f9d54d7 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 27 Feb 2024 13:57:58 -0600 Subject: [PATCH 016/239] Cleaned up noise in homebrew.api.js --- server/homebrew.api.js | 34 +++++++++++----------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 7a896b9e0..6475e7a26 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -46,12 +46,9 @@ const splitTextStyleAndMetadata = (brew)=>{ brew.style = brew.text.slice(7, index - 1); brew.text = brew.text.slice(index + 5); } - console.log(brew.theme); }; const getUsersBrewThemes = async (username, id)=>{ - console.log(username); - console.log(id); const fields = [ 'title', 'tags', @@ -59,7 +56,7 @@ const getUsersBrewThemes = async (username, id)=>{ 'thumbnail', 'textBin' ]; - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] } }) //lean() converts results to JSObjects + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects .catch((error)=>{throw 'Can not find brews';}); const userThemes = { @@ -68,26 +65,17 @@ const getUsersBrewThemes = async (username, id)=>{ } }; - console.log(`Length of user brews ${brews.size}`); - brews.forEach(async (brew)=>{ - b = await HomebrewModel.get({ editId: brew.editId }, ['textBin']); - splitTextStyleAndMetadata(b); - console.log(`whee!!!! ${b.theme}`); - console.log(id); - console.log(brew.editId); - if(id!=brew.editId) { - - userThemes.Brew[`#${brew.editId}`] = { - name : brew.title, - renderer : 'V3', - baseTheme : b.theme, - baseSnippets : false, - path : `#${brew.editId}`, - thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' - }; - console.log(`Wheee! ${userThemes.Brew[`#${brew.editId}`].baseTheme}`); - } + const brewTheme = await HomebrewModel.get({ editId: brew.editId }, ['textBin']); + splitTextStyleAndMetadata(brewTheme); + userThemes.Brew[`#${brew.editId}`] = { + name : brew.title, + renderer : 'V3', + baseTheme : brewTheme.theme, + baseSnippets : false, + path : `#${brew.editId}`, + thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' + }; }); return userThemes; From 50c9d95ce0e24b709b66d41d467bd8eca857317b Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 27 Feb 2024 17:30:14 -0600 Subject: [PATCH 017/239] WIP trying to debug theme selection. --- client/homebrew/editor/editor.jsx | 3 +++ .../editor/metadataEditor/metadataEditor.jsx | 1 - client/homebrew/pages/editPage/editPage.jsx | 13 ++++++------- server/app.js | 3 --- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/client/homebrew/editor/editor.jsx b/client/homebrew/editor/editor.jsx index 5791c4ee3..471682393 100644 --- a/client/homebrew/editor/editor.jsx +++ b/client/homebrew/editor/editor.jsx @@ -339,6 +339,9 @@ const Editor = createClass({ view={this.state.view} style={{ display: 'none' }} rerenderParent={this.rerenderParent} /> + {console.log('Metadata')} + {console.log(this.props)} + {console.log('Metadata')} {this.renderNavbar()} - {console.log('state')} - {console.log(this.state)} - {console.log('props')} - {console.log(this.props)}
@@ -411,8 +411,7 @@ const EditPage = createClass({ theme={this.state.brew.theme} errors={this.state.htmlErrors} lang={this.state.brew.lang} - userThemes={this.props.brew.userThemes} - themeClass={this.state.brew.themeClass} + userThemes={this.state.brew.userThemes} currentEditorPage={this.state.currentEditorPage} /> diff --git a/server/app.js b/server/app.js index 3ecaa2df9..b31524933 100644 --- a/server/app.js +++ b/server/app.js @@ -286,9 +286,6 @@ app.get('/user/:username', async (req, res, next)=>{ //Edit Page app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{ req.brew = req.brew.toObject ? req.brew.toObject() : req.brew; - console.log('edit'); - console.log(req); - console.log('edit'); req.ogMeta = { ...defaultMetaTags, title : req.brew.title || 'Untitled Brew', From 56851f2c2d87d390e1d51554018206a5af6fb1aa Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 27 Feb 2024 19:33:33 -0600 Subject: [PATCH 018/239] Edit working - with noise. --- .../editor/metadataEditor/metadataEditor.jsx | 5 ++++- server/app.js | 3 +++ server/homebrew.api.js | 17 ++++++++++++++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 179dc553f..805ec6737 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -211,7 +211,10 @@ const MetadataEditor = createClass({ }); }; - const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.themeClass?this.props.metadata.themeClass:this.props.metadata.renderer)}`][this.props.metadata.theme]; + const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.theme[0] === '#' ? 'Brew' : this.props.metadata.renderer)}`][this.props.metadata.theme]; + console.log('currentTheme'); + console.log(this.props.metadata.themeClass); + console.log('currentTheme'); let dropdown; if(this.props.metadata.renderer == 'legacy') { diff --git a/server/app.js b/server/app.js index b31524933..55ab52e13 100644 --- a/server/app.js +++ b/server/app.js @@ -286,6 +286,9 @@ app.get('/user/:username', async (req, res, next)=>{ //Edit Page app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{ req.brew = req.brew.toObject ? req.brew.toObject() : req.brew; + console.log('Load Edit'); + console.log(req.brew); + console.log('Load Edit'); req.ogMeta = { ...defaultMetaTags, title : req.brew.title || 'Untitled Brew', diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 6475e7a26..b4d70a7a1 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -49,6 +49,9 @@ const splitTextStyleAndMetadata = (brew)=>{ }; const getUsersBrewThemes = async (username, id)=>{ + console.log('getUsersBrewThemes'); + console.log(username); + console.log(id); const fields = [ 'title', 'tags', @@ -56,6 +59,7 @@ const getUsersBrewThemes = async (username, id)=>{ 'thumbnail', 'textBin' ]; + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects .catch((error)=>{throw 'Can not find brews';}); @@ -65,7 +69,7 @@ const getUsersBrewThemes = async (username, id)=>{ } }; - brews.forEach(async (brew)=>{ + for await (const brew of brews) { const brewTheme = await HomebrewModel.get({ editId: brew.editId }, ['textBin']); splitTextStyleAndMetadata(brewTheme); userThemes.Brew[`#${brew.editId}`] = { @@ -76,8 +80,9 @@ const getUsersBrewThemes = async (username, id)=>{ path : `#${brew.editId}`, thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' }; - }); + }; + console.log('getUsersBrewThemes end'); return userThemes; }; @@ -156,13 +161,19 @@ const api = { const userID = accessType === 'edit' ? req.account.username : stub.authors.split(',')[0]; // Clean up brew: fill in missing fields with defaults / fix old invalid values + const userThemes = await getUsersBrewThemes(userID, id); if(stub) { stub.tags = stub.tags || undefined; // Clear empty strings stub.renderer = stub.renderer || undefined; // Clear empty strings stub = _.defaults(stub, DEFAULT_BREW_LOAD); // Fill in blank fields - stub.userThemes = await getUsersBrewThemes(userID, id); + stub.userThemes = userThemes; } + + console.log('stub.userThemes'); + console.log(stub.userThemes); + console.log(stub.userThemes); + console.log('stub.userThemes'); req.brew = stub ?? {}; next(); }; From 7384cdc241568d24ff5e3ac077d1093da91708e1 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 27 Feb 2024 20:20:43 -0600 Subject: [PATCH 019/239] My god it works --- client/homebrew/pages/printPage/printPage.jsx | 51 ++++++++++++++----- server/app.js | 2 - server/homebrew.api.js | 6 ++- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/client/homebrew/pages/printPage/printPage.jsx b/client/homebrew/pages/printPage/printPage.jsx index 083410804..7d162eb59 100644 --- a/client/homebrew/pages/printPage/printPage.jsx +++ b/client/homebrew/pages/printPage/printPage.jsx @@ -7,7 +7,7 @@ const { Meta } = require('vitreum/headtags'); const MarkdownLegacy = require('naturalcrit/markdownLegacy.js'); const Markdown = require('naturalcrit/markdown.js'); -const Themes = require('themes/themes.json'); +const staticThemes = require('themes/themes.json'); const BREWKEY = 'homebrewery-new'; const STYLEKEY = 'homebrewery-new-style'; @@ -30,11 +30,12 @@ const PrintPage = createClass({ getInitialState : function() { return { brew : { - text : this.props.brew.text || '', - style : this.props.brew.style || undefined, - renderer : this.props.brew.renderer || 'legacy', - theme : this.props.brew.theme || '5ePHB', - lang : this.props.brew.lang || 'en' + text : this.props.brew.text || '', + style : this.props.brew.style || undefined, + renderer : this.props.brew.renderer || 'legacy', + theme : this.props.brew.theme || '5ePHB', + lang : this.props.brew.lang || 'en', + userThemes : this.props.brew.userThemes } }; }, @@ -90,17 +91,43 @@ const PrintPage = createClass({ }, render : function(){ - const rendererPath = this.state.brew.renderer == 'V3' ? 'V3' : 'Legacy'; - const themePath = this.state.brew.theme ?? '5ePHB'; - const baseThemePath = Themes[rendererPath][themePath].baseTheme; + let rendererPath = this.state.brew.renderer == 'V3' ? 'V3' : 'Legacy'; + let baseRendererPath = this.state.brew.renderer == 'V3' ? 'V3' : 'Legacy'; + const blankRendererPath = this.state.brew.renderer == 'V3' ? 'V3' : 'Legacy'; + if(this.state.brew.theme[0] === '#') { + rendererPath = 'Brew'; + } + let themePath = this.state.brew.theme ?? '5ePHB'; + console.log(`this.state.brew.userThemes`); + console.log(this.state.brew); + console.log(`this.state.brew.userThemes`); + const Themes = { ...staticThemes, ...this.state.brew.userThemes }; + let baseThemePath = Themes[rendererPath][themePath]?.baseTheme; + + // Override static theme values if a Brew theme. + + if(themePath[0] == '#') { + themePath = themePath.slice(1); + rendererPath = ''; + } else { + rendererPath += '/'; + } + + if(baseThemePath && baseThemePath[0] == '#') { + baseThemePath = baseThemePath.slice(1); + baseRendererPath = ''; + } else { + baseRendererPath += '/'; + } + return
- + {baseThemePath && - + } - + {/* Apply CSS from Style tab */} {this.renderStyle()}
diff --git a/server/app.js b/server/app.js index 55ab52e13..4bd753c2d 100644 --- a/server/app.js +++ b/server/app.js @@ -348,7 +348,6 @@ app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, r await HomebrewModel.increaseView({ shareId: brew.shareId }); } }; - req.brew.userThemes = await getUsersBrewThemes(req.account.username, req.brew.editId); sanitizeBrew(req.brew, 'share'); splitTextStyleAndMetadata(req.brew); return next(); @@ -356,7 +355,6 @@ app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, r //Print Page app.get('/print/:id', asyncHandler(getBrew('share')), async (req, res, next)=>{ - req.brew.userThemes = await getUsersBrewThemes(req.account.username, req.brew.editId); sanitizeBrew(req.brew, 'share'); splitTextStyleAndMetadata(req.brew); next(); diff --git a/server/homebrew.api.js b/server/homebrew.api.js index b4d70a7a1..dff9da7a9 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -158,7 +158,11 @@ const api = { throw { name: 'BrewLoad Error', message: 'Brew not found', status: 404, HBErrorCode: '05', accessType: accessType, brewId: id }; } - const userID = accessType === 'edit' ? req.account.username : stub.authors.split(',')[0]; + console.log(`print`); + console.log(accessType); + console.log(stub); + console.log(`print`); + const userID = accessType === 'edit' ? req.account.username : stub.authors[0]; // Clean up brew: fill in missing fields with defaults / fix old invalid values const userThemes = await getUsersBrewThemes(userID, id); From 8f15887c033fa286b67abf06cd0688d42ebb8446 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 27 Feb 2024 20:51:59 -0600 Subject: [PATCH 020/239] Cleanup of console logging --- client/homebrew/brewRenderer/brewRenderer.jsx | 3 --- client/homebrew/editor/editor.jsx | 3 --- .../editor/metadataEditor/metadataEditor.jsx | 3 --- client/homebrew/pages/editPage/editPage.jsx | 3 --- client/homebrew/pages/printPage/printPage.jsx | 3 --- server/app.js | 3 --- server/homebrew.api.js | 13 ------------- 7 files changed, 31 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index a9aefed07..1f52f993e 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -188,9 +188,6 @@ const BrewRenderer = (props)=>{ rendererPath = 'Brew'; } let themePath = props.theme ?? '5ePHB'; - console.log(`props.userThemes`); - console.log(props); - console.log(`props.userThemes`); const Themes = { ...staticThemes, ...props.userThemes }; let baseThemePath = Themes[rendererPath][themePath]?.baseTheme; diff --git a/client/homebrew/editor/editor.jsx b/client/homebrew/editor/editor.jsx index 471682393..5791c4ee3 100644 --- a/client/homebrew/editor/editor.jsx +++ b/client/homebrew/editor/editor.jsx @@ -339,9 +339,6 @@ const Editor = createClass({ view={this.state.view} style={{ display: 'none' }} rerenderParent={this.rerenderParent} /> - {console.log('Metadata')} - {console.log(this.props)} - {console.log('Metadata')} { //Edit Page app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{ req.brew = req.brew.toObject ? req.brew.toObject() : req.brew; - console.log('Load Edit'); - console.log(req.brew); - console.log('Load Edit'); req.ogMeta = { ...defaultMetaTags, title : req.brew.title || 'Untitled Brew', diff --git a/server/homebrew.api.js b/server/homebrew.api.js index dff9da7a9..fa4a5de1d 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -49,9 +49,6 @@ const splitTextStyleAndMetadata = (brew)=>{ }; const getUsersBrewThemes = async (username, id)=>{ - console.log('getUsersBrewThemes'); - console.log(username); - console.log(id); const fields = [ 'title', 'tags', @@ -82,7 +79,6 @@ const getUsersBrewThemes = async (username, id)=>{ }; }; - console.log('getUsersBrewThemes end'); return userThemes; }; @@ -158,10 +154,6 @@ const api = { throw { name: 'BrewLoad Error', message: 'Brew not found', status: 404, HBErrorCode: '05', accessType: accessType, brewId: id }; } - console.log(`print`); - console.log(accessType); - console.log(stub); - console.log(`print`); const userID = accessType === 'edit' ? req.account.username : stub.authors[0]; // Clean up brew: fill in missing fields with defaults / fix old invalid values @@ -173,11 +165,6 @@ const api = { stub.userThemes = userThemes; } - - console.log('stub.userThemes'); - console.log(stub.userThemes); - console.log(stub.userThemes); - console.log('stub.userThemes'); req.brew = stub ?? {}; next(); }; From 562daf9b0493d1831145a26bf11217297bb442d8 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 27 Feb 2024 21:13:22 -0600 Subject: [PATCH 021/239] Handle some statics --- server/homebrew.api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index fa4a5de1d..12991a4ca 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -277,7 +277,7 @@ const api = { getBrewThemeWithCSS : async (req, res)=>{ const brew = req.brew; splitTextStyleAndMetadata(brew); - res.set('Content-Type', 'text/css'); + res.setHeader('Content-Type', 'text/css'); const staticTheme = `/css/${req.brew.renderer}/${req.brew.theme}`; const userTheme = `/css/${req.brew.theme.slice(1)}`; const parentThemeImport = `@import url(\"${req.brew.theme[0] != '#' ? staticTheme : userTheme}\");\n\n/* From Brew: ${req.brew.title}*/\n\n`; From 544bc9bd01dd5c36af4433bef85c16dbf71ce9f2 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 28 Feb 2024 08:32:15 -0600 Subject: [PATCH 022/239] Catch bad assumption in unlogged saves --- server/homebrew.api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 12991a4ca..1147d3504 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -154,7 +154,7 @@ const api = { throw { name: 'BrewLoad Error', message: 'Brew not found', status: 404, HBErrorCode: '05', accessType: accessType, brewId: id }; } - const userID = accessType === 'edit' ? req.account.username : stub.authors[0]; + const userID = req?.account?.username && (accessType === 'edit') ? req.account.username : stub.authors[0]; // Clean up brew: fill in missing fields with defaults / fix old invalid values const userThemes = await getUsersBrewThemes(userID, id); From 753b3befad7f9c55b780341ed102f96fd6a711e0 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 28 Feb 2024 14:53:40 -0600 Subject: [PATCH 023/239] Fix issue with empty theme ( /faq ) --- client/homebrew/brewRenderer/brewRenderer.jsx | 2 +- config/default.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 1f52f993e..84d0d21dd 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -184,7 +184,7 @@ const BrewRenderer = (props)=>{ let rendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; let baseRendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; const blankRendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; - if(props.theme[0] === '#') { + if(props?.theme && (props?.theme[0] === '#')) { rendererPath = 'Brew'; } let themePath = props.theme ?? '5ePHB'; diff --git a/config/default.json b/config/default.json index 12b35e6cf..35459a022 100644 --- a/config/default.json +++ b/config/default.json @@ -6,5 +6,6 @@ "enable_v3" : true, "enable_themes" : true, "local_environments" : ["docker", "local"], - "publicUrl" : "https://homebrewery.naturalcrit.com" + "publicUrl" : "https://homebrewery.naturalcrit.com", + "mongodb_uri" : "mongodb://127.0.0.1/homebrewery3" } From 4f90f92b38d8382316b435ae974b56d455af0962 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 28 Feb 2024 15:08:00 -0600 Subject: [PATCH 024/239] Additional theme based error checking. --- client/homebrew/brewRenderer/brewRenderer.jsx | 4 ++-- client/homebrew/editor/metadataEditor/metadataEditor.jsx | 3 ++- client/homebrew/editor/snippetbar/snippetbar.jsx | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 84d0d21dd..6e97ec092 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -193,14 +193,14 @@ const BrewRenderer = (props)=>{ // Override static theme values if a Brew theme. - if(themePath[0] == '#') { + if(themePath && themePath[0] === '#') { themePath = themePath.slice(1); rendererPath = ''; } else { rendererPath += '/'; } - if(baseThemePath && baseThemePath[0] == '#') { + if(baseThemePath && baseThemePath[0] === '#') { baseThemePath = baseThemePath.slice(1); baseRendererPath = ''; } else { diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index fadd5dd6c..573fb00c3 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -211,7 +211,8 @@ const MetadataEditor = createClass({ }); }; - const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.theme[0] === '#' ? 'Brew' : this.props.metadata.renderer)}`][this.props.metadata.theme]; + const currentThemePath = this.props.metadata?.theme && this.props.metadata.theme[0] === '#' ? 'Brew' : this.props.metadata.renderer; + const currentTheme = mergedThemes[`${_.upperFirst(currentThemePath)}`][this.props.metadata.theme]; let dropdown; if(this.props.metadata.renderer == 'legacy') { diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index cb7570a44..4c7f4a200 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -84,7 +84,7 @@ const Snippetbar = createClass({ compileSnippets : function(rendererPath, themePath, snippets) { let compiledSnippets = snippets; - const baseSnippetsPath = themePath[0] != '#' ? Themes[rendererPath][themePath].baseSnippets : false; + const baseSnippetsPath = themePath && (themePath[0] === '#') ? false : Themes[rendererPath][themePath].baseSnippets; const objB = _.keyBy(compiledSnippets, 'groupName'); From a54fb98d4e938bfb79e9de317a4695fff15f1163 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 10:28:09 -0600 Subject: [PATCH 025/239] Additional debugging --- client/homebrew/pages/newPage/newPage.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 9877651c2..9fd82b282 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -150,7 +150,7 @@ const NewPage = createClass({ } brew.pageCount=((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; - + console.log('Running post.'); const res = await request .post(`/api${this.state.saveGoogle ? '?saveToGoogle=true' : ''}`) .send(brew) @@ -158,7 +158,9 @@ const NewPage = createClass({ console.log(err); this.setState({ isSaving: false, error: err }); }); - if(!res) return; + console.log('Post completed'); + if(!res) return; + console.log('Had results!'); brew = res.body; localStorage.removeItem(BREWKEY); From 79a42911538b923caadcef2c9c84e5a6ebb1bcaa Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 10:37:10 -0600 Subject: [PATCH 026/239] More debug --- client/homebrew/pages/newPage/newPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 9fd82b282..1510564b6 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -166,7 +166,7 @@ const NewPage = createClass({ localStorage.removeItem(BREWKEY); localStorage.removeItem(STYLEKEY); localStorage.removeItem(METAKEY); - window.location = `/edit/${brew.editId}`; + //window.location = `/edit/${brew.editId}`; }, renderSaveButton : function(){ From 6f6a06c8c30787d4b6a209cf4066b81ac4939143 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 11:00:43 -0600 Subject: [PATCH 027/239] More debug --- client/homebrew/pages/newPage/newPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 1510564b6..9fd82b282 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -166,7 +166,7 @@ const NewPage = createClass({ localStorage.removeItem(BREWKEY); localStorage.removeItem(STYLEKEY); localStorage.removeItem(METAKEY); - //window.location = `/edit/${brew.editId}`; + window.location = `/edit/${brew.editId}`; }, renderSaveButton : function(){ From 17f78169f203713fa15852b309efa731bded6cb6 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 12:03:27 -0600 Subject: [PATCH 028/239] More debug --- server/homebrew.api.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 1147d3504..1fa92a84d 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -57,15 +57,19 @@ const getUsersBrewThemes = async (username, id)=>{ 'textBin' ]; - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects - .catch((error)=>{throw 'Can not find brews';}); - const userThemes = { Brew : { } }; + if(!username || !id) { + return userThemes; + } + + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects + .catch((error)=>{throw 'Can not find brews';}); + for await (const brew of brews) { const brewTheme = await HomebrewModel.get({ editId: brew.editId }, ['textBin']); splitTextStyleAndMetadata(brewTheme); From 18aa453bb02e05337e717614ddad062b1b298c71 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 12:38:00 -0600 Subject: [PATCH 029/239] Rearrange and leverage getBrew --- config/default.json | 1 - server/homebrew.api.js | 83 +++++++++++++++++++++--------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/config/default.json b/config/default.json index 35459a022..f16008a00 100644 --- a/config/default.json +++ b/config/default.json @@ -7,5 +7,4 @@ "enable_themes" : true, "local_environments" : ["docker", "local"], "publicUrl" : "https://homebrewery.naturalcrit.com", - "mongodb_uri" : "mongodb://127.0.0.1/homebrewery3" } diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 1fa92a84d..649bd27c2 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -48,45 +48,6 @@ const splitTextStyleAndMetadata = (brew)=>{ } }; -const getUsersBrewThemes = async (username, id)=>{ - const fields = [ - 'title', - 'tags', - 'editId', - 'thumbnail', - 'textBin' - ]; - - const userThemes = { - Brew : { - - } - }; - - if(!username || !id) { - return userThemes; - } - - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects - .catch((error)=>{throw 'Can not find brews';}); - - for await (const brew of brews) { - const brewTheme = await HomebrewModel.get({ editId: brew.editId }, ['textBin']); - splitTextStyleAndMetadata(brewTheme); - userThemes.Brew[`#${brew.editId}`] = { - name : brew.title, - renderer : 'V3', - baseTheme : brewTheme.theme, - baseSnippets : false, - path : `#${brew.editId}`, - thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' - }; - }; - - return userThemes; -}; - - const api = { homebrewApi : router, getId : (req)=>{ @@ -105,6 +66,46 @@ const api = { } return { id, googleId }; }, + getUsersBrewThemes : async (username, id, req, res, next)=>{ + const fields = [ + 'title', + 'tags', + 'editId', + 'thumbnail', + 'textBin' + ]; + + const userThemes = { + Brew : { + + } + }; + + if(!username || !id) { + return userThemes; + } + + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects + .catch((error)=>{throw 'Can not find brews';}); + + for await (const brew of brews) { + api.getBrew('themes', req=req, res=res, next=next); + const brewTheme = req.brew; + if(brewTheme) { + splitTextStyleAndMetadata(brewTheme); + userThemes.Brew[`#${brew.editId}`] = { + name : brew.title, + renderer : 'V3', + baseTheme : brewTheme.theme, + baseSnippets : false, + path : `#${brew.editId}`, + thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' + }; + } + }; + + return userThemes; + }, getBrew : (accessType, stubOnly = false)=>{ // Create middleware with the accessType passed in as part of the scope return async (req, res, next)=>{ @@ -161,7 +162,7 @@ const api = { const userID = req?.account?.username && (accessType === 'edit') ? req.account.username : stub.authors[0]; // Clean up brew: fill in missing fields with defaults / fix old invalid values - const userThemes = await getUsersBrewThemes(userID, id); + const userThemes = accessType != 'themes' ? await api.getUsersBrewThemes(userID, id, req, res, next) : ''; if(stub) { stub.tags = stub.tags || undefined; // Clear empty strings stub.renderer = stub.renderer || undefined; // Clear empty strings @@ -317,7 +318,7 @@ const api = { brew.description = brew.description.trim() || ''; brew.text = api.mergeBrewText(brew); const userID = req?.account?.username ? req.account.username : brew.authors.split(',')[0]; - brew.userThemes = await getUsersBrewThemes(userID, brew.editId); + brew.userThemes = await api.getUsersBrewThemes(userID, brew.editId, req, res, null); if(brew.googleId && removeFromGoogle) { From ac4c84e7a4da50f7927c798d9b8d1a5c46883584 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 12:44:20 -0600 Subject: [PATCH 030/239] config file fix --- config/default.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.json b/config/default.json index f16008a00..12b35e6cf 100644 --- a/config/default.json +++ b/config/default.json @@ -6,5 +6,5 @@ "enable_v3" : true, "enable_themes" : true, "local_environments" : ["docker", "local"], - "publicUrl" : "https://homebrewery.naturalcrit.com", + "publicUrl" : "https://homebrewery.naturalcrit.com" } From 695324832c428c10e465c6e1058aa472a7c7189c Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 12:56:33 -0600 Subject: [PATCH 031/239] more heroku debug --- server/homebrew.api.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 649bd27c2..a924214e6 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -103,7 +103,8 @@ const api = { }; } }; - + console.log('We found themes!'); + console.log(userThemes); return userThemes; }, getBrew : (accessType, stubOnly = false)=>{ @@ -163,6 +164,7 @@ const api = { // Clean up brew: fill in missing fields with defaults / fix old invalid values const userThemes = accessType != 'themes' ? await api.getUsersBrewThemes(userID, id, req, res, next) : ''; + console('Made it past userThemes'); if(stub) { stub.tags = stub.tags || undefined; // Clear empty strings stub.renderer = stub.renderer || undefined; // Clear empty strings From 0dbf6453ac124e08dbfc488c54d98477969441d6 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 13:04:03 -0600 Subject: [PATCH 032/239] more heroku debug --- server/homebrew.api.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index a924214e6..78fc1b810 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -162,6 +162,7 @@ const api = { const userID = req?.account?.username && (accessType === 'edit') ? req.account.username : stub.authors[0]; + console.log('Preparing to load user themes.'); // Clean up brew: fill in missing fields with defaults / fix old invalid values const userThemes = accessType != 'themes' ? await api.getUsersBrewThemes(userID, id, req, res, next) : ''; console('Made it past userThemes'); From 0580e45af961949d488626f5df40ab3476826fe9 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 13:11:49 -0600 Subject: [PATCH 033/239] more heroku debug --- server/homebrew.api.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 78fc1b810..d5d9b5602 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -85,8 +85,10 @@ const api = { return userThemes; } + console.log(`Looking for Theme Brews for ${username} that aren't ${id}`); const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects .catch((error)=>{throw 'Can not find brews';}); + console.log(brews); for await (const brew of brews) { api.getBrew('themes', req=req, res=res, next=next); From 2aaae95e8947ba20bb78c30903139d07c99ac9cd Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 13:16:57 -0600 Subject: [PATCH 034/239] more heroku debug --- server/homebrew.api.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index d5d9b5602..c2535e973 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -72,7 +72,8 @@ const api = { 'tags', 'editId', 'thumbnail', - 'textBin' + 'textBin', + 'text' ]; const userThemes = { @@ -86,7 +87,7 @@ const api = { } console.log(`Looking for Theme Brews for ${username} that aren't ${id}`); - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }}) //lean() converts results to JSObjects .catch((error)=>{throw 'Can not find brews';}); console.log(brews); From 317b80bf4dd340c58102b5e5da8439e3310e101f Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 13:20:57 -0600 Subject: [PATCH 035/239] more heroku debug --- server/homebrew.api.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index c2535e973..0716878f3 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -87,13 +87,15 @@ const api = { } console.log(`Looking for Theme Brews for ${username} that aren't ${id}`); - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }}) //lean() converts results to JSObjects + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects .catch((error)=>{throw 'Can not find brews';}); console.log(brews); for await (const brew of brews) { - api.getBrew('themes', req=req, res=res, next=next); + const foo = api.getBrew('themes', req=req, res=res, next=next); const brewTheme = req.brew; + console.log(req); + console.log(foo); if(brewTheme) { splitTextStyleAndMetadata(brewTheme); userThemes.Brew[`#${brew.editId}`] = { @@ -168,7 +170,7 @@ const api = { console.log('Preparing to load user themes.'); // Clean up brew: fill in missing fields with defaults / fix old invalid values const userThemes = accessType != 'themes' ? await api.getUsersBrewThemes(userID, id, req, res, next) : ''; - console('Made it past userThemes'); + console.log('Made it past userThemes'); if(stub) { stub.tags = stub.tags || undefined; // Clear empty strings stub.renderer = stub.renderer || undefined; // Clear empty strings From 1dc73a951ed3dce6bcca28caefdce237252dbe08 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 13:35:08 -0600 Subject: [PATCH 036/239] more heroku debug --- server/homebrew.api.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 0716878f3..558465f39 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -86,16 +86,12 @@ const api = { return userThemes; } - console.log(`Looking for Theme Brews for ${username} that aren't ${id}`); const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects .catch((error)=>{throw 'Can not find brews';}); - console.log(brews); for await (const brew of brews) { const foo = api.getBrew('themes', req=req, res=res, next=next); const brewTheme = req.brew; - console.log(req); - console.log(foo); if(brewTheme) { splitTextStyleAndMetadata(brewTheme); userThemes.Brew[`#${brew.editId}`] = { @@ -108,8 +104,6 @@ const api = { }; } }; - console.log('We found themes!'); - console.log(userThemes); return userThemes; }, getBrew : (accessType, stubOnly = false)=>{ @@ -167,10 +161,8 @@ const api = { const userID = req?.account?.username && (accessType === 'edit') ? req.account.username : stub.authors[0]; - console.log('Preparing to load user themes.'); // Clean up brew: fill in missing fields with defaults / fix old invalid values const userThemes = accessType != 'themes' ? await api.getUsersBrewThemes(userID, id, req, res, next) : ''; - console.log('Made it past userThemes'); if(stub) { stub.tags = stub.tags || undefined; // Clear empty strings stub.renderer = stub.renderer || undefined; // Clear empty strings From 8765bc800d27b630ae81444135a0072812de22a9 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 13:38:48 -0600 Subject: [PATCH 037/239] more heroku debug --- server/homebrew.api.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 558465f39..ffd857da7 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -86,9 +86,10 @@ const api = { return userThemes; } - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme', 'type:theme', 'type:Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects .catch((error)=>{throw 'Can not find brews';}); + console.log(brews); for await (const brew of brews) { const foo = api.getBrew('themes', req=req, res=res, next=next); const brewTheme = req.brew; From e639a32822068f7a3dd1b79756245cd88712ce25 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 13:41:58 -0600 Subject: [PATCH 038/239] more heroku debug --- server/homebrew.api.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index ffd857da7..421c606dd 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -90,6 +90,7 @@ const api = { .catch((error)=>{throw 'Can not find brews';}); console.log(brews); + console.log(brews.length); for await (const brew of brews) { const foo = api.getBrew('themes', req=req, res=res, next=next); const brewTheme = req.brew; From 00cfd427b122b8b4b0ea120d5337782bfb936958 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 13:47:40 -0600 Subject: [PATCH 039/239] more heroku debug --- server/homebrew.api.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 421c606dd..1c13eb316 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -89,8 +89,6 @@ const api = { const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme', 'type:theme', 'type:Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects .catch((error)=>{throw 'Can not find brews';}); - console.log(brews); - console.log(brews.length); for await (const brew of brews) { const foo = api.getBrew('themes', req=req, res=res, next=next); const brewTheme = req.brew; @@ -164,7 +162,8 @@ const api = { const userID = req?.account?.username && (accessType === 'edit') ? req.account.username : stub.authors[0]; // Clean up brew: fill in missing fields with defaults / fix old invalid values - const userThemes = accessType != 'themes' ? await api.getUsersBrewThemes(userID, id, req, res, next) : ''; + const userThemes = accessType != 'themes' ? await api.getUsersBrewThemes(userID, id, req, res, next) : {}; + console.log(userThemes); if(stub) { stub.tags = stub.tags || undefined; // Clear empty strings stub.renderer = stub.renderer || undefined; // Clear empty strings From dfca664f6ea3dd0dfcfdfbb6bcadf0f73d3e19f3 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 13:53:54 -0600 Subject: [PATCH 040/239] more heroku debug --- server/homebrew.api.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 1c13eb316..1168084aa 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -82,10 +82,6 @@ const api = { } }; - if(!username || !id) { - return userThemes; - } - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme', 'type:theme', 'type:Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects .catch((error)=>{throw 'Can not find brews';}); From 870cbc103dd4af53398d1b030012657e216feb35 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 13:57:32 -0600 Subject: [PATCH 041/239] more heroku debug --- server/homebrew.api.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 1168084aa..07698800a 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -88,6 +88,9 @@ const api = { for await (const brew of brews) { const foo = api.getBrew('themes', req=req, res=res, next=next); const brewTheme = req.brew; + console.log(`Looking at themes.`); + console.log(brewTheme); + console.log(`Looked at themes.`); if(brewTheme) { splitTextStyleAndMetadata(brewTheme); userThemes.Brew[`#${brew.editId}`] = { From e2ba0ec0599bcaad896f059a5ce7f70ac3617192 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 13:59:36 -0600 Subject: [PATCH 042/239] more heroku debug --- server/homebrew.api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 07698800a..d5746e242 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -89,7 +89,7 @@ const api = { const foo = api.getBrew('themes', req=req, res=res, next=next); const brewTheme = req.brew; console.log(`Looking at themes.`); - console.log(brewTheme); + console.log(foo); console.log(`Looked at themes.`); if(brewTheme) { splitTextStyleAndMetadata(brewTheme); From 47ea2f6ed7658783b3b043ae2174ccd064bc0797 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 14:04:16 -0600 Subject: [PATCH 043/239] more heroku debug --- server/homebrew.api.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index d5746e242..f342735e2 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -170,6 +170,10 @@ const api = { stub.userThemes = userThemes; } + if ( accessType == 'themes' ) { + console.log('Themes loaded'); + console.log(stub); + } req.brew = stub ?? {}; next(); }; From 9adafbd473807a8574827b62f792514b081fc59a Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 14:12:13 -0600 Subject: [PATCH 044/239] more heroku debug --- server/homebrew.api.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index f342735e2..c053fdbdb 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -86,10 +86,10 @@ const api = { .catch((error)=>{throw 'Can not find brews';}); for await (const brew of brews) { - const foo = api.getBrew('themes', req=req, res=res, next=next); + api.getBrew('themes', req=req, res=res, next=next); const brewTheme = req.brew; console.log(`Looking at themes.`); - console.log(foo); + console.log(req); console.log(`Looked at themes.`); if(brewTheme) { splitTextStyleAndMetadata(brewTheme); @@ -111,6 +111,7 @@ const api = { // Get relevant IDs for the brew const { id, googleId } = api.getId(req); + console.log(`id: ${id}`); // Try to find the document in the Homebrewery database -- if it doesn't exist, that's fine. let stub = await HomebrewModel.get(accessType === 'edit' ? { editId: id } : { shareId: id }) From 87502f4249c294fcf575a086108b23ccfef2540e Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 18:55:12 -0600 Subject: [PATCH 045/239] Heavy rework for usertheme parents. --- client/homebrew/brewRenderer/brewRenderer.jsx | 8 ++-- client/homebrew/pages/printPage/printPage.jsx | 9 ++-- server/app.js | 3 +- server/homebrew.api.js | 43 ++++++++----------- 4 files changed, 31 insertions(+), 32 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index edc43b040..2d6040e7c 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -200,13 +200,15 @@ const BrewRenderer = (props)=>{ rendererPath += '/'; } - if(baseThemePath && baseThemePath[0] === '#') { - baseThemePath = baseThemePath.slice(1); + if(rendererPath == '') { + baseThemePath = 'Brew'; baseRendererPath = ''; } else { baseRendererPath += '/'; } + const staticOrUserParent = props?.theme[0] == '#' ? `/cssParent/${themePath}` : `/css/${baseRendererPath}${baseThemePath}`; + return ( <> {/*render dummy page while iFrame is mounting.*/} @@ -235,7 +237,7 @@ const BrewRenderer = (props)=>{
{baseThemePath && - + } diff --git a/client/homebrew/pages/printPage/printPage.jsx b/client/homebrew/pages/printPage/printPage.jsx index ea409bd43..954d16e0b 100644 --- a/client/homebrew/pages/printPage/printPage.jsx +++ b/client/homebrew/pages/printPage/printPage.jsx @@ -110,19 +110,20 @@ const PrintPage = createClass({ rendererPath += '/'; } - if(baseThemePath && baseThemePath[0] == '#') { - baseThemePath = baseThemePath.slice(1); + if(rendererPath == '') { + baseThemePath = 'Brew'; baseRendererPath = ''; } else { baseRendererPath += '/'; } - + + const staticOrUserParent = this.state.brew.theme[0] == '#' ? `/cssParent/${themePath}` : `/css/${baseRendererPath}${baseThemePath}`; return
{baseThemePath && - + } {/* Apply CSS from Style tab */} diff --git a/server/app.js b/server/app.js index 91798d808..b0fe3f465 100644 --- a/server/app.js +++ b/server/app.js @@ -9,7 +9,7 @@ const yaml = require('js-yaml'); const app = express(); const config = require('./config.js'); -const { homebrewApi, getBrew, getBrewThemeWithCSS, getStaticTheme } = require('./homebrew.api.js'); +const { homebrewApi, getBrew, getBrewThemeWithCSS, getStaticTheme, getBrewThemeParent } = require('./homebrew.api.js'); const GoogleActions = require('./googleActions.js'); const serveCompressedStaticAssets = require('./static-assets.mv.js'); const sanitizeFilename = require('sanitize-filename'); @@ -94,6 +94,7 @@ app.get('/robots.txt', (req, res)=>{ app.get('/css/:id', asyncHandler(getBrew('edit', true)), asyncHandler(getBrewThemeWithCSS)); app.get('/css/:engine/:id/', asyncHandler(getStaticTheme)); +app.get('/cssParent/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getBrewThemeParent)); //Home page diff --git a/server/homebrew.api.js b/server/homebrew.api.js index c053fdbdb..b2f5f941c 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -86,23 +86,15 @@ const api = { .catch((error)=>{throw 'Can not find brews';}); for await (const brew of brews) { - api.getBrew('themes', req=req, res=res, next=next); - const brewTheme = req.brew; - console.log(`Looking at themes.`); - console.log(req); - console.log(`Looked at themes.`); - if(brewTheme) { - splitTextStyleAndMetadata(brewTheme); - userThemes.Brew[`#${brew.editId}`] = { - name : brew.title, - renderer : 'V3', - baseTheme : brewTheme.theme, - baseSnippets : false, - path : `#${brew.editId}`, - thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' - }; - } - }; + userThemes.Brew[`#${brew.editId}`] = { + name : brew.title, + renderer : 'V3', + baseTheme : '', + baseSnippets : false, + path : `#${brew.editId}`, + thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' + }; + } return userThemes; }, getBrew : (accessType, stubOnly = false)=>{ @@ -111,10 +103,9 @@ const api = { // Get relevant IDs for the brew const { id, googleId } = api.getId(req); - console.log(`id: ${id}`); // Try to find the document in the Homebrewery database -- if it doesn't exist, that's fine. - let stub = await HomebrewModel.get(accessType === 'edit' ? { editId: id } : { shareId: id }) + let stub = await HomebrewModel.get((accessType === 'edit') || (accessType === 'theme') ? { editId: id } : { shareId: id }) .catch((err)=>{ if(googleId) { console.warn(`Unable to find document stub for ${accessType}Id ${id}`); @@ -163,7 +154,6 @@ const api = { // Clean up brew: fill in missing fields with defaults / fix old invalid values const userThemes = accessType != 'themes' ? await api.getUsersBrewThemes(userID, id, req, res, next) : {}; - console.log(userThemes); if(stub) { stub.tags = stub.tags || undefined; // Clear empty strings stub.renderer = stub.renderer || undefined; // Clear empty strings @@ -171,10 +161,6 @@ const api = { stub.userThemes = userThemes; } - if ( accessType == 'themes' ) { - console.log('Themes loaded'); - console.log(stub); - } req.brew = stub ?? {}; next(); }; @@ -293,6 +279,15 @@ const api = { const parentThemeImport = `@import url(\"${req.brew.theme[0] != '#' ? staticTheme : userTheme}\");\n\n/* From Brew: ${req.brew.title}*/\n\n`; return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}${req.brew.style}`); }, + getBrewThemeParent : async (req, res)=>{ + const brew = req.brew; + splitTextStyleAndMetadata(brew); + res.setHeader('Content-Type', 'text/css'); + const staticTheme = `/css/${req.brew.renderer}/${req.brew.theme}`; + const userTheme = `/css/${req.brew.theme.slice(1)}`; + const parentThemeImport = `@import url(\"${req.brew.theme[0] != '#' ? staticTheme : userTheme}\");\n\n/* From Brew: ${req.brew.title}*/\n\n`; + return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}`); + }, getStaticTheme : async(req, res)=>{ const themeParent = isStaticTheme(req.params.engine, req.params.id); if(themeParent === undefined){ From d9dade718131e2d1f8b45c345fc5f4da94975d45 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 19:04:12 -0600 Subject: [PATCH 046/239] Fix User Brew display label in metadata editor --- client/homebrew/editor/metadataEditor/metadataEditor.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 573fb00c3..d402d9955 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -226,7 +226,7 @@ const MetadataEditor = createClass({ dropdown =
- {`${_.upperFirst(this.props.metadata.themeClass?this.props.metadata.themeClass:this.props.metadata.renderer)} : ${currentTheme.name}`} + {`${_.upperFirst(currentThemePath)} : ${currentTheme.name}`}
{/*listThemes('Legacy')*/} {listThemes('V3')} From 33933ef21297d4dc3913a0c327b9ba7115316e34 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 19:14:16 -0600 Subject: [PATCH 047/239] Attempted fix on access --- server/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/app.js b/server/app.js index b0fe3f465..d6c56c68b 100644 --- a/server/app.js +++ b/server/app.js @@ -92,7 +92,7 @@ app.get('/robots.txt', (req, res)=>{ // Theme -app.get('/css/:id', asyncHandler(getBrew('edit', true)), asyncHandler(getBrewThemeWithCSS)); +app.get('/css/:id', asyncHandler(getBrew('theme', true)), asyncHandler(getBrewThemeWithCSS)); app.get('/css/:engine/:id/', asyncHandler(getStaticTheme)); app.get('/cssParent/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getBrewThemeParent)); From a666c8def342c1d35a5718b75ff92ab159436174 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 19:20:16 -0600 Subject: [PATCH 048/239] Heroku debug --- server/homebrew.api.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index b2f5f941c..658c0fea0 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -271,6 +271,8 @@ const api = { res.status(200).send(saved); }, getBrewThemeWithCSS : async (req, res)=>{ + console.log('I made it out!'); + console.log(req.brew); const brew = req.brew; splitTextStyleAndMetadata(brew); res.setHeader('Content-Type', 'text/css'); From 1ac510af3dcfcc71ae9a133494be1bf8f978be79 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 19:24:16 -0600 Subject: [PATCH 049/239] Heroku debug --- server/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/app.js b/server/app.js index d6c56c68b..faf557e61 100644 --- a/server/app.js +++ b/server/app.js @@ -92,7 +92,7 @@ app.get('/robots.txt', (req, res)=>{ // Theme -app.get('/css/:id', asyncHandler(getBrew('theme', true)), asyncHandler(getBrewThemeWithCSS)); +app.get('/css/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getBrewThemeWithCSS)); app.get('/css/:engine/:id/', asyncHandler(getStaticTheme)); app.get('/cssParent/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getBrewThemeParent)); From eb4ecf853b43b4979bed6646924f11dd6e3d9152 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 22:50:24 -0600 Subject: [PATCH 050/239] Fix Jest issues I was able to understand --- client/homebrew/brewRenderer/brewRenderer.jsx | 2 +- client/homebrew/pages/printPage/printPage.jsx | 2 +- server/homebrew.api.js | 6 +++--- server/homebrew.api.spec.js | 9 +++++---- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 2d3e5136e..9ab09301b 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -207,7 +207,7 @@ const BrewRenderer = (props)=>{ baseRendererPath += '/'; } - const staticOrUserParent = props?.theme[0] == '#' ? `/cssParent/${themePath}` : `/css/${baseRendererPath}${baseThemePath}`; + const staticOrUserParent = (props.theme && props?.theme[0] == '#') ? `/cssParent/${themePath}` : `/css/${baseRendererPath}${baseThemePath}`; return ( <> diff --git a/client/homebrew/pages/printPage/printPage.jsx b/client/homebrew/pages/printPage/printPage.jsx index cfd3c2318..d9ff2ca1a 100644 --- a/client/homebrew/pages/printPage/printPage.jsx +++ b/client/homebrew/pages/printPage/printPage.jsx @@ -117,7 +117,7 @@ const PrintPage = createClass({ baseRendererPath += '/'; } - const staticOrUserParent = this.state.brew.theme[0] == '#' ? `/cssParent/${themePath}` : `/css/${baseRendererPath}${baseThemePath}`; + const staticOrUserParent = (this.state.brew.theme && this.state.brew?.theme[0] == '#') ? `/cssParent/${themePath}` : `/css/${baseRendererPath}${baseThemePath}`; return
diff --git a/server/homebrew.api.js b/server/homebrew.api.js index b2f5f941c..af5ef259e 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -82,8 +82,7 @@ const api = { } }; - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme', 'type:theme', 'type:Theme'] }, editId: { $ne: id } }) //lean() converts results to JSObjects - .catch((error)=>{throw 'Can not find brews';}); + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme', 'type:theme', 'type:Theme'] }, editId: { $ne: id } }); for await (const brew of brews) { userThemes.Brew[`#${brew.editId}`] = { @@ -150,7 +149,8 @@ const api = { throw { name: 'BrewLoad Error', message: 'Brew not found', status: 404, HBErrorCode: '05', accessType: accessType, brewId: id }; } - const userID = req?.account?.username && (accessType === 'edit') ? req.account.username : stub.authors[0]; + const mainAuthor = stub.authors ? stub.authors[0] : ''; + const userID = req?.account?.username && (accessType === 'edit') ? req.account.username : mainAuthor; // Clean up brew: fill in missing fields with defaults / fix old invalid values const userThemes = accessType != 'themes' ? await api.getUsersBrewThemes(userID, id, req, res, next) : {}; diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index c82ce5227..c0c2619a2 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -45,8 +45,9 @@ describe('Tests for api', ()=>{ model.mockImplementation((brew)=>modelBrew(brew)); res = { - status : jest.fn(()=>res), - send : jest.fn(()=>{}) + status : jest.fn(()=>res), + send : jest.fn(()=>{}), + setHeader : jest.fn(()=>{}) }; api = require('./homebrew.api'); @@ -611,7 +612,7 @@ brew`); }; api.getStaticTheme(req, res); const sent = res.send.mock.calls[0][0]; - expect(sent).toBe('@import /themes/V3/5ePHB/style.css\n'); + expect(sent).toBe('@import url("/themes/V3/5ePHB/style.css");\n/* Static Theme 5e PHB */\n'); expect(res.status).toHaveBeenCalledWith(200); }); it('should return an import of the theme including a parent.', async ()=>{ @@ -623,7 +624,7 @@ brew`); }; api.getStaticTheme(req, res); const sent = res.send.mock.calls[0][0]; - expect(sent).toBe('@import /api/css/V3/5ePHB\n@import /themes/V3/5eDMG/style.css\n'); + expect(sent).toBe('@import url("/css/V3/5ePHB");\n/* Static Theme 5e PHB */\n@import url("/themes/V3/5eDMG/style.css");\n/* Static Theme 5e DMG */\n'); expect(res.status).toHaveBeenCalledWith(200); }); it('should fail for an invalid static theme.', async()=>{ From e487f9a9517a035f9aa4edc909835f771853d2b6 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 6 Mar 2024 23:27:43 -0600 Subject: [PATCH 051/239] Fix remaining jest issues --- package-lock.json | 922 ++++++++++++++++-------------------- package.json | 14 +- server/homebrew.api.js | 24 +- server/homebrew.api.spec.js | 7 +- 4 files changed, 425 insertions(+), 542 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ab132c11..9f39b3bd5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.24.0", - "@babel/plugin-transform-runtime": "^7.24.0", - "@babel/preset-env": "^7.24.0", + "@babel/core": "^7.23.9", + "@babel/plugin-transform-runtime": "^7.23.9", + "@babel/preset-env": "^7.23.9", "@babel/preset-react": "^7.23.3", "@googleapis/drive": "^8.7.0", "body-parser": "^1.20.2", @@ -22,7 +22,7 @@ "create-react-class": "^15.7.0", "dedent-tabs": "^0.10.3", "expr-eval": "^2.0.2", - "express": "^4.18.3", + "express": "^4.18.2", "express-async-handler": "^1.2.0", "express-static-gzip": "2.1.7", "fs-extra": "11.2.0", @@ -36,13 +36,13 @@ "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", - "mongoose": "^8.2.1", + "mongoose": "^8.2.0", "nanoid": "3.3.4", "nconf": "^0.12.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-frame-component": "^4.1.3", - "react-router-dom": "6.22.2", + "react-router-dom": "6.22.1", "sanitize-filename": "1.6.3", "superagent": "^8.1.2", "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" @@ -50,7 +50,7 @@ "devDependencies": { "eslint": "^8.57.0", "eslint-plugin-jest": "^27.9.0", - "eslint-plugin-react": "^7.34.0", + "eslint-plugin-react": "^7.33.2", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", "postcss-less": "^6.0.0", @@ -107,20 +107,20 @@ } }, "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -340,9 +340,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "engines": { "node": ">=6.9.0" } @@ -450,13 +450,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" @@ -476,9 +476,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1242,13 +1242,13 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", - "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.23.3" }, @@ -1456,12 +1456,12 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", - "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", + "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", "dependencies": { "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.22.5", "babel-plugin-polyfill-corejs2": "^0.4.8", "babel-plugin-polyfill-corejs3": "^0.9.0", "babel-plugin-polyfill-regenerator": "^0.5.5", @@ -1605,13 +1605,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", - "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", + "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", @@ -1664,7 +1664,7 @@ "@babel/plugin-transform-new-target": "^7.23.3", "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.24.0", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", "@babel/plugin-transform-object-super": "^7.23.3", "@babel/plugin-transform-optional-catch-binding": "^7.23.4", "@babel/plugin-transform-optional-chaining": "^7.23.4", @@ -1746,22 +1746,22 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", @@ -1769,8 +1769,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1779,9 +1779,9 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -2838,9 +2838,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.2.tgz", - "integrity": "sha512-+Rnav+CaoTE5QJc4Jcwh5toUpnVLKYbpU6Ys0zqbakqbaLQHeglLVHPfxOiQqdNmUy5C2lXz5dwC6tQNX2JW2Q==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.1.tgz", + "integrity": "sha512-zcU0gM3z+3iqj8UX45AmWY810l3oUmXM7uH4dt5xtzvMhRtYVhKGOmgOd1877dOPPepfCjUv57w+syamWIYe7w==", "engines": { "node": ">=14.0.0" } @@ -3371,16 +3371,13 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3392,15 +3389,15 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { @@ -3427,34 +3424,15 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.findlast": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", - "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3464,44 +3442,30 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", - "es-shim-unscopables": "^1.0.2" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -3621,13 +3585,10 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, "engines": { "node": ">= 0.4" }, @@ -4376,18 +4337,12 @@ "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5168,29 +5123,12 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -5514,52 +5452,50 @@ } }, "node_modules/es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "hasown": "^2.0.1", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.3", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -5568,72 +5504,49 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-iterator-helpers": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", - "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.13.tgz", + "integrity": "sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.4", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.3", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", + "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.0", + "safe-array-concat": "^1.0.0" } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "has": "^1.0.3" } }, "node_modules/es-to-primitive": { @@ -5755,29 +5668,27 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", - "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", + "resolve": "^2.0.0-next.4", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" @@ -5799,12 +5710,12 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -6132,13 +6043,13 @@ "integrity": "sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==" }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -6185,6 +6096,29 @@ "serve-static": "^1.14.1" } }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -6206,6 +6140,20 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6570,23 +6518,20 @@ } }, "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -6652,18 +6597,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", + "function-bind": "^1.1.1", + "has": "^1.0.3", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6691,14 +6632,13 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -6906,6 +6846,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -6974,20 +6915,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, "dependencies": { - "es-define-property": "^1.0.0" + "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "engines": { "node": ">= 0.4" }, @@ -7007,12 +6949,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7090,17 +7032,6 @@ "minimalistic-assert": "^1.0.1" } }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -7432,13 +7363,13 @@ } }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", "side-channel": "^1.0.4" }, "engines": { @@ -7476,16 +7407,14 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7569,11 +7498,11 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { - "hasown": "^2.0.0" + "has": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7718,9 +7647,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { "node": ">= 0.4" @@ -7807,15 +7736,12 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7863,12 +7789,16 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.14" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8064,16 +7994,16 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", + "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", "dev": true, "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", + "define-properties": "^1.1.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "has-tostringtag": "^1.0.0", + "reflect.getprototypeof": "^1.0.3" } }, "node_modules/jest": { @@ -10529,9 +10459,9 @@ } }, "node_modules/mongoose": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.2.1.tgz", - "integrity": "sha512-UgZZbXSJH0pdU936qj3FyVI+sBsMoGowFnL5R/RYrA50ayn6+ZYdVr8ehsRgNxRcMYwoNld5XzHIfkFRJTePEw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.2.0.tgz", + "integrity": "sha512-la93n6zCYRbPS+c5N9oTDAktvREy5OT9OCljp1Tah0y3+p8UPMTAoabWaLZMdzYruOtF9/9GRf6MasaZjiZP1A==", "dependencies": { "bson": "^6.2.0", "kareem": "2.5.1", @@ -11072,9 +11002,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11100,13 +11030,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -11118,28 +11048,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -11149,13 +11079,13 @@ } }, "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11173,14 +11103,14 @@ } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -11552,15 +11482,6 @@ "node": ">=0.10.0" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -11958,11 +11879,11 @@ "dev": true }, "node_modules/react-router": { - "version": "6.22.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.2.tgz", - "integrity": "sha512-YD3Dzprzpcq+tBMHBS822tCjnWD3iIZbTeSXMY9LPSG541EfoBGyZ3bS25KEnaZjLcmQpw2AVLkFyfgXY8uvcw==", + "version": "6.22.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.1.tgz", + "integrity": "sha512-0pdoRGwLtemnJqn1K0XHUbnKiX0S4X8CgvVVmHGOWmofESj31msHo/1YiqcJWK7Wxfq2a4uvvtS01KAQyWK/CQ==", "dependencies": { - "@remix-run/router": "1.15.2" + "@remix-run/router": "1.15.1" }, "engines": { "node": ">=14.0.0" @@ -11972,12 +11893,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.2.tgz", - "integrity": "sha512-WgqxD2qySEIBPZ3w0sHH+PUAiamDeszls9tzqMPBDA1YYVucTBXLU7+gtRfcSnhe92A3glPnvSxK2dhNoAVOIQ==", + "version": "6.22.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.1.tgz", + "integrity": "sha512-iwMyyyrbL7zkKY7MRjOVRy+TMnS/OPusaFVxM2P11x9dzSzGmLsebkCvYirGq0DWB9K9hOspHYYtDz33gE5Duw==", "dependencies": { - "@remix-run/router": "1.15.2", - "react-router": "6.22.2" + "@remix-run/router": "1.15.1", + "react-router": "6.22.1" }, "engines": { "node": ">=14.0.0" @@ -12122,16 +12043,15 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", - "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", + "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0", - "get-intrinsic": "^1.2.3", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.1", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -12207,15 +12127,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -12424,13 +12343,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -12475,18 +12394,15 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12580,37 +12496,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -13264,19 +13149,18 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" }, "funding": { @@ -13284,14 +13168,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -13301,28 +13185,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14066,30 +13950,29 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -14099,17 +13982,16 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -14119,20 +14001,14 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "is-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14980,16 +14856,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" diff --git a/package.json b/package.json index 9b9b17ca0..b44d1cc4d 100644 --- a/package.json +++ b/package.json @@ -80,9 +80,9 @@ ] }, "dependencies": { - "@babel/core": "^7.24.0", - "@babel/plugin-transform-runtime": "^7.24.0", - "@babel/preset-env": "^7.24.0", + "@babel/core": "^7.23.9", + "@babel/plugin-transform-runtime": "^7.23.9", + "@babel/preset-env": "^7.23.9", "@babel/preset-react": "^7.23.3", "@googleapis/drive": "^8.7.0", "body-parser": "^1.20.2", @@ -92,7 +92,7 @@ "create-react-class": "^15.7.0", "dedent-tabs": "^0.10.3", "expr-eval": "^2.0.2", - "express": "^4.18.3", + "express": "^4.18.2", "express-async-handler": "^1.2.0", "express-static-gzip": "2.1.7", "fs-extra": "11.2.0", @@ -106,13 +106,13 @@ "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", - "mongoose": "^8.2.1", + "mongoose": "^8.2.0", "nanoid": "3.3.4", "nconf": "^0.12.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-frame-component": "^4.1.3", - "react-router-dom": "6.22.2", + "react-router-dom": "6.22.1", "sanitize-filename": "1.6.3", "superagent": "^8.1.2", "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" @@ -120,7 +120,7 @@ "devDependencies": { "eslint": "^8.57.0", "eslint-plugin-jest": "^27.9.0", - "eslint-plugin-react": "^7.34.0", + "eslint-plugin-react": "^7.33.2", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", "postcss-less": "^6.0.0", diff --git a/server/homebrew.api.js b/server/homebrew.api.js index af5ef259e..cb9176a72 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -9,6 +9,7 @@ const yaml = require('js-yaml'); const asyncHandler = require('express-async-handler'); const { nanoid } = require('nanoid'); + const { DEFAULT_BREW, DEFAULT_BREW_LOAD } = require('./brewDefaults.js'); const themes = require('../themes/themes.json'); @@ -66,7 +67,7 @@ const api = { } return { id, googleId }; }, - getUsersBrewThemes : async (username, id, req, res, next)=>{ + getUsersBrewThemes : async (username, id)=>{ const fields = [ 'title', 'tags', @@ -84,16 +85,19 @@ const api = { const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme', 'type:theme', 'type:Theme'] }, editId: { $ne: id } }); - for await (const brew of brews) { - userThemes.Brew[`#${brew.editId}`] = { - name : brew.title, - renderer : 'V3', - baseTheme : '', - baseSnippets : false, - path : `#${brew.editId}`, - thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' - }; + if(brews) { + for await (const brew of brews) { + userThemes.Brew[`#${brew.editId}`] = { + name : brew.title, + renderer : 'V3', + baseTheme : '', + baseSnippets : false, + path : `#${brew.editId}`, + thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' + }; + } } + return userThemes; }, getBrew : (accessType, stubOnly = false)=>{ diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index c0c2619a2..9c9813a91 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -287,6 +287,9 @@ describe('Tests for api', ()=>{ thumbnail : '', textBin : undefined, version : undefined, + userThemes : { + Brew: {} + }, createdAt : undefined, gDrive : false, style : undefined, @@ -581,7 +584,7 @@ brew`); api.getBrewThemeWithCSS(req, res); const sent = res.send.mock.calls[0][0]; - expect(sent).toBe(`// From Theme: test brew\n\n@import /api/css/V3/5ePHB/styles.css\n\nI Have a style!`); + expect(sent).toBe(`@import url("/css/V3/5ePHB");\n\n/* From Brew: test brew*/\n\nI Have a style!`); expect(res.status).toHaveBeenCalledWith(200); }); }); @@ -597,7 +600,7 @@ brew`); api.getBrewThemeWithCSS(req, res); const sent = res.send.mock.calls[0][0]; - expect(sent).toBe(`// From Theme: test brew\n\n@import /api/css/IamATheme\n\nI Have a style!`); + expect(sent).toBe(`@import url("/css/IamATheme");\n\n/* From Brew: test brew*/\n\nI Have a style!`); expect(res.status).toHaveBeenCalledWith(200); }); }); From f2f32c35eacc36c4b25559d29f604213eb2f5da2 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sun, 10 Mar 2024 11:54:48 -0500 Subject: [PATCH 052/239] Ensure shared pages work with user themes. --- client/homebrew/pages/sharePage/sharePage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 981ad0126..07a1940fb 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -81,7 +81,7 @@ const SharePage = createClass({
- +
; } From 1705e66be2ac52cef7b6ba2349f1725522427cf9 Mon Sep 17 00:00:00 2001 From: dbolack Date: Sat, 23 Mar 2024 18:57:53 -0500 Subject: [PATCH 053/239] Corrections per PR Remove off by one error realted to change in page number detection. Dewrap quotes from exclude screen. --- themes/V3/5ePHB/snippets/tableOfContents.gen.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index c12205c69..d43ff3854 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -5,7 +5,7 @@ const getTOC = ()=>{ const add1 = (title, page)=>{ res.push({ title : title, - page : page + 1, + page : page, children : [] }); }; @@ -13,7 +13,7 @@ const getTOC = ()=>{ if(!_.last(res)) add1(null, page); _.last(res).children.push({ title : title, - page : page + 1, + page : page, children : [] }); }; @@ -22,7 +22,7 @@ const getTOC = ()=>{ if(!_.last(_.last(res).children)) add2(null, page); _.last(_.last(res).children).children.push({ title : title, - page : page + 1, + page : page, children : [] }); }; @@ -35,7 +35,7 @@ const getTOC = ()=>{ _.each(headings, (heading)=>{ const onPage = parseInt(heading.closest('.page,.phb').id?.replace(/^p/, '')); const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC'); - if(ToCExclude != '"exclude"') { + if(ToCExclude != 'exclude') { if(!isNaN(onPage)) { const headingText = heading.innerText; if(heading.tagName == 'H1') { From 7ca10ff5a48510fe6593fb77fa9fa5ed20232394 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 25 Mar 2024 16:13:07 -0500 Subject: [PATCH 054/239] Add requested additions to code Add snippet additions to handle Add h4, Add h4-h5, add h4-h6 Add collection of headers h4-h6 and rendering of h4 to h6. --- themes/V3/5ePHB/snippets.js | 31 ++++++- .../V3/5ePHB/snippets/tableOfContents.gen.js | 81 +++++++++++++++++-- themes/V3/5ePHB/style.less | 16 ++++ 3 files changed, 120 insertions(+), 8 deletions(-) diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index c0933d70d..c8b3dbde1 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -21,9 +21,34 @@ module.exports = [ view : 'text', snippets : [ { - name : 'Table of Contents', - icon : 'fas fa-book', - gen : TableOfContentsGen + name : 'Table of Contents', + icon : 'fas fa-book', + gen : TableOfContentsGen, + subsnippets : [ + { + name : 'Table of Contents', + icon : 'fas fa-book', + gen : TableOfContentsGen, + }, + { + name : 'Include H4', + icon : 'fas fa-dice-four', + gen : dedent `{{tocH4 + }}`, + }, + { + name : 'Include H4, H5', + icon : 'fas fa-dice-five', + gen : dedent `{{tocH5 + }}`, + }, + { + name : 'Include H4-H6', + icon : 'fas fa-dice-six', + gen : dedent `{{tocH6 + }}`, + }, + ] }, { name : 'Index', diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index d43ff3854..2d3865bbf 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -26,11 +26,44 @@ const getTOC = ()=>{ children : [] }); }; + const add4 = (title, page)=>{ + if(!_.last(res)) add1(null, page); + if(!_.last(_.last(res).children)) add2(null, page); + if(!_.last(!_.last(_.last(res).children))) add3(null, page); + _.last(_.last(_.last(res).children).children).children.push({ + title : title, + page : page, + children : [] + }); + }; + const add5 = (title, page)=>{ + if(!_.last(res)) add1(null, page); + if(!_.last(_.last(res).children)) add2(null, page); + if(!_.last(!_.last(_.last(res).children))) add3(null, page); + if(!_.last(!_.last(!_.last(_.last(res).children)))) add4(null, page); + _.last(_.last(_.last(_.last(res).children).children).children).children.push({ + title : title, + page : page, + children : [] + }); + }; + const add6 = (title, page)=>{ + if(!_.last(res)) add1(null, page); + if(!_.last(_.last(res).children)) add2(null, page); + if(!_.last(!_.last(_.last(res).children))) add3(null, page); + if(!_.last(!_.last(!_.last(_.last(res).children)))) add4(null, page); + if(!_.last(!_.last(!_.last(!_.last(_.last(res).children))))) add5(null, page); + _.last(_.last(_.last(_.last(_.last(res).children).children).children).children).children.push({ + title : title, + page : page, + children : [] + }); + }; const res = []; const iframe = document.getElementById('BrewRenderer'); const iframeDocument = iframe.contentDocument || iframe.contentWindow.document; - const headings = iframeDocument.querySelectorAll('h1, h2, h3'); + const headings = iframeDocument.querySelectorAll('h1, h2, h3, h4, h5, h6'); _.each(headings, (heading)=>{ const onPage = parseInt(heading.closest('.page,.phb').id?.replace(/^p/, '')); @@ -47,6 +80,15 @@ const getTOC = ()=>{ if(heading.tagName == 'H3') { add3(headingText, onPage); } + if(heading.tagName == 'H4') { + add4(headingText, onPage); + } + if(heading.tagName == 'H5') { + add5(headingText, onPage); + } + if(heading.tagName == 'H6') { + add6(headingText, onPage); + } } } }); @@ -66,11 +108,40 @@ module.exports = function(props){ } if(g2.children.length){ _.each(g2.children, (g3, idx3)=>{ - if(g2.title !== null) { - r.push(` - [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); - } else { // Don't over-indent if no level-2 parent entry - r.push(` - [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); + if(g3.title !== null) { + if(g2.title !== null) { + r.push(` - [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); + } else { // Don't over-indent if no level-2 parent entry + r.push(` - [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); + } } + _.each(g3.children, (g4, idx4)=>{ + if(g4.title !== null) { + if(g3.title !== null) { + r.push(` - [{{ ${g4.title}}}{{ ${g4.page}}}](#p${g4.page})`); + } else { // Don't over-indent if no level-3 parent entry + r.push(` - [{{ ${g4.title}}}{{ ${g4.page}}}](#p${g4.page})`); + } + } + _.each(g4.children, (g5, idx5)=>{ + if(g5.title !== null) { + if(g4.title !== null) { + r.push(` - [{{ ${g5.title}}}{{ ${g5.page}}}](#p${g5.page})`); + } else { // Don't over-indent if no level-4 parent entry + r.push(` - [{{ ${g5.title}}}{{ ${g5.page}}}](#p${g5.page})`); + } + } + _.each(g5.children, (g6, idx6)=>{ + if(g6.title !== null) { + if(g5.title !== null) { + r.push(` - [{{ ${g6.title}}}{{ ${g6.page}}}](#p${g6.page})`); + } else { // Don't over-indent if no level-5 parent entry + r.push(` - [{{ ${g6.title}}}{{ ${g6.page}}}](#p${g6.page})`); + } + } + }); + }); + }); }); } }); diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index ceb811a23..4473ab7f8 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -791,6 +791,9 @@ // *****************************/ // Default Exclusions +h4, +h5, +h6, .page:has(.frontCover), .page:has(.backCover), .page:has(.insideCover), @@ -799,6 +802,19 @@ .noToC, .toc { --TOC: exclude; } +.tocH4 { + h4 { --TOC: include; } +} +.tocH5 { + h4 { --TOC: include; } + h5 { --TOC: include; } +} +.tocH6 { + h4 { --TOC: include; } + h5 { --TOC: include; } + h6 { --TOC: include; } +} + .page { &:has(.toc)::after { display : none; } .toc { From 40d0e7e90ed215449d604afb98774fa864cd9748 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 25 Mar 2024 16:32:03 -0500 Subject: [PATCH 055/239] Trim space off of ToC entries. --- themes/V3/5ePHB/snippets/tableOfContents.gen.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 2d3865bbf..cd8ac1e4e 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -70,7 +70,7 @@ const getTOC = ()=>{ const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC'); if(ToCExclude != 'exclude') { if(!isNaN(onPage)) { - const headingText = heading.innerText; + const headingText = heading.innerText.trim(); if(heading.tagName == 'H1') { add1(headingText, onPage); } From 9d3f7fe55673b0692b2225ca9e7f6f9d93f660b4 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 25 Mar 2024 18:58:29 -0500 Subject: [PATCH 056/239] Fix H3-H6 entries in ToC generation --- themes/V3/5ePHB/snippets/tableOfContents.gen.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index cd8ac1e4e..7c5cae7d3 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -110,33 +110,33 @@ module.exports = function(props){ _.each(g2.children, (g3, idx3)=>{ if(g3.title !== null) { if(g2.title !== null) { - r.push(` - [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); + r.push(` - #### [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); } else { // Don't over-indent if no level-2 parent entry - r.push(` - [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); + r.push(` - #### [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); } } _.each(g3.children, (g4, idx4)=>{ if(g4.title !== null) { if(g3.title !== null) { - r.push(` - [{{ ${g4.title}}}{{ ${g4.page}}}](#p${g4.page})`); + r.push(` - #### [{{ ${g4.title}}}{{ ${g4.page}}}](#p${g4.page})`); } else { // Don't over-indent if no level-3 parent entry - r.push(` - [{{ ${g4.title}}}{{ ${g4.page}}}](#p${g4.page})`); + r.push(` - #### [{{ ${g4.title}}}{{ ${g4.page}}}](#p${g4.page})`); } } _.each(g4.children, (g5, idx5)=>{ if(g5.title !== null) { if(g4.title !== null) { - r.push(` - [{{ ${g5.title}}}{{ ${g5.page}}}](#p${g5.page})`); + r.push(` - #### [{{ ${g5.title}}}{{ ${g5.page}}}](#p${g5.page})`); } else { // Don't over-indent if no level-4 parent entry - r.push(` - [{{ ${g5.title}}}{{ ${g5.page}}}](#p${g5.page})`); + r.push(` - #### [{{ ${g5.title}}}{{ ${g5.page}}}](#p${g5.page})`); } } _.each(g5.children, (g6, idx6)=>{ if(g6.title !== null) { if(g5.title !== null) { - r.push(` - [{{ ${g6.title}}}{{ ${g6.page}}}](#p${g6.page})`); + r.push(` - #### [{{ ${g6.title}}}{{ ${g6.page}}}](#p${g6.page})`); } else { // Don't over-indent if no level-5 parent entry - r.push(` - [{{ ${g6.title}}}{{ ${g6.page}}}](#p${g6.page})`); + r.push(` - #### [{{ ${g6.title}}}{{ ${g6.page}}}](#p${g6.page})`); } } }); From 211fe48e290cf649530936ad6d54a6ac4ec57cd1 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 25 Mar 2024 19:06:38 -0500 Subject: [PATCH 057/239] Attempt to block H4-h6 from existing ToCs from showing up in a new ToC. --- themes/V3/5ePHB/style.less | 3 +++ 1 file changed, 3 insertions(+) diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 4473ab7f8..9898bff0b 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -831,6 +831,9 @@ h6, text-decoration : none; &:hover { text-decoration : underline; } } + h1, h2, h3, h4, h5, h6 { + --TOC: exclude !important; + } h4 { margin-top : 0.2cm; line-height : 0.4cm; From 733b9299404888a6cb317ce5726f05e8dd3cf158 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 25 Mar 2024 19:36:30 -0500 Subject: [PATCH 058/239] Integrate code recursion from 3254. --- .../V3/5ePHB/snippets/tableOfContents.gen.js | 66 +++++-------------- 1 file changed, 18 insertions(+), 48 deletions(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 7c5cae7d3..0ae0213cc 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -95,57 +95,27 @@ const getTOC = ()=>{ return res; }; +const ToCIterate = (entries, curDepth=0)=>{ + const levelPad = ['- ###', ' - ####', ' - ####', ' - ####', ' - ####', ' - ####']; + const toc = []; + if(entries.title !== null){ + toc.push(`${levelPad[curDepth]} [{{ ${entries.title}}}{{ ${entries.page}}}](#p${entries.page})`); + } + if(entries.children.length) { + _.each(entries.children, (entry, idx)=>{ + const children = ToCIterate(entry, curDepth+1); + if(children.length) { + toc.push(...children); + } + }); + } + return toc; +}; + module.exports = function(props){ const TOC = getTOC(); const markdown = _.reduce(TOC, (r, g1, idx1)=>{ - if(g1.title !== null) { - r.push(`- ### [{{ ${g1.title}}}{{ ${g1.page}}}](#p${g1.page})`); - } - if(g1.children.length){ - _.each(g1.children, (g2, idx2)=>{ - if(g2.title !== null) { - r.push(` - #### [{{ ${g2.title}}}{{ ${g2.page}}}](#p${g2.page})`); - } - if(g2.children.length){ - _.each(g2.children, (g3, idx3)=>{ - if(g3.title !== null) { - if(g2.title !== null) { - r.push(` - #### [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); - } else { // Don't over-indent if no level-2 parent entry - r.push(` - #### [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); - } - } - _.each(g3.children, (g4, idx4)=>{ - if(g4.title !== null) { - if(g3.title !== null) { - r.push(` - #### [{{ ${g4.title}}}{{ ${g4.page}}}](#p${g4.page})`); - } else { // Don't over-indent if no level-3 parent entry - r.push(` - #### [{{ ${g4.title}}}{{ ${g4.page}}}](#p${g4.page})`); - } - } - _.each(g4.children, (g5, idx5)=>{ - if(g5.title !== null) { - if(g4.title !== null) { - r.push(` - #### [{{ ${g5.title}}}{{ ${g5.page}}}](#p${g5.page})`); - } else { // Don't over-indent if no level-4 parent entry - r.push(` - #### [{{ ${g5.title}}}{{ ${g5.page}}}](#p${g5.page})`); - } - } - _.each(g5.children, (g6, idx6)=>{ - if(g6.title !== null) { - if(g5.title !== null) { - r.push(` - #### [{{ ${g6.title}}}{{ ${g6.page}}}](#p${g6.page})`); - } else { // Don't over-indent if no level-5 parent entry - r.push(` - #### [{{ ${g6.title}}}{{ ${g6.page}}}](#p${g6.page})`); - } - } - }); - }); - }); - }); - } - }); - } + r.push(ToCIterate(g1).join('\n')); return r; }, []).join('\n'); From cdf5b29ac2c6e902bb4a64992a04d4087ce8599b Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 25 Mar 2024 19:38:26 -0500 Subject: [PATCH 059/239] Remove !important from toc.h4/h5/h6 --TOC --- themes/V3/5ePHB/style.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 9898bff0b..1dd41237c 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -832,7 +832,7 @@ h6, &:hover { text-decoration : underline; } } h1, h2, h3, h4, h5, h6 { - --TOC: exclude !important; + --TOC: exclude; } h4 { margin-top : 0.2cm; From 7690fb9287c4576bb75cd80cf6615ba65f7ff3c6 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 26 Mar 2024 09:39:15 -0500 Subject: [PATCH 060/239] Return .addToC for inline mustaches --- themes/V3/5ePHB/style.less | 2 ++ 1 file changed, 2 insertions(+) diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 1dd41237c..849786b3e 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -815,6 +815,8 @@ h6, h6 { --TOC: include; } } +.addToC { --TOC: include; } + .page { &:has(.toc)::after { display : none; } .toc { From 963ec282d3b1054293d18dd6da24fe8c0955e379 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 29 Mar 2024 20:06:16 +1300 Subject: [PATCH 061/239] Initial functionality pass --- client/homebrew/pages/editPage/editPage.jsx | 49 +++++++++++-------- .../lockNotification/lockNotification.jsx | 22 +++++++++ .../lockNotification/lockNotification.less | 17 +++++++ 3 files changed, 67 insertions(+), 21 deletions(-) create mode 100644 client/homebrew/pages/editPage/lockNotification/lockNotification.jsx create mode 100644 client/homebrew/pages/editPage/lockNotification/lockNotification.less diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index d5af310b5..a18c7f1e9 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -20,6 +20,8 @@ const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); const Editor = require('../../editor/editor.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); +const LockNotification = require('./lockNotification/lockNotification.jsx'); + const Markdown = require('naturalcrit/markdown.js'); const { DEFAULT_BREW_LOAD } = require('../../../../server/brewDefaults.js'); @@ -51,7 +53,8 @@ const EditPage = createClass({ autoSave : true, autoSaveWarning : false, unsavedTime : new Date(), - currentEditorPage : 0 + currentEditorPage : 0, + displayLockMessage : this.props.brew.lock || false }; }, savedBrew : null, @@ -390,26 +393,30 @@ const EditPage = createClass({ {this.renderNavbar()}
- - - - + {this.state.displayLockMessage ? + this.setState({ displayLockMessage: false })}/> + : + + + + + }
; } diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx new file mode 100644 index 000000000..73617e932 --- /dev/null +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx @@ -0,0 +1,22 @@ +require('./lockNotification.less'); +const React = require('react'); +const createClass = require('create-react-class'); + +const LockNotification = createClass({ + displayName : 'LockNotification', + getInitialState : function() { + return { + disableLock : ()=>{} + }; + }, + + render : function(){ + return
+

BREW LOCKED

+

{this.props.message || 'Unable to retrieve Lock Message'}

+ +
; + } +}); + +module.exports = LockNotification; diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.less b/client/homebrew/pages/editPage/lockNotification/lockNotification.less new file mode 100644 index 000000000..dac15f063 --- /dev/null +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.less @@ -0,0 +1,17 @@ +.lockNotification { + background-color: #ccc; + color: black; + padding: 10px; + margin: 25px 100px; + text-align: center; + + button { + background-color: #333; + color: white; + margin-top: 10px; + + &:hover { + background-color: #777; + } + } +} \ No newline at end of file From 4bc07ceb4e3cde81c586ea153db7529124c5e335 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 20 Apr 2024 13:49:36 +1200 Subject: [PATCH 062/239] Nudge line and button spacing --- .../pages/editPage/lockNotification/lockNotification.less | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.less b/client/homebrew/pages/editPage/lockNotification/lockNotification.less index dac15f063..60919aab8 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.less +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.less @@ -4,11 +4,12 @@ padding: 10px; margin: 25px 100px; text-align: center; + line-height: 1.5em; button { background-color: #333; color: white; - margin-top: 10px; + margin: 10px; &:hover { background-color: #777; From b4b4fbe3754efe1a0cac0d50648b7c3238c1e2bc Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 20 Apr 2024 13:50:10 +1200 Subject: [PATCH 063/239] Update fixed text and add REMOVAL button (NYI) --- .../editPage/lockNotification/lockNotification.jsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx index 73617e932..810b433ec 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx @@ -10,11 +10,19 @@ const LockNotification = createClass({ }; }, + removeLock : function() { + alert('Not yet implented'); + }, + render : function(){ return

BREW LOCKED

+

This brew been locked by the Administrators. It will not be accessible by any method other than the Editor until the lock is removed.

+
+

LOCK MESSAGE:

{this.props.message || 'Unable to retrieve Lock Message'}

- + +
; } }); From 4c6953a4e0a3d204e46f254381d90c5db2eb3857 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 20 Apr 2024 13:57:33 +1200 Subject: [PATCH 064/239] Differentiate between Edit and Share messages --- client/homebrew/pages/editPage/editPage.jsx | 2 +- server/homebrew.api.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index a18c7f1e9..66ffbe12a 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -394,7 +394,7 @@ const EditPage = createClass({
{this.state.displayLockMessage ? - this.setState({ displayLockMessage: false })}/> + this.setState({ displayLockMessage: false })}/> : Date: Sat, 20 Apr 2024 14:02:46 +1200 Subject: [PATCH 065/239] Fix test --- server/homebrew.api.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 8a4748e38..c8539bf63 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -300,7 +300,7 @@ describe('Tests for api', ()=>{ }); it('access is denied to a locked brew', async()=>{ - const lockBrew = { title: 'test brew', shareId: '1', lock: { locked: true, code: 404, message: 'brew locked' } }; + const lockBrew = { title: 'test brew', shareId: '1', lock: { locked: true, code: 404, shareMessage: 'brew locked' } }; model.get = jest.fn(()=>toBrewPromise(lockBrew)); api.getId = jest.fn(()=>({ id: '1', googleId: undefined })); From 9f31a2c8a289ee4ca89dd36bcab83fad88f11bae Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 20 Apr 2024 14:06:33 +1200 Subject: [PATCH 066/239] I can spell, honest --- .../pages/editPage/lockNotification/lockNotification.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx index 810b433ec..7477ba789 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx @@ -11,7 +11,7 @@ const LockNotification = createClass({ }, removeLock : function() { - alert('Not yet implented'); + alert('Not yet implemented'); }, render : function(){ From 90ce48b170501cacc125c0ed4c74fbb469b15c2b Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 20 Apr 2024 21:46:32 -0500 Subject: [PATCH 067/239] Adapt Recursive Toc function from 3254 --- .../V3/5ePHB/snippets/tableOfContents.gen.js | 128 +++++++----------- 1 file changed, 48 insertions(+), 80 deletions(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 0ae0213cc..56873aeb6 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -1,100 +1,67 @@ const _ = require('lodash'); const dedent = require('dedent-tabs').default; -const getTOC = ()=>{ - const add1 = (title, page)=>{ - res.push({ - title : title, - page : page, - children : [] - }); - }; - const add2 = (title, page)=>{ - if(!_.last(res)) add1(null, page); - _.last(res).children.push({ - title : title, - page : page, - children : [] - }); - }; - const add3 = (title, page)=>{ - if(!_.last(res)) add1(null, page); - if(!_.last(_.last(res).children)) add2(null, page); - _.last(_.last(res).children).children.push({ - title : title, - page : page, - children : [] - }); - }; - const add4 = (title, page)=>{ - if(!_.last(res)) add1(null, page); - if(!_.last(_.last(res).children)) add2(null, page); - if(!_.last(!_.last(_.last(res).children))) add3(null, page); - _.last(_.last(_.last(res).children).children).children.push({ - title : title, - page : page, - children : [] - }); - }; - const add5 = (title, page)=>{ - if(!_.last(res)) add1(null, page); - if(!_.last(_.last(res).children)) add2(null, page); - if(!_.last(!_.last(_.last(res).children))) add3(null, page); - if(!_.last(!_.last(!_.last(_.last(res).children)))) add4(null, page); - _.last(_.last(_.last(_.last(res).children).children).children).children.push({ - title : title, - page : page, - children : [] - }); - }; - const add6 = (title, page)=>{ - if(!_.last(res)) add1(null, page); - if(!_.last(_.last(res).children)) add2(null, page); - if(!_.last(!_.last(_.last(res).children))) add3(null, page); - if(!_.last(!_.last(!_.last(_.last(res).children)))) add4(null, page); - if(!_.last(!_.last(!_.last(!_.last(_.last(res).children))))) add5(null, page); - _.last(_.last(_.last(_.last(_.last(res).children).children).children).children).children.push({ - title : title, - page : page, - children : [] - }); +const getTOC = (pages)=>{ + + const recursiveAdd = (title, page, targetDepth, child, curDepth=0)=>{ + console.log(curDepth); + if(curDepth > 5) return; // Something went wrong. + if(curDepth == targetDepth) { + child.push({ + title : title, + page : page + 1, + children : [] + }); + } else { + console.log(typeof child); + child.push({ + title : null, + page : page + 1, + children : [] + }); + console.log(_.last(child)); + console.log(_.last(child).children); + recursiveAdd(title, page, targetDepth, _.last(child).children, curDepth+1,); + } }; const res = []; - const iframe = document.getElementById('BrewRenderer'); - const iframeDocument = iframe.contentDocument || iframe.contentWindow.document; - const headings = iframeDocument.querySelectorAll('h1, h2, h3, h4, h5, h6'); - _.each(headings, (heading)=>{ - const onPage = parseInt(heading.closest('.page,.phb').id?.replace(/^p/, '')); - const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC'); - if(ToCExclude != 'exclude') { - if(!isNaN(onPage)) { - const headingText = heading.innerText.trim(); - if(heading.tagName == 'H1') { - add1(headingText, onPage); + _.each(pages, (page, pageNum)=>{ + if(!page.includes("{{frontCover}}") && !page.includes("{{insideCover}}") && !page.includes("{{partCover}}") && !page.includes("{{backCover}}")) { + const lines = page.split('\n'); + _.each(lines, (line)=>{ + if(_.startsWith(line, '# ')){ + const title = line.replace('# ', ''); + recursiveAdd(title, pageNum, 0, res); } - if(heading.tagName == 'H2') { - add2(headingText, onPage); + if(_.startsWith(line, '## ')){ + const title = line.replace('## ', ''); + recursiveAdd(title, pageNum, 1, res); } - if(heading.tagName == 'H3') { - add3(headingText, onPage); + if(_.startsWith(line, '### ')){ + const title = line.replace('### ', ''); + recursiveAdd(title, pageNum, 2, res); } - if(heading.tagName == 'H4') { - add4(headingText, onPage); + if(_.startsWith(line, '#### ')){ + const title = line.replace('#### ', ''); + recursiveAdd(title, pageNum, 3, res); } - if(heading.tagName == 'H5') { - add5(headingText, onPage); + if(_.startsWith(line, '##### ')){ + const title = line.replace('##### ', ''); + recursiveAdd(title, pageNum, 4, res); } - if(heading.tagName == 'H6') { - add6(headingText, onPage); + if(_.startsWith(line, '##### ')){ + const title = line.replace('##### ', ''); + recursiveAdd(title, pageNum, 5, res); } - } + }); } }); return res; }; + const ToCIterate = (entries, curDepth=0)=>{ const levelPad = ['- ###', ' - ####', ' - ####', ' - ####', ' - ####', ' - ####']; const toc = []; @@ -113,7 +80,8 @@ const ToCIterate = (entries, curDepth=0)=>{ }; module.exports = function(props){ - const TOC = getTOC(); + const pages = props.brew.text.split('\\page'); + const TOC = getTOC(pages); const markdown = _.reduce(TOC, (r, g1, idx1)=>{ r.push(ToCIterate(g1).join('\n')); return r; From 2a148cb138a57a1c6d59eab64fbacd5d15ad3035 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 20 Apr 2024 21:53:02 -0500 Subject: [PATCH 068/239] Update Menus and standardize CSS Names Update addh4, addh5, addh6 class names to addToCH4, addToCH5, addToCH6 Update menu items for Table of contents with better labels and addToC --- themes/V3/5ePHB/snippets.js | 19 +++++++++++++------ themes/V3/5ePHB/style.less | 6 +++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index c8b3dbde1..081ab3ef3 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -31,23 +31,30 @@ module.exports = [ gen : TableOfContentsGen, }, { - name : 'Include H4', + name : 'Include up to H4', icon : 'fas fa-dice-four', - gen : dedent `{{tocH4 + gen : dedent `{{addToCH4 }}`, }, { - name : 'Include H4, H5', + name : 'Include up to H5', icon : 'fas fa-dice-five', - gen : dedent `{{tocH5 + gen : dedent `{{addToCH5 }}`, }, { - name : 'Include H4-H6', + name : 'Include up to H6', icon : 'fas fa-dice-six', - gen : dedent `{{tocH6 + gen : dedent `{{addToCH6 }}`, }, + { + name : 'Include in ToC', + icon : 'fas fa-dice-six', + gen : dedent `{{addToC + }}`, + + } ] }, { diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index f90396401..9c0059ba8 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -802,14 +802,14 @@ h6, .noToC, .toc { --TOC: exclude; } -.tocH4 { +.addToCH4 { h4 { --TOC: include; } } -.tocH5 { +.addToCH5 { h4 { --TOC: include; } h5 { --TOC: include; } } -.tocH6 { +.addToCH6 { h4 { --TOC: include; } h5 { --TOC: include; } h6 { --TOC: include; } From 3dde6a098cccaff29813fa063297dcafcde59f02 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 6 May 2024 12:12:46 -0500 Subject: [PATCH 069/239] Test code to reduce duplicate theme loading This shorts out loading of 5ePHB and/or blank from getBrewThemeParent --- server/homebrew.api.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index d0966194c..fff9784b6 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -290,6 +290,8 @@ const api = { getBrewThemeParent : async (req, res)=>{ const brew = req.brew; splitTextStyleAndMetadata(brew); + // Test Hard Ignoring 5ePHB and 5eBlank due to being used for editor theming. + if((req.brew.theme == '5ePHB') ||(req.brew.theme == 'Blank')) return res.status(200).send(''); res.setHeader('Content-Type', 'text/css'); const staticTheme = `/css/${req.brew.renderer}/${req.brew.theme}`; const userTheme = `/css/${req.brew.theme.slice(1)}`; From c9d416fec0f445bf1b7a353b4db244a90ba02b2b Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 6 May 2024 19:39:27 -0500 Subject: [PATCH 070/239] Small User Brew theme changes. Move the Static Theme shortcut to getBrewThemeWithCSS to drop an unneeded URL load. Change the comment in the CSS to refer to the shareURL for the theme instead of its name if it is a user theme. --- server/homebrew.api.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index fff9784b6..b87efe8d0 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -8,6 +8,7 @@ const Markdown = require('../shared/naturalcrit/markdown.js'); const yaml = require('js-yaml'); const asyncHandler = require('express-async-handler'); const { nanoid } = require('nanoid'); +var url = require('url'); const { DEFAULT_BREW, DEFAULT_BREW_LOAD } = require('./brewDefaults.js'); @@ -282,21 +283,21 @@ const api = { const brew = req.brew; splitTextStyleAndMetadata(brew); res.setHeader('Content-Type', 'text/css'); - const staticTheme = `/css/${req.brew.renderer}/${req.brew.theme}`; - const userTheme = `/css/${req.brew.theme.slice(1)}`; - const parentThemeImport = `@import url(\"${req.brew.theme[0] != '#' ? staticTheme : userTheme}\");\n\n/* From Brew: ${req.brew.title}*/\n\n`; - return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}${req.brew.style}`); + const themePath = req.brew.theme[0] != '#' ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme.slice(1)}`; + // Drop Parent theme if it has already been loaded. + // This assumes the continued use of the V3/5ePHB and V3/Blank themes for the app. + const parentThemeImport = ((req.brew.theme != '5ePHB') && (req.brew.theme != 'Blank')) ? `@import url(\"${themePath}\");\n\n`:''; + const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; + return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}${themeLocationComment}${req.brew.style}`); }, getBrewThemeParent : async (req, res)=>{ const brew = req.brew; splitTextStyleAndMetadata(brew); - // Test Hard Ignoring 5ePHB and 5eBlank due to being used for editor theming. - if((req.brew.theme == '5ePHB') ||(req.brew.theme == 'Blank')) return res.status(200).send(''); res.setHeader('Content-Type', 'text/css'); - const staticTheme = `/css/${req.brew.renderer}/${req.brew.theme}`; - const userTheme = `/css/${req.brew.theme.slice(1)}`; - const parentThemeImport = `@import url(\"${req.brew.theme[0] != '#' ? staticTheme : userTheme}\");\n\n/* From Brew: ${req.brew.title}*/\n\n`; - return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}`); + const themePath = req.brew.theme[0] != '#' ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme.slice(1)}`; + const parentThemeImport = `@import url(\"${themePath}\");\n\n`; + const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; + return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}{themeLocationComment}`); }, getStaticTheme : async(req, res)=>{ const themeParent = isStaticTheme(req.params.engine, req.params.id); From 9f04c34b064532203191f701ba87f9509bca303e Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 6 May 2024 20:07:33 -0500 Subject: [PATCH 071/239] Missed $ --- server/homebrew.api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index b87efe8d0..1342d0e57 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -297,7 +297,7 @@ const api = { const themePath = req.brew.theme[0] != '#' ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme.slice(1)}`; const parentThemeImport = `@import url(\"${themePath}\");\n\n`; const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; - return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}{themeLocationComment}`); + return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}${themeLocationComment}`); }, getStaticTheme : async(req, res)=>{ const themeParent = isStaticTheme(req.params.engine, req.params.id); From f936b8b12bde21a209b668bdd68eeacf8f7da1b9 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 6 May 2024 20:28:46 -0500 Subject: [PATCH 072/239] Update User brew endpoint tests --- server/homebrew.api.spec.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index f5379f43f..e55866477 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -588,15 +588,15 @@ brew`); describe('getBrewThemeWithStaticParent', ()=>{ it('should collect parent theme and brew style - returning as css with static parent imported.', async ()=>{ const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); - model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', renderer: 'V3', style: 'I Have a style!' })); + model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', renderer: 'V3', theme: '5eDMG', shareId: 'iAmAUserTheme', style: 'I Have a style!' })); const fn = api.getBrew('share', true); - const req = { brew: {} }; + const req = { brew: {}, get: ()=>{return 'localhost';}, protocol: 'https' }; const next = jest.fn(); await fn(req, null, next); api.getBrewThemeWithCSS(req, res); const sent = res.send.mock.calls[0][0]; - expect(sent).toBe(`@import url("/css/V3/5ePHB");\n\n/* From Brew: test brew*/\n\nI Have a style!`); + expect(sent).toBe(`@import url("/css/V3/5eDMG");\n\n/* From Brew: https://localhost/share/iAmAUserTheme */\n\nI Have a style!`); expect(res.status).toHaveBeenCalledWith(200); }); }); @@ -604,15 +604,15 @@ brew`); describe('getBrewThemeWithUserParent', ()=>{ it('should collect parent theme and brew style - returning as css with user-theme parent imported.', async ()=>{ const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); - model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', renderer: 'V3', theme: '#IamATheme', style: 'I Have a style!' })); + model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', renderer: 'V3', shareId: 'iAmAUserTheme', theme: '#IamATheme', style: 'I Have a style!' })); const fn = api.getBrew('share', true); - const req = { brew: {} }; + const req = { brew: {}, get: ()=>{return 'localhost';}, protocol: 'https' }; const next = jest.fn(); await fn(req, null, next); api.getBrewThemeWithCSS(req, res); const sent = res.send.mock.calls[0][0]; - expect(sent).toBe(`@import url("/css/IamATheme");\n\n/* From Brew: test brew*/\n\nI Have a style!`); + expect(sent).toBe(`@import url("/css/IamATheme");\n\n/* From Brew: https://localhost/share/iAmAUserTheme */\n\nI Have a style!`); expect(res.status).toHaveBeenCalledWith(200); }); }); From 295fea7581b7840808f11a5bbb021d21fbad842e Mon Sep 17 00:00:00 2001 From: Gazook89 Date: Tue, 7 May 2024 11:00:20 -0500 Subject: [PATCH 073/239] Add dropdownTexture for user theme options If a user theme document has a thumbnail, this will include that thumbnail as a dropdown texture in the options. --- .../editor/metadataEditor/metadataEditor.jsx | 5 +++- .../editor/metadataEditor/metadataEditor.less | 25 +++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index d402d9955..61efa81c1 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -200,9 +200,12 @@ const MetadataEditor = createClass({ const listThemes = (renderer)=>{ return _.map(_.values(mergedThemes[renderer]), (theme)=>{ const preview = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`; + const texture = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownTexture.png`; return
this.handleTheme(theme, renderer)} title={''}> {`${renderer} : ${theme.name}`} - +
+ +
{`${theme.name}`} preview
diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.less b/client/homebrew/editor/metadataEditor/metadataEditor.less index 7f7ce3060..23e6f4415 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.less +++ b/client/homebrew/editor/metadataEditor/metadataEditor.less @@ -230,14 +230,23 @@ &:hover > .preview { opacity: 1; } - >img { - mask-image : linear-gradient(90deg, transparent, black 20%); - -webkit-mask-image : linear-gradient(90deg, transparent, black 20%); - position : absolute; - right : 0; - top : 0px; - width : 50%; - height : 100%; + .texture-container { + position: absolute; + width: 100%; + height: 100%; + min-height: 100%; + top: 0; + left: 0; + overflow: hidden; + > img { + mask-image : linear-gradient(90deg, transparent, black 20%); + -webkit-mask-image : linear-gradient(90deg, transparent, black 20%); + position : absolute; + right : 0; + top : 0px; + width : 50%; + min-height: 100%; + } } } } From 872ee339da31d0848363db1790feb291bc157541 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 7 May 2024 12:13:57 -0500 Subject: [PATCH 074/239] Clean up console logs Eliminate erroronous theme pulldown texture load. --- client/homebrew/editor/metadataEditor/metadataEditor.jsx | 2 +- client/homebrew/pages/newPage/newPage.jsx | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index d402d9955..3de011f50 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -202,7 +202,7 @@ const MetadataEditor = createClass({ const preview = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`; return
this.handleTheme(theme, renderer)} title={''}> {`${renderer} : ${theme.name}`} - +
{`${theme.name}`} preview
diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 9fd82b282..e6809bb22 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -139,8 +139,6 @@ const NewPage = createClass({ isSaving : true }); - console.log('saving new brew'); - let brew = this.state.brew; // Split out CSS to Style if CSS codefence exists if(brew.text.startsWith('```css') && brew.text.indexOf('```\n\n') > 0) { @@ -150,17 +148,13 @@ const NewPage = createClass({ } brew.pageCount=((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; - console.log('Running post.'); const res = await request .post(`/api${this.state.saveGoogle ? '?saveToGoogle=true' : ''}`) .send(brew) .catch((err)=>{ - console.log(err); this.setState({ isSaving: false, error: err }); }); - console.log('Post completed'); if(!res) return; - console.log('Had results!'); brew = res.body; localStorage.removeItem(BREWKEY); From 65495b4e7c59e326ebf5598fdeb5d4de02e31622 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 8 May 2024 12:51:10 -0500 Subject: [PATCH 075/239] Prevent Legacy renderer brews from being listed as themes. --- server/homebrew.api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 1342d0e57..fcf2507ee 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -84,7 +84,7 @@ const api = { } }; - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme', 'type:theme', 'type:Theme'] }, editId: { $ne: id } }); + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme', 'type:theme', 'type:Theme'] }, editId: { $ne: id }, renderer: { $ne: 'Legacy' } }); if(brews) { for await (const brew of brews) { From 10a7f34abb578604209707b97d5497c5450745ed Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 10 May 2024 07:45:04 +1200 Subject: [PATCH 076/239] Update lock message --- .../editPage/lockNotification/lockNotification.jsx | 7 +++++-- .../editPage/lockNotification/lockNotification.less | 11 +++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx index 7477ba789..fbb30a0a6 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx @@ -19,9 +19,12 @@ const LockNotification = createClass({

BREW LOCKED

This brew been locked by the Administrators. It will not be accessible by any method other than the Editor until the lock is removed.


-

LOCK MESSAGE:

+

LOCK REASON

{this.props.message || 'Unable to retrieve Lock Message'}

- +
+

Once you have resolved this issue, click REQUEST LOCK REMOVAL to notify the Administrators for review.

+

Click CONTINUE TO EDITOR to temporarily hide this notification; it will reappear the next time the page is reloaded.

+
; } diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.less b/client/homebrew/pages/editPage/lockNotification/lockNotification.less index 60919aab8..18dec07e3 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.less +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.less @@ -15,4 +15,15 @@ background-color: #777; } } + + h1, h3 { + font-family: 'Open Sans', sans-serif; + font-weight: 800; + } + h1 { + font-size: 24px; + } + h3 { + font-size: 18px; + } } \ No newline at end of file From f6daeb4acd739071c40cabe24587d983516120b6 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 10 May 2024 08:05:09 +1200 Subject: [PATCH 077/239] Update error message --- client/homebrew/pages/errorPage/errors/errorIndex.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/homebrew/pages/errorPage/errors/errorIndex.js b/client/homebrew/pages/errorPage/errors/errorIndex.js index f9d52c109..58725fe3f 100644 --- a/client/homebrew/pages/errorPage/errors/errorIndex.js +++ b/client/homebrew/pages/errorPage/errors/errorIndex.js @@ -95,7 +95,7 @@ const errorIndex = (props)=>{ **Current Authors:** ${props.brew.authors?.map((author)=>{return `[${author}](/user/${author})`;}).join(', ') || 'Unable to list authors'} [Click here to be redirected to the brew's share page.](/share/${props.brew.shareId})`, - + // Brew load error '05' : dedent` @@ -140,7 +140,7 @@ const errorIndex = (props)=>{ '100' : dedent` ## This brew has been locked. - Please contact the Administrators to unlock this document. + Only an author may request that this lock is removed. : From bf38f95d25950b0a93ce337cf254f60c15cc0aa4 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 10 May 2024 08:05:29 +1200 Subject: [PATCH 078/239] Pass ID to Lock Notification --- client/homebrew/pages/editPage/editPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 66ffbe12a..a6c5e4d24 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -394,7 +394,7 @@ const EditPage = createClass({
{this.state.displayLockMessage ? - this.setState({ displayLockMessage: false })}/> + this.setState({ displayLockMessage: false })}/> : Date: Fri, 10 May 2024 08:17:09 +1200 Subject: [PATCH 079/239] Add Share ID to lock notification --- .../editPage/lockNotification/lockNotification.jsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx index fbb30a0a6..c697d8804 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx @@ -3,7 +3,14 @@ const React = require('react'); const createClass = require('create-react-class'); const LockNotification = createClass({ - displayName : 'LockNotification', + displayName : 'LockNotification', + + getDefaultProps : function() { + return { + shareId : 0 + }; + }, + getInitialState : function() { return { disableLock : ()=>{} @@ -11,7 +18,7 @@ const LockNotification = createClass({ }, removeLock : function() { - alert('Not yet implemented'); + alert(`Not yet implemented - ID ${this.props.shareId}`); }, render : function(){ From b6c2f96b823621aee06af4b5a9683796613ec89d Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 10 May 2024 01:40:01 -0400 Subject: [PATCH 080/239] Change tag filtering for theme detection to require meta prefix --- server/homebrew.api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index fcf2507ee..bfe847a38 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -84,7 +84,7 @@ const api = { } }; - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme', 'type:theme', 'type:Theme'] }, editId: { $ne: id }, renderer: { $ne: 'Legacy' } }); + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['meta:theme', 'meta:Theme'] }, editId: { $ne: id }, renderer: { $ne: 'Legacy' } }); if(brews) { for await (const brew of brews) { From c0beae6e46e2b52918dedaebdf27669955979e25 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sun, 12 May 2024 11:49:30 -0500 Subject: [PATCH 081/239] Remove redundant class declaration for ToC --- themes/V3/5ePHB/style.less | 3 --- 1 file changed, 3 deletions(-) diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index c65ed852f..06bc7b1ac 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -825,9 +825,6 @@ h6, text-decoration : none; &:hover { text-decoration : underline; } } - h1, h2, h3, h4, h5, h6 { - --TOC: exclude; - } h4 { margin-top : 0.2cm; line-height : 0.4cm; From afb5ccec8169ef960bae5b24741185ba2c94bf1b Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sun, 12 May 2024 12:00:55 -0500 Subject: [PATCH 082/239] Slight Rearrange of ToC theme names and menu Reorders ToC inclusion options with slight relabel for clarity. Changes assumptions on H4, H5, and H6 snippets to assume H1-H3 class should be explicitly stated. change naming of addToToCH# to tocH# more explicitly define .addToC to h1 to h3 changes for --TOC var. --- themes/V3/5ePHB/snippets.js | 38 ++++++++++++++++++------------------- themes/V3/5ePHB/style.less | 12 ++++++++---- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index 081ab3ef3..149517fbb 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -31,29 +31,29 @@ module.exports = [ gen : TableOfContentsGen, }, { - name : 'Include up to H4', - icon : 'fas fa-dice-four', - gen : dedent `{{addToCH4 - }}`, - }, - { - name : 'Include up to H5', - icon : 'fas fa-dice-five', - gen : dedent `{{addToCH5 - }}`, - }, - { - name : 'Include up to H6', - icon : 'fas fa-dice-six', - gen : dedent `{{addToCH6 - }}`, - }, - { - name : 'Include in ToC', + name : 'Include in ToC up to H3', icon : 'fas fa-dice-six', gen : dedent `{{addToC }}`, + }, + { + name : 'Include in ToC up to H4', + icon : 'fas fa-dice-four', + gen : dedent `{{addToC,tocH4 + }}`, + }, + { + name : 'Include in ToC up to H5', + icon : 'fas fa-dice-five', + gen : dedent `{{addToC,tocH5 + }}`, + }, + { + name : 'Include in ToC up to H6', + icon : 'fas fa-dice-six', + gen : dedent `{{addToC,tocH6 + }}`, } ] }, diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 06bc7b1ac..41318cfe6 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -794,20 +794,24 @@ h6, .noToC, .toc { --TOC: exclude; } -.addToCH4 { +.tocH4 { h4 { --TOC: include; } } -.addToCH5 { +.tocH5 { h4 { --TOC: include; } h5 { --TOC: include; } } -.addToCH6 { +.tocH6 { h4 { --TOC: include; } h5 { --TOC: include; } h6 { --TOC: include; } } -.addToC { --TOC: include; } +.addToC { + h1 {--TOC: include; } + h2 {--TOC: include; } + h3 {--TOC: include; } +} .page { &:has(.toc)::after { display : none; } From 8c5f4e06058db9c8323c61d1c815ab9aed8543f5 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 13 May 2024 11:14:35 -0500 Subject: [PATCH 083/239] Brew Theme Fixes. This adds the User Brew themes, where applicible, to the /new path. This adds a semi-graceful failure to the metadata panel when a Brew Theme is declared as used but is not present. More gracefully handles loading with themes not present. --- client/homebrew/brewRenderer/brewRenderer.jsx | 3 +-- client/homebrew/editor/metadataEditor/metadataEditor.jsx | 3 ++- client/homebrew/pages/printPage/printPage.jsx | 2 +- server/app.js | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 9ab09301b..e1eed42d2 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -189,7 +189,7 @@ const BrewRenderer = (props)=>{ } let themePath = props.theme ?? '5ePHB'; const Themes = { ...staticThemes, ...props.userThemes }; - let baseThemePath = Themes[rendererPath][themePath]?.baseTheme; + let baseThemePath = (themePath && themePath[0] !== '#') ? Themes[rendererPath][themePath]?.baseTheme : 'Brew'; // Override static theme values if a Brew theme. @@ -201,7 +201,6 @@ const BrewRenderer = (props)=>{ } if(rendererPath == '') { - baseThemePath = 'Brew'; baseRendererPath = ''; } else { baseRendererPath += '/'; diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 61efa81c1..93dcd11c8 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -215,7 +215,8 @@ const MetadataEditor = createClass({ }; const currentThemePath = this.props.metadata?.theme && this.props.metadata.theme[0] === '#' ? 'Brew' : this.props.metadata.renderer; - const currentTheme = mergedThemes[`${_.upperFirst(currentThemePath)}`][this.props.metadata.theme]; +// const currentTheme = mergedThemes[`${_.upperFirst(currentThemePath)}`][this.props.metadata.theme]; + const currentTheme = mergedThemes[`${_.upperFirst(currentThemePath)}`].hasOwnProperty(this.props.metadata.theme) ? mergedThemes[`${_.upperFirst(currentThemePath)}`][this.props.metadata.theme] : { name: `!!! THEME MISSING !!! ID=${this.props.metadata.theme.slice(1)}`}; let dropdown; if(this.props.metadata.renderer == 'legacy') { diff --git a/client/homebrew/pages/printPage/printPage.jsx b/client/homebrew/pages/printPage/printPage.jsx index d9ff2ca1a..c21807343 100644 --- a/client/homebrew/pages/printPage/printPage.jsx +++ b/client/homebrew/pages/printPage/printPage.jsx @@ -99,7 +99,7 @@ const PrintPage = createClass({ } let themePath = this.state.brew.theme ?? '5ePHB'; const Themes = { ...staticThemes, ...this.state.brew.userThemes }; - let baseThemePath = Themes[rendererPath][themePath]?.baseTheme; + let baseThemePath = (themePath && themePath[0] !== '#') ? Themes[rendererPath][themePath]?.baseTheme : 'Brew'; // Override static theme values if a Brew theme. diff --git a/server/app.js b/server/app.js index e5b802c72..8a8b67b50 100644 --- a/server/app.js +++ b/server/app.js @@ -300,6 +300,7 @@ app.get('/new/:id', asyncHandler(getBrew('share')), (req, res, next)=>{ renderer : req.brew.renderer, theme : req.brew.theme, tags : req.brew.tags, + userThemes : req.brew.userThemes }; req.brew = _.defaults(brew, DEFAULT_BREW); From 66e39d9c65a075e4cad0c60a7d6783f67f403100 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 13 May 2024 22:24:41 -0500 Subject: [PATCH 084/239] Update Theme Selector display For User/Brew Themes, display the first author instead of Brew/V3 in the first column. --- client/homebrew/editor/metadataEditor/metadataEditor.jsx | 4 ++-- server/homebrew.api.js | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 93dcd11c8..7cc5257f3 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -202,7 +202,7 @@ const MetadataEditor = createClass({ const preview = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`; const texture = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownTexture.png`; return
this.handleTheme(theme, renderer)} title={''}> - {`${renderer} : ${theme.name}`} + {`${theme?.author ? theme.author : renderer} : ${theme.name}`}
@@ -230,7 +230,7 @@ const MetadataEditor = createClass({ dropdown =
- {`${_.upperFirst(currentThemePath)} : ${currentTheme.name}`} + {`${currentTheme?.author ? currentTheme.author : _.upperFirst(currentThemePath)} : ${currentTheme.name}`}
{/*listThemes('Legacy')*/} {listThemes('V3')} diff --git a/server/homebrew.api.js b/server/homebrew.api.js index bfe847a38..8b0f35147 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -75,7 +75,8 @@ const api = { 'editId', 'thumbnail', 'textBin', - 'text' + 'text', + 'authors' ]; const userThemes = { @@ -93,6 +94,7 @@ const api = { renderer : 'V3', baseTheme : '', baseSnippets : false, + author : brew.authors[0], path : `#${brew.editId}`, thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' }; From 69f01b282a316c6297110fe66db372c26c5b585a Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 13 May 2024 22:33:58 -0500 Subject: [PATCH 085/239] CSS Tweaks for Theme Selector Add 5e-Cleric's suggestsions to acvoid the title overflowing over the preview. --- client/homebrew/editor/metadataEditor/metadataEditor.jsx | 2 +- client/homebrew/editor/metadataEditor/metadataEditor.less | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 7cc5257f3..586658050 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -202,7 +202,7 @@ const MetadataEditor = createClass({ const preview = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`; const texture = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownTexture.png`; return
this.handleTheme(theme, renderer)} title={''}> - {`${theme?.author ? theme.author : renderer} : ${theme.name}`} +

{`${theme?.author ? theme.author : renderer} : ${theme.name}`}

diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.less b/client/homebrew/editor/metadataEditor/metadataEditor.less index 23e6f4415..b157890b1 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.less +++ b/client/homebrew/editor/metadataEditor/metadataEditor.less @@ -191,6 +191,13 @@ color : white; } } + .navDropdown .item > p { + width: 45%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + height: 1.1em; + } .navDropdown { box-shadow : 0px 5px 10px rgba(0, 0, 0, 0.3); position : absolute; From c6f62142e1fadb4ee6f4c9ed864e84e04f543948 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 17 May 2024 20:53:06 -0500 Subject: [PATCH 086/239] Change the ID used for User Brews to the shareId for future-proofing. --- server/homebrew.api.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 8b0f35147..66adb3267 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -72,7 +72,7 @@ const api = { const fields = [ 'title', 'tags', - 'editId', + 'shareId', 'thumbnail', 'textBin', 'text', @@ -85,17 +85,17 @@ const api = { } }; - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['meta:theme', 'meta:Theme'] }, editId: { $ne: id }, renderer: { $ne: 'Legacy' } }); + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['meta:theme', 'meta:Theme'] }, shareId: { $ne: id }, renderer: { $ne: 'Legacy' } }); if(brews) { for await (const brew of brews) { - userThemes.Brew[`#${brew.editId}`] = { + userThemes.Brew[`#${brew.shareId}`] = { name : brew.title, renderer : 'V3', baseTheme : '', baseSnippets : false, author : brew.authors[0], - path : `#${brew.editId}`, + path : `#${brew.shareId}`, thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' }; } @@ -111,7 +111,7 @@ const api = { const { id, googleId } = api.getId(req); // Try to find the document in the Homebrewery database -- if it doesn't exist, that's fine. - let stub = await HomebrewModel.get((accessType === 'edit') || (accessType === 'theme') ? { editId: id } : { shareId: id }) + let stub = await HomebrewModel.get((accessType === 'edit') ? { editId: id } : { shareId: id }) .catch((err)=>{ if(googleId) { console.warn(`Unable to find document stub for ${accessType}Id ${id}`); From 54d2709d6a14be69c42a12e43d7d00fd5245bf86 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 20 May 2024 17:58:22 -0500 Subject: [PATCH 087/239] Merge --- client/homebrew/brewRenderer/brewRenderer.jsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 97542a58c..7d50e0e3f 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -14,14 +14,10 @@ const NotificationPopup = require('./notificationPopup/notificationPopup.jsx'); const Frame = require('react-frame-component').default; const dedent = require('dedent-tabs').default; -<<<<<<< HEAD -const staticThemes = require('themes/themes.json'); -======= const DOMPurify = require('dompurify'); const purifyConfig = { FORCE_BODY: true, SANITIZE_DOM: false }; -const Themes = require('themes/themes.json'); ->>>>>>> master +const staticThemes = require('themes/themes.json'); const PAGE_HEIGHT = 1056; From 1773e77cb9d0d32f1be509d2b6ce9ea2293a9c00 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 22 May 2024 11:47:12 -0500 Subject: [PATCH 088/239] Fix missed issues with converting to delightfully recursive function --- .../V3/5ePHB/snippets/tableOfContents.gen.js | 52 +++++++------------ 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 56873aeb6..6bb87cbf1 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -4,7 +4,6 @@ const dedent = require('dedent-tabs').default; const getTOC = (pages)=>{ const recursiveAdd = (title, page, targetDepth, child, curDepth=0)=>{ - console.log(curDepth); if(curDepth > 5) return; // Something went wrong. if(curDepth == targetDepth) { child.push({ @@ -13,49 +12,36 @@ const getTOC = (pages)=>{ children : [] }); } else { - console.log(typeof child); child.push({ title : null, page : page + 1, children : [] }); - console.log(_.last(child)); - console.log(_.last(child).children); recursiveAdd(title, page, targetDepth, _.last(child).children, curDepth+1,); } }; const res = []; - _.each(pages, (page, pageNum)=>{ - if(!page.includes("{{frontCover}}") && !page.includes("{{insideCover}}") && !page.includes("{{partCover}}") && !page.includes("{{backCover}}")) { - const lines = page.split('\n'); - _.each(lines, (line)=>{ - if(_.startsWith(line, '# ')){ - const title = line.replace('# ', ''); - recursiveAdd(title, pageNum, 0, res); - } - if(_.startsWith(line, '## ')){ - const title = line.replace('## ', ''); - recursiveAdd(title, pageNum, 1, res); - } - if(_.startsWith(line, '### ')){ - const title = line.replace('### ', ''); - recursiveAdd(title, pageNum, 2, res); - } - if(_.startsWith(line, '#### ')){ - const title = line.replace('#### ', ''); - recursiveAdd(title, pageNum, 3, res); - } - if(_.startsWith(line, '##### ')){ - const title = line.replace('##### ', ''); - recursiveAdd(title, pageNum, 4, res); - } - if(_.startsWith(line, '##### ')){ - const title = line.replace('##### ', ''); - recursiveAdd(title, pageNum, 5, res); - } - }); + const iframe = document.getElementById('BrewRenderer'); + const iframeDocument = iframe.contentDocument || iframe.contentWindow.document; + const headings = iframeDocument.querySelectorAll('h1, h2, h3, h4, h5, h6'); + const headerDepth = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6']; + const exclusionElements = iframeDocument.querySelectorAll('frontCover insideCover partCover backCover'); + const excludedPages = []; + + // Build a list of excluded pages. + _.each(exclusionElements, (e)=>{ + const onPage = parseInt(e.closest('.page,.phb').id?.replace(/^p/, '')); + if(!excludedPages.includes(onPage)) excludedPages.push(onPage); + }); + + _.each(headings, (heading)=>{ + const onPage = parseInt(heading.closest('.page,.phb').id?.replace(/^p/, '')); + const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC'); + + if((ToCExclude != 'exclude') && (!excludedPages.includes(onPage))) { + recursiveAdd(heading.innerText.trim(), onPage, headerDepth.indexOf(heading.tagName), res); } }); return res; From d9d4d74b713489d3eba5c9e0ff515e57f38ee5bf Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 22 May 2024 12:44:19 -0500 Subject: [PATCH 089/239] Add CR wrappers around addTOC snippet insertions. --- themes/V3/5ePHB/snippets.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index 149517fbb..5c93c8004 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -33,27 +33,27 @@ module.exports = [ { name : 'Include in ToC up to H3', icon : 'fas fa-dice-six', - gen : dedent `{{addToC - }}`, + gen : dedent `\n{{addToC + }}\n`, }, { name : 'Include in ToC up to H4', icon : 'fas fa-dice-four', - gen : dedent `{{addToC,tocH4 - }}`, + gen : dedent `\n{{addToC,tocH4 + }}\n`, }, { name : 'Include in ToC up to H5', icon : 'fas fa-dice-five', - gen : dedent `{{addToC,tocH5 - }}`, + gen : dedent `\n{{addToC,tocH5 + }}\n`, }, { name : 'Include in ToC up to H6', icon : 'fas fa-dice-six', - gen : dedent `{{addToC,tocH6 - }}`, + gen : dedent `\n{{addToC,tocH6 + }}\n`, } ] }, From 3ae5d4c1e311067ef75541bb4aa036fc47ce1c99 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 22 May 2024 16:30:12 -0500 Subject: [PATCH 090/239] Slight reworking of style naming for Table of Contents Also uses :is operator for cleaner? looking CSS Lastly, removes {{partCover}} from automatic exclusion. --- themes/V3/5ePHB/snippets.js | 8 ++--- .../V3/5ePHB/snippets/tableOfContents.gen.js | 9 ++++-- themes/V3/5ePHB/style.less | 30 ++++++++----------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index 5c93c8004..2c18354b8 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -33,26 +33,26 @@ module.exports = [ { name : 'Include in ToC up to H3', icon : 'fas fa-dice-six', - gen : dedent `\n{{addToC + gen : dedent `\n{{tocH3 }}\n`, }, { name : 'Include in ToC up to H4', icon : 'fas fa-dice-four', - gen : dedent `\n{{addToC,tocH4 + gen : dedent `\n{{tocH4 }}\n`, }, { name : 'Include in ToC up to H5', icon : 'fas fa-dice-five', - gen : dedent `\n{{addToC,tocH5 + gen : dedent `\n{{tocH5 }}\n`, }, { name : 'Include in ToC up to H6', icon : 'fas fa-dice-six', - gen : dedent `\n{{addToC,tocH6 + gen : dedent `\n{{tocH6 }}\n`, } ] diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 6bb87cbf1..9e8ed8040 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -27,7 +27,7 @@ const getTOC = (pages)=>{ const iframeDocument = iframe.contentDocument || iframe.contentWindow.document; const headings = iframeDocument.querySelectorAll('h1, h2, h3, h4, h5, h6'); const headerDepth = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6']; - const exclusionElements = iframeDocument.querySelectorAll('frontCover insideCover partCover backCover'); + const exclusionElements = iframeDocument.querySelectorAll('frontCover insideCover backCover'); const excludedPages = []; // Build a list of excluded pages. @@ -40,7 +40,12 @@ const getTOC = (pages)=>{ const onPage = parseInt(heading.closest('.page,.phb').id?.replace(/^p/, '')); const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC'); - if((ToCExclude != 'exclude') && (!excludedPages.includes(onPage))) { + if(heading.tagName == 'H1') { + console.log(heading); + console.log(ToCExclude); + } + + if(((ToCExclude != 'exclude') && (!excludedPages.includes(onPage)))) { recursiveAdd(heading.innerText.trim(), onPage, headerDepth.indexOf(heading.tagName), res); } }); diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 0ba6062e9..68ea5eda9 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -794,29 +794,23 @@ h6, .page:has(.frontCover), .page:has(.backCover), .page:has(.insideCover), -.page:has(.partCover), .monster, .noToC, .toc { --TOC: exclude; } -.tocH4 { - h4 { --TOC: include; } -} -.tocH5 { - h4 { --TOC: include; } - h5 { --TOC: include; } -} -.tocH6 { - h4 { --TOC: include; } - h5 { --TOC: include; } - h6 { --TOC: include; } -} +.tocH1 :is(h1) { --TOC: include; } +.tocH2 :is(h1, h2) {--TOC: include; } +.tocH3 :is(h1, h2, h3) {--TOC: include; } +.tocH4 :is(h1, h2, h3, h4) {--TOC: include; } +.tocH5 :is(h1, h2, h3, h4, h5) {--TOC: include; } +.tocH6 :is(h1, h2, h3, h4, h5, h6) {--TOC: include; } -.addToC { - h1 {--TOC: include; } - h2 {--TOC: include; } - h3 {--TOC: include; } -} +.tocIncludeH1 h1 {--TOC: include; } +.tocIncludeH2 h2 {--TOC: include; } +.tocIncludeH3 h3 {--TOC: include; } +.tocIncludeH4 h4 {--TOC: include; } +.tocIncludeH5 h5 {--TOC: include; } +.tocIncludeH6 h6 {--TOC: include; } .page { &:has(.toc)::after { display : none; } From b496ef35978bdd3b616532d9563fad990327f01d Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 22 May 2024 16:34:00 -0500 Subject: [PATCH 091/239] Remove completely redundant checks for class based exclusion from ToC Snippet --- themes/V3/5ePHB/snippets/tableOfContents.gen.js | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 9e8ed8040..66aab50bc 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -27,25 +27,12 @@ const getTOC = (pages)=>{ const iframeDocument = iframe.contentDocument || iframe.contentWindow.document; const headings = iframeDocument.querySelectorAll('h1, h2, h3, h4, h5, h6'); const headerDepth = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6']; - const exclusionElements = iframeDocument.querySelectorAll('frontCover insideCover backCover'); - const excludedPages = []; - - // Build a list of excluded pages. - _.each(exclusionElements, (e)=>{ - const onPage = parseInt(e.closest('.page,.phb').id?.replace(/^p/, '')); - if(!excludedPages.includes(onPage)) excludedPages.push(onPage); - }); _.each(headings, (heading)=>{ const onPage = parseInt(heading.closest('.page,.phb').id?.replace(/^p/, '')); const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC'); - if(heading.tagName == 'H1') { - console.log(heading); - console.log(ToCExclude); - } - - if(((ToCExclude != 'exclude') && (!excludedPages.includes(onPage)))) { + if(ToCExclude != 'exclude') { recursiveAdd(heading.innerText.trim(), onPage, headerDepth.indexOf(heading.tagName), res); } }); From 0df53daa4c2dbb09468e25309e23912a6fae14ee Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 22 May 2024 17:25:52 -0500 Subject: [PATCH 092/239] Another attempt at clearer classnames for the Table of contents snippet --- themes/V3/5ePHB/snippets.js | 8 ++++---- themes/V3/5ePHB/style.less | 23 +++++++++++------------ 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index 2c18354b8..0aba0d11e 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -33,26 +33,26 @@ module.exports = [ { name : 'Include in ToC up to H3', icon : 'fas fa-dice-six', - gen : dedent `\n{{tocH3 + gen : dedent `\n{{tocAddH1H3 }}\n`, }, { name : 'Include in ToC up to H4', icon : 'fas fa-dice-four', - gen : dedent `\n{{tocH4 + gen : dedent `\n{{tocAddH1H4 }}\n`, }, { name : 'Include in ToC up to H5', icon : 'fas fa-dice-five', - gen : dedent `\n{{tocH5 + gen : dedent `\n{{tocAddH1H5 }}\n`, }, { name : 'Include in ToC up to H6', icon : 'fas fa-dice-six', - gen : dedent `\n{{tocH6 + gen : dedent `\n{{tocAddH1H6 }}\n`, } ] diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 68ea5eda9..0f34585f7 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -798,19 +798,18 @@ h6, .noToC, .toc { --TOC: exclude; } -.tocH1 :is(h1) { --TOC: include; } -.tocH2 :is(h1, h2) {--TOC: include; } -.tocH3 :is(h1, h2, h3) {--TOC: include; } -.tocH4 :is(h1, h2, h3, h4) {--TOC: include; } -.tocH5 :is(h1, h2, h3, h4, h5) {--TOC: include; } -.tocH6 :is(h1, h2, h3, h4, h5, h6) {--TOC: include; } +.tocAddH1H2 :is(h1, h2) {--TOC: include; } +.tocAddH1H3 :is(h1, h2, h3) {--TOC: include; } +.tocAddH1H4 :is(h1, h2, h3, h4) {--TOC: include; } +.tocAddH1H5 :is(h1, h2, h3, h4, h5) {--TOC: include; } +.tocAddH1H6 :is(h1, h2, h3, h4, h5, h6) {--TOC: include; } -.tocIncludeH1 h1 {--TOC: include; } -.tocIncludeH2 h2 {--TOC: include; } -.tocIncludeH3 h3 {--TOC: include; } -.tocIncludeH4 h4 {--TOC: include; } -.tocIncludeH5 h5 {--TOC: include; } -.tocIncludeH6 h6 {--TOC: include; } +.tocAddH1 h1 {--TOC: include; } +.tocAddH2 h2 {--TOC: include; } +.tocAddH3 h3 {--TOC: include; } +.tocAddH4 h4 {--TOC: include; } +.tocAddH5 h5 {--TOC: include; } +.tocAddH6 h6 {--TOC: include; } .page { &:has(.toc)::after { display : none; } From 7cef4316d78a19ef35ae383cc6cd9b7ad815fc60 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 22 May 2024 21:04:32 -0500 Subject: [PATCH 093/239] Flag Table of Contents as "Experimental" --- themes/V3/5ePHB/snippets.js | 16 +++++++++------- themes/V3/5ePHB/snippets/tableOfContents.gen.js | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index 0aba0d11e..adcfe95a5 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -21,14 +21,16 @@ module.exports = [ view : 'text', snippets : [ { - name : 'Table of Contents', - icon : 'fas fa-book', - gen : TableOfContentsGen, - subsnippets : [ + name : 'Table of Contents', + icon : 'fas fa-book', + gen : TableOfContentsGen, + experimental : true, + subsnippets : [ { - name : 'Table of Contents', - icon : 'fas fa-book', - gen : TableOfContentsGen, + name : 'Table of Contents', + icon : 'fas fa-book', + gen : TableOfContentsGen, + experimental : true }, { name : 'Include in ToC up to H3', diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 66aab50bc..c33530bd7 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -29,7 +29,7 @@ const getTOC = (pages)=>{ const headerDepth = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6']; _.each(headings, (heading)=>{ - const onPage = parseInt(heading.closest('.page,.phb').id?.replace(/^p/, '')); + const onPage = parseInt(heading.closest('.page').id?.replace(/^p/, '')); const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC'); if(ToCExclude != 'exclude') { From 62ed026757c327a4673c68f874238e3c4928607d Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 22 May 2024 21:25:10 -0500 Subject: [PATCH 094/239] Hopeflly final class renaming sessions. --- themes/V3/5ePHB/snippets.js | 8 ++++---- themes/V3/5ePHB/style.less | 22 +++++++++++----------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index adcfe95a5..01ec1c700 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -35,26 +35,26 @@ module.exports = [ { name : 'Include in ToC up to H3', icon : 'fas fa-dice-six', - gen : dedent `\n{{tocAddH1H3 + gen : dedent `\n{{tocDepthH3 }}\n`, }, { name : 'Include in ToC up to H4', icon : 'fas fa-dice-four', - gen : dedent `\n{{tocAddH1H4 + gen : dedent `\n{{tocDepthH4 }}\n`, }, { name : 'Include in ToC up to H5', icon : 'fas fa-dice-five', - gen : dedent `\n{{tocAddH1H5 + gen : dedent `\n{{tocDepthH5 }}\n`, }, { name : 'Include in ToC up to H6', icon : 'fas fa-dice-six', - gen : dedent `\n{{tocAddH1H6 + gen : dedent `\n{{tocDepthH6 }}\n`, } ] diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 0f34585f7..674b29364 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -798,18 +798,18 @@ h6, .noToC, .toc { --TOC: exclude; } -.tocAddH1H2 :is(h1, h2) {--TOC: include; } -.tocAddH1H3 :is(h1, h2, h3) {--TOC: include; } -.tocAddH1H4 :is(h1, h2, h3, h4) {--TOC: include; } -.tocAddH1H5 :is(h1, h2, h3, h4, h5) {--TOC: include; } -.tocAddH1H6 :is(h1, h2, h3, h4, h5, h6) {--TOC: include; } +.tocDepthH2 :is(h1, h2) {--TOC: include; } +.tocDepthH3 :is(h1, h2, h3) {--TOC: include; } +.tocDepthH4 :is(h1, h2, h3, h4) {--TOC: include; } +.tocDepthH5 :is(h1, h2, h3, h4, h5) {--TOC: include; } +.tocDepthH6 :is(h1, h2, h3, h4, h5, h6) {--TOC: include; } -.tocAddH1 h1 {--TOC: include; } -.tocAddH2 h2 {--TOC: include; } -.tocAddH3 h3 {--TOC: include; } -.tocAddH4 h4 {--TOC: include; } -.tocAddH5 h5 {--TOC: include; } -.tocAddH6 h6 {--TOC: include; } +.tocIncludeH1 h1 {--TOC: include; } +.tocIncludeH2 h2 {--TOC: include; } +.tocIncludeH3 h3 {--TOC: include; } +.tocIncludeH4 h4 {--TOC: include; } +.tocIncludeH5 h5 {--TOC: include; } +.tocIncludeH6 h6 {--TOC: include; } .page { &:has(.toc)::after { display : none; } From fc22e6cd5376f5d8cf0a5eae72585105502c601f Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 22 May 2024 23:17:22 -0500 Subject: [PATCH 095/239] Smidge of documentation --- themes/V3/5ePHB/style.less | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 674b29364..7ef50df34 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -788,6 +788,7 @@ // *****************************/ // Default Exclusions +// Anything not exlcuded is included, default Headers are H1, H2, and H3. h4, h5, h6, From 7fb23c736278f254c78cff0afbdc53ab21a63c17 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 28 May 2024 16:25:39 -0400 Subject: [PATCH 096/239] Pass click events to click handler --- shared/naturalcrit/nav/nav.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/naturalcrit/nav/nav.jsx b/shared/naturalcrit/nav/nav.jsx index beb3d9cc4..a4682aeab 100644 --- a/shared/naturalcrit/nav/nav.jsx +++ b/shared/naturalcrit/nav/nav.jsx @@ -47,8 +47,8 @@ const Nav = { color : null }; }, - handleClick : function(){ - this.props.onClick(); + handleClick : function(e){ + this.props.onClick(e); }, render : function(){ const classes = cx('navItem', this.props.color, this.props.className); From 8fc224e9a10a18bf6c30dc732a6fb8204616596e Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 28 May 2024 17:33:52 -0400 Subject: [PATCH 097/239] Update themes/V3/5ePHB/snippets.js --- themes/V3/5ePHB/snippets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index 01ec1c700..d5f37ac65 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -34,7 +34,7 @@ module.exports = [ }, { name : 'Include in ToC up to H3', - icon : 'fas fa-dice-six', + icon : 'fas fa-dice-three', gen : dedent `\n{{tocDepthH3 }}\n`, From a6ce36689c75db97e4d47b56951d1949cf71e147 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 1 Jun 2024 12:38:01 +1200 Subject: [PATCH 098/239] Shift NotificationPopup to shared components & update BrewRenderer ref --- .../notificationPopup/notificationPopup.jsx | 0 .../notificationPopup/notificationPopup.less | 0 client/homebrew/brewRenderer/brewRenderer.jsx | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename client/{homebrew/brewRenderer => components}/notificationPopup/notificationPopup.jsx (100%) rename client/{homebrew/brewRenderer => components}/notificationPopup/notificationPopup.less (100%) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx b/client/components/notificationPopup/notificationPopup.jsx similarity index 100% rename from client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx rename to client/components/notificationPopup/notificationPopup.jsx diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less b/client/components/notificationPopup/notificationPopup.less similarity index 100% rename from client/homebrew/brewRenderer/notificationPopup/notificationPopup.less rename to client/components/notificationPopup/notificationPopup.less diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 6a4040b4d..9bfd17aec 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -10,7 +10,7 @@ const ErrorBar = require('./errorBar/errorBar.jsx'); //TODO: move to the brew renderer const RenderWarnings = require('homebrewery/renderWarnings/renderWarnings.jsx'); -const NotificationPopup = require('./notificationPopup/notificationPopup.jsx'); +const NotificationPopup = require('../../../client/components/notificationPopup/notificationPopup.jsx'); const Frame = require('react-frame-component').default; const dedent = require('dedent-tabs').default; const { printCurrentBrew } = require('../../../shared/helpers.js'); From 930709223a910ce35660952561795d8c9fdfca41 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 1 Jun 2024 12:42:40 +1200 Subject: [PATCH 099/239] Lint fix --- client/homebrew/pages/editPage/editPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index fdd19b648..01269ec7d 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -418,7 +418,7 @@ const EditPage = createClass({ lang={this.state.brew.lang} currentEditorPage={this.state.currentEditorPage} allowPrint={true} - /> + /> }
From 6464f35ce916899caf05f29fa6fbf49980bccf03 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 31 May 2024 22:40:22 -0500 Subject: [PATCH 100/239] Forgot to run npm install after merge --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 145809f3e..74d1260fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "cookie-parser": "^1.4.6", "create-react-class": "^15.7.0", "dedent-tabs": "^0.10.3", - "dompurify": "^3.1.1", + "dompurify": "^3.1.4", "expr-eval": "^2.0.2", "express": "^4.19.2", "express-async-handler": "^1.2.0", @@ -44,7 +44,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-frame-component": "^4.1.3", - "react-router-dom": "6.23.0", + "react-router-dom": "6.23.1", "sanitize-filename": "1.6.3", "superagent": "^9.0.2", "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" @@ -2824,9 +2824,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.0.tgz", - "integrity": "sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", + "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", "engines": { "node": ">=14.0.0" } @@ -11565,11 +11565,11 @@ "dev": true }, "node_modules/react-router": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.0.tgz", - "integrity": "sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", + "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", "dependencies": { - "@remix-run/router": "1.16.0" + "@remix-run/router": "1.16.1" }, "engines": { "node": ">=14.0.0" @@ -11579,12 +11579,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.0.tgz", - "integrity": "sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", + "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", "dependencies": { - "@remix-run/router": "1.16.0", - "react-router": "6.23.0" + "@remix-run/router": "1.16.1", + "react-router": "6.23.1" }, "engines": { "node": ">=14.0.0" From fbe65a4e93ad86309eb1bc3ea41957937d7c9ece Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 1 Jun 2024 00:32:25 -0500 Subject: [PATCH 101/239] Resolve indentation errors in TOC Generation, adjust partCover class This fixes an error in the recusion that was failing to add children under existing parents. Index generation now does not overindent when levels are skipped. PartCover less code as suggesred by CC. --- themes/V3/5ePHB/snippets/tableOfContents.gen.js | 16 +++++++++------- themes/V3/5ePHB/style.less | 7 +++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index c33530bd7..1ec778944 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -12,11 +12,13 @@ const getTOC = (pages)=>{ children : [] }); } else { - child.push({ - title : null, - page : page + 1, - children : [] - }); + if(child.length == 0) { + child.push({ + title : null, + page : page + 1, + children : [] + }); + } recursiveAdd(title, page, targetDepth, _.last(child).children, curDepth+1,); } }; @@ -41,14 +43,14 @@ const getTOC = (pages)=>{ const ToCIterate = (entries, curDepth=0)=>{ - const levelPad = ['- ###', ' - ####', ' - ####', ' - ####', ' - ####', ' - ####']; + const levelPad = ['- ###', ' - ####', ' - ', ' - ', ' - ', ' - ']; const toc = []; if(entries.title !== null){ toc.push(`${levelPad[curDepth]} [{{ ${entries.title}}}{{ ${entries.page}}}](#p${entries.page})`); } if(entries.children.length) { _.each(entries.children, (entry, idx)=>{ - const children = ToCIterate(entry, curDepth+1); + const children = ToCIterate(entry, entry.title == null ? curDepth : curDepth+1); if(children.length) { toc.push(...children); } diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 7ef50df34..8b805b760 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -812,6 +812,13 @@ h6, .tocIncludeH5 h5 {--TOC: include; } .tocIncludeH6 h6 {--TOC: include; } +.page:has(.partCover) { + --TOC: exclude; + &h1 { + --TOC: include; + } + } + .page { &:has(.toc)::after { display : none; } .toc { From e0a457bf40ef05ec18f63ac791cfe5b592aae451 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 03:05:35 +0000 Subject: [PATCH 102/239] Bump mongoose from 8.4.0 to 8.4.1 Bumps [mongoose](https://github.com/Automattic/mongoose) from 8.4.0 to 8.4.1. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/8.4.0...8.4.1) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index e18ca8ac7..8201f3050 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", - "mongoose": "^8.4.0", + "mongoose": "^8.4.1", "nanoid": "3.3.4", "nconf": "^0.12.1", "react": "^18.3.1", @@ -10561,9 +10561,9 @@ } }, "node_modules/mongoose": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.0.tgz", - "integrity": "sha512-fgqRMwVEP1qgRYfh+tUe2YBBFnPO35FIg2lfFH+w9IhRGg1/ataWGIqvf/MjwM29cZ60D5vSnqtN2b8Qp0sOZA==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.1.tgz", + "integrity": "sha512-odQ2WEWGL3hb0Qex+QMN4eH6D34WdMEw7F1If2MGABApSDmG9cMmqv/G1H6WsXmuaH9mkuuadW/WbLE5+tHJwA==", "dependencies": { "bson": "^6.7.0", "kareem": "2.6.3", diff --git a/package.json b/package.json index c98c42817..61855ca3a 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", - "mongoose": "^8.4.0", + "mongoose": "^8.4.1", "nanoid": "3.3.4", "nconf": "^0.12.1", "react": "^18.3.1", From 8685c5cae47b95d6277d57a688b3c62a0d37cca8 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Tue, 4 Jun 2024 16:26:51 +1200 Subject: [PATCH 103/239] Break Dialog out of NotificationPopup, restore NotificationPopup to original position --- client/components/dialog.jsx | 48 +++++++++++ .../notificationPopup/notificationPopup.jsx | 80 ------------------- client/homebrew/brewRenderer/brewRenderer.jsx | 13 +-- .../notificationPopup/notificationPopup.jsx | 43 ++++++++++ .../notificationPopup/notificationPopup.less | 3 +- 5 files changed, 100 insertions(+), 87 deletions(-) create mode 100644 client/components/dialog.jsx delete mode 100644 client/components/notificationPopup/notificationPopup.jsx create mode 100644 client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx rename client/{components => homebrew/brewRenderer}/notificationPopup/notificationPopup.less (96%) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx new file mode 100644 index 000000000..9e17be2f9 --- /dev/null +++ b/client/components/dialog.jsx @@ -0,0 +1,48 @@ +// Modal as a separate component +const React = require('react'); +const { useState, useRef, useEffect } = React; + +function Modal({ dismissKey, blocking, children, ...rest }) { + const ref = useRef(); + + const [open, setOpen] = useState(false); + + useEffect(()=>{ + if(!window || !dismissKey) return; + if(!localStorage.getItem(dismissKey)){ + setOpen(true); + } + }, []); + + useEffect(()=>{ + if(blocking) { + modal ? ref.current?.showModal() : ref.current?.show(); + } else { + ref.current?.close(); + } + }, [blocking]); + + const dismiss = function(){ + localStorage.setItem(dismissKey, true); + setOpen(false); + }; + + if(!open) return; + return ( + dismiss()} + {...rest} + > + + {children} + + ); +} + +export default Modal; \ No newline at end of file diff --git a/client/components/notificationPopup/notificationPopup.jsx b/client/components/notificationPopup/notificationPopup.jsx deleted file mode 100644 index 6872d6c3e..000000000 --- a/client/components/notificationPopup/notificationPopup.jsx +++ /dev/null @@ -1,80 +0,0 @@ -require('./notificationPopup.less'); -const React = require('react'); -const createClass = require('create-react-class'); -const _ = require('lodash'); - -const DISMISS_KEY = 'dismiss_notification12-04-23'; - -const NotificationPopup = createClass({ - displayName : 'NotificationPopup', - getInitialState : function() { - return { - notifications : {} - }; - }, - componentDidMount : function() { - this.checkNotifications(); - window.addEventListener('resize', this.checkNotifications); - }, - componentWillUnmount : function() { - window.removeEventListener('resize', this.checkNotifications); - }, - notifications : { - psa : function(){ - return ( - <> -
  • - Don't store IMAGES in Google Drive
    - Google Drive is not an image service, and will block images from being used - in brews if they get more views than expected. Google has confirmed they won't fix - this, so we recommend you look for another image hosting service such as imgur, ImgBB or Google Photos. -
  • - -
  • - Don't delete your Homebrewery folder on Google Drive!
    - We have had several reports of users losing their brews, not realizing - that they had deleted the files on their Google Drive. If you have a Homebrewery folder - on your Google Drive with *.txt files inside, do not delete it! - We cannot help you recover files that you have deleted from your own - Google Drive. -
  • - -
  • - Protect your work!
    - If you opt not to use your Google Drive, keep in mind that we do not save a history of your projects. Please make frequent backups of your brews!  - - See the FAQ - to learn how to avoid losing your work! -
  • - - ); - } - }, - checkNotifications : function(){ - const hideDismiss = localStorage.getItem(DISMISS_KEY); - if(hideDismiss) return this.setState({ notifications: {} }); - - this.setState({ - notifications : _.mapValues(this.notifications, (fn)=>{ return fn(); }) //Convert notification functions into their return text value - }); - }, - dismiss : function(){ - localStorage.setItem(DISMISS_KEY, true); - this.checkNotifications(); - }, - render : function(){ - if(_.isEmpty(this.state.notifications)) return null; - - return
    - - -
    -

    Notice

    - This website is always improving and we are still adding new features and squashing bugs. Keep the following in mind: -
    -
      {_.values(this.state.notifications)}
    -
    ; - } -}); - -module.exports = NotificationPopup; diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 9bfd17aec..8168f9933 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -10,7 +10,7 @@ const ErrorBar = require('./errorBar/errorBar.jsx'); //TODO: move to the brew renderer const RenderWarnings = require('homebrewery/renderWarnings/renderWarnings.jsx'); -const NotificationPopup = require('../../../client/components/notificationPopup/notificationPopup.jsx'); +const NotificationPopup = require('./notificationPopup/notificationPopup.jsx'); const Frame = require('react-frame-component').default; const dedent = require('dedent-tabs').default; const { printCurrentBrew } = require('../../../shared/helpers.js'); @@ -203,6 +203,12 @@ const BrewRenderer = (props)=>{
    : null} + +
    + + +
    + {/*render in iFrame so broken code doesn't crash the site.*/} { tabIndex={-1} style={{ height: state.height }}> - -
    - - -
    {baseThemePath && diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx new file mode 100644 index 000000000..1b6a60093 --- /dev/null +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx @@ -0,0 +1,43 @@ +require('./notificationPopup.less'); +const React = require('react'); +const _ = require('lodash'); + +import Dialog from '../../../components/dialog.jsx'; + +const DISMISS_KEY = 'dismiss_notification12-04-23'; + +const NotificationPopup = (props)=>{ + return +
    +

    Notice

    + This website is always improving and we are still adding new features and squashing bugs. Keep the following in mind: +
    +
      +
    • + Don't store IMAGES in Google Drive
      + Google Drive is not an image service, and will block images from being used + in brews if they get more views than expected. Google has confirmed they won't fix + this, so we recommend you look for another image hosting service such as imgur, ImgBB or Google Photos. +
    • + +
    • + Don't delete your Homebrewery folder on Google Drive!
      + We have had several reports of users losing their brews, not realizing + that they had deleted the files on their Google Drive. If you have a Homebrewery folder + on your Google Drive with *.txt files inside, do not delete it! + We cannot help you recover files that you have deleted from your own + Google Drive. +
    • + +
    • + Protect your work!
      + If you opt not to use your Google Drive, keep in mind that we do not save a history of your projects. Please make frequent backups of your brews!  + + See the FAQ + to learn how to avoid losing your work! +
    • +
    +
    ; +}; + +module.exports = NotificationPopup; diff --git a/client/components/notificationPopup/notificationPopup.less b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less similarity index 96% rename from client/components/notificationPopup/notificationPopup.less rename to client/homebrew/brewRenderer/notificationPopup/notificationPopup.less index dfd3c6c63..2fde67b83 100644 --- a/client/components/notificationPopup/notificationPopup.less +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less @@ -15,6 +15,7 @@ padding-left : 25px; background-color : @blue; color : white; + border : none; a{ color : #e0e5c1; font-weight : 800; @@ -26,7 +27,7 @@ opacity : 0.8; font-size : 2.5em; } - i.dismiss{ + .dismiss{ position : absolute; top : 10px; right : 10px; From f3b01bc75cc36a04de1b752cae5ff9f9d66b5818 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Tue, 4 Jun 2024 16:51:43 +1200 Subject: [PATCH 104/239] Fix for modals --- client/components/dialog.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index 9e17be2f9..86816b062 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -15,12 +15,12 @@ function Modal({ dismissKey, blocking, children, ...rest }) { }, []); useEffect(()=>{ - if(blocking) { - modal ? ref.current?.showModal() : ref.current?.show(); + if(open) { + blocking ? ref.current?.showModal() : ref.current?.show(); } else { ref.current?.close(); } - }, [blocking]); + }, [open]); const dismiss = function(){ localStorage.setItem(dismissKey, true); From 1111d8275c0d1ab377050003392f7774be2594c1 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Tue, 4 Jun 2024 17:27:45 +1200 Subject: [PATCH 105/239] Tweak dismiss button styling --- .../brewRenderer/notificationPopup/notificationPopup.less | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less index 2fde67b83..f09556a29 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less @@ -27,14 +27,15 @@ opacity : 0.8; font-size : 2.5em; } - .dismiss{ + button.dismiss{ position : absolute; top : 10px; right : 10px; cursor : pointer; - opacity : 0.6; + background-color: transparent; &:hover{ opacity : 1; + background-color: #333; } } .header { From e7735e242a20b4be7cad074f7ace2f0bcde7067c Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Tue, 4 Jun 2024 17:28:29 +1200 Subject: [PATCH 106/239] Add closeText prop --- client/components/dialog.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index 86816b062..1f8c30887 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -2,7 +2,7 @@ const React = require('react'); const { useState, useRef, useEffect } = React; -function Modal({ dismissKey, blocking, children, ...rest }) { +function Modal({ dismissKey, blocking, children, closeText = 'Close', ...rest }) { const ref = useRef(); const [open, setOpen] = useState(false); @@ -38,7 +38,7 @@ function Modal({ dismissKey, blocking, children, ...rest }) { className='dismiss' onClick={()=>dismiss()} > - Close + {closeText} {children} From 05ba7b41d153aae46e9a72c52c21954c80a09ee4 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Tue, 4 Jun 2024 17:29:34 +1200 Subject: [PATCH 107/239] Tweak NotificationPopup --- .../brewRenderer/notificationPopup/notificationPopup.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx index 1b6a60093..f767fe985 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx @@ -6,8 +6,8 @@ import Dialog from '../../../components/dialog.jsx'; const DISMISS_KEY = 'dismiss_notification12-04-23'; -const NotificationPopup = (props)=>{ - return +const NotificationPopup = ()=>{ + return

    Notice

    This website is always improving and we are still adding new features and squashing bugs. Keep the following in mind: From 865c5678bc5bd84c469af9d7d358a7dcef3f136f Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Tue, 4 Jun 2024 17:34:26 +1200 Subject: [PATCH 108/239] Change all Modal references to Dialog --- client/components/dialog.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index 1f8c30887..36df4efc3 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -1,8 +1,8 @@ -// Modal as a separate component +// Dialog as a separate component const React = require('react'); const { useState, useRef, useEffect } = React; -function Modal({ dismissKey, blocking, children, closeText = 'Close', ...rest }) { +function Dialog({ dismissKey, closeText = 'Close', blocking = false, children, ...rest }) { const ref = useRef(); const [open, setOpen] = useState(false); @@ -45,4 +45,4 @@ function Modal({ dismissKey, blocking, children, closeText = 'Close', ...rest }) ); } -export default Modal; \ No newline at end of file +export default Dialog; \ No newline at end of file From 5f6d5f53cc974ccd172d1b2951092b05db78bd4e Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Tue, 4 Jun 2024 17:38:06 +1200 Subject: [PATCH 109/239] Change dismiss button to use fa-dismiss --- .../brewRenderer/notificationPopup/notificationPopup.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx index f767fe985..888704359 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx @@ -6,8 +6,10 @@ import Dialog from '../../../components/dialog.jsx'; const DISMISS_KEY = 'dismiss_notification12-04-23'; +const DISMISS_BUTTON = ; + const NotificationPopup = ()=>{ - return + return

    Notice

    This website is always improving and we are still adding new features and squashing bugs. Keep the following in mind: From 24e67e22708ba98570f92fed57ce657c819210bf Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Tue, 4 Jun 2024 17:47:17 +1200 Subject: [PATCH 110/239] Restore Info Circle to notification --- .../brewRenderer/notificationPopup/notificationPopup.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx index 888704359..1c0382129 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx @@ -11,6 +11,7 @@ const DISMISS_BUTTON = ; const NotificationPopup = ()=>{ return
    +

    Notice

    This website is always improving and we are still adding new features and squashing bugs. Keep the following in mind:
    From 491b38c3301044bb248e93045b4dafd6e269da47 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 4 Jun 2024 12:29:13 -0400 Subject: [PATCH 111/239] Small cleanup of Dialog component Reduce number of `useEffects` needed --- client/components/dialog.jsx | 35 ++++++++++------------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index 36df4efc3..dc18b8e77 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -2,45 +2,30 @@ const React = require('react'); const { useState, useRef, useEffect } = React; -function Dialog({ dismissKey, closeText = 'Close', blocking = false, children, ...rest }) { - const ref = useRef(); - +function Dialog({ dismissKey, closeText = 'Close', blocking = false, ...rest }) { + const dialogRef = useRef(); const [open, setOpen] = useState(false); useEffect(()=>{ - if(!window || !dismissKey) return; - if(!localStorage.getItem(dismissKey)){ + if(dismissKey && !localStorage.getItem(dismissKey)) { + blocking ? dialogRef.current?.showModal() : dialogRef.current?.show(); setOpen(true); } }, []); - useEffect(()=>{ - if(open) { - blocking ? ref.current?.showModal() : ref.current?.show(); - } else { - ref.current?.close(); - } - }, [open]); - - const dismiss = function(){ + const dismiss = ()=>{ localStorage.setItem(dismissKey, true); + dialogRef.current?.close(); setOpen(false); }; - if(!open) return; + if(!open) return null; return ( - dismiss()} - {...rest} - > - - {children} + {rest.children} ); } From 99ff7fdf144753268852795be229892e96b5472b Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 4 Jun 2024 12:32:21 -0400 Subject: [PATCH 112/239] linting --- .../brewRenderer/notificationPopup/notificationPopup.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx index 1c0382129..cca60bbec 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx @@ -5,7 +5,6 @@ const _ = require('lodash'); import Dialog from '../../../components/dialog.jsx'; const DISMISS_KEY = 'dismiss_notification12-04-23'; - const DISMISS_BUTTON = ; const NotificationPopup = ()=>{ From 727254472442074b20308b288a7e66fd9cc99658 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 4 Jun 2024 14:53:19 -0400 Subject: [PATCH 113/239] Convert LockNotification.jsx to functional component --- .../lockNotification/lockNotification.jsx | 57 ++++++++----------- 1 file changed, 23 insertions(+), 34 deletions(-) diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx index c697d8804..7252a710f 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx @@ -1,40 +1,29 @@ require('./lockNotification.less'); const React = require('react'); -const createClass = require('create-react-class'); -const LockNotification = createClass({ - displayName : 'LockNotification', - - getDefaultProps : function() { - return { - shareId : 0 - }; - }, - - getInitialState : function() { - return { - disableLock : ()=>{} - }; - }, - - removeLock : function() { - alert(`Not yet implemented - ID ${this.props.shareId}`); - }, - - render : function(){ - return
    -

    BREW LOCKED

    -

    This brew been locked by the Administrators. It will not be accessible by any method other than the Editor until the lock is removed.

    -
    -

    LOCK REASON

    -

    {this.props.message || 'Unable to retrieve Lock Message'}

    -
    -

    Once you have resolved this issue, click REQUEST LOCK REMOVAL to notify the Administrators for review.

    -

    Click CONTINUE TO EDITOR to temporarily hide this notification; it will reappear the next time the page is reloaded.

    - - -
    ; +function LockNotification(props) { + props = { + shareId : 0, + disableLock : ()=>{}, + ...props } -}); + + const removeLock = () => { + alert(`Not yet implemented - ID ${props.shareId}`); + }; + + return
    +

    BREW LOCKED

    +

    This brew been locked by the Administrators. It will not be accessible by any method other than the Editor until the lock is removed.

    +
    +

    LOCK REASON

    +

    {props.message || 'Unable to retrieve Lock Message'}

    +
    +

    Once you have resolved this issue, click REQUEST LOCK REMOVAL to notify the Administrators for review.

    +

    Click CONTINUE TO EDITOR to temporarily hide this notification; it will reappear the next time the page is reloaded.

    + + +
    ; +}; module.exports = LockNotification; From ec514cdb51c4162fb7e9408a36843bbf6f614e2b Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Wed, 5 Jun 2024 07:49:29 +1200 Subject: [PATCH 114/239] Set local storage only if dismissKey prop exists --- client/components/dialog.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index dc18b8e77..eb21b56e2 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -14,7 +14,7 @@ function Dialog({ dismissKey, closeText = 'Close', blocking = false, ...rest }) }, []); const dismiss = ()=>{ - localStorage.setItem(dismissKey, true); + dismissKey && localStorage.setItem(dismissKey, true); dialogRef.current?.close(); setOpen(false); }; From 31b6e0c4f652f8a225e45301b6635287f5e804fc Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Wed, 5 Jun 2024 12:33:13 +1200 Subject: [PATCH 115/239] Show dialog when dismissKey prop is not specified --- client/components/dialog.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index eb21b56e2..90d51753c 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -7,7 +7,7 @@ function Dialog({ dismissKey, closeText = 'Close', blocking = false, ...rest }) const [open, setOpen] = useState(false); useEffect(()=>{ - if(dismissKey && !localStorage.getItem(dismissKey)) { + if(!dismissKey || !localStorage.getItem(dismissKey)) { blocking ? dialogRef.current?.showModal() : dialogRef.current?.show(); setOpen(true); } From 0efcd5d2588ff2276b91189a766fda467cdb92fa Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Wed, 5 Jun 2024 13:03:26 +1200 Subject: [PATCH 116/239] Shift LockNotification to use Dialog --- .../pages/editPage/lockNotification/lockNotification.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx index 7252a710f..ac64b6bd7 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx @@ -1,5 +1,6 @@ require('./lockNotification.less'); const React = require('react'); +const Dialog = require('../../../../components/dialog.jsx'); function LockNotification(props) { props = { @@ -12,7 +13,7 @@ function LockNotification(props) { alert(`Not yet implemented - ID ${props.shareId}`); }; - return
    + return

    BREW LOCKED

    This brew been locked by the Administrators. It will not be accessible by any method other than the Editor until the lock is removed.


    @@ -23,7 +24,7 @@ function LockNotification(props) {

    Click CONTINUE TO EDITOR to temporarily hide this notification; it will reappear the next time the page is reloaded.

    -
    ; +
    ; }; module.exports = LockNotification; From b7f88d53d00d8e0655d473ef10b5b51a5b883cf7 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 5 Jun 2024 17:44:29 -0500 Subject: [PATCH 117/239] Solve for .descriptive and .wide not getting along with suggested fix from Issue. Uses more more direct target rather than rearrange the file. --- themes/V3/5ePHB/style.less | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 400174ab0..ff896f9d2 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -874,6 +874,10 @@ .page h1 + * { margin-top : 0; } +.page .descriptive.wide { + margin-top: 0; +} + //***************************** // * RUNE TABLE // *****************************/ From 556ded9b0839f6df46602b1b6218ee4ab7cf2b4f Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 6 Jun 2024 12:01:55 +1200 Subject: [PATCH 118/239] Tweak Dialog to work with showModal and show LockNotifications --- client/components/dialog.jsx | 12 +++-- client/homebrew/pages/editPage/editPage.jsx | 47 +++++++++---------- .../lockNotification/lockNotification.jsx | 10 ++-- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index 90d51753c..7bd4e5795 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -8,18 +8,24 @@ function Dialog({ dismissKey, closeText = 'Close', blocking = false, ...rest }) useEffect(()=>{ if(!dismissKey || !localStorage.getItem(dismissKey)) { - blocking ? dialogRef.current?.showModal() : dialogRef.current?.show(); - setOpen(true); + !open && setOpen(true); } }, []); + useEffect(()=>{ + if(open && !dialogRef.current?.open){ + blocking ? dialogRef.current?.showModal() : dialogRef.current?.show(); + } else { + dialogRef.current?.close(); + } + }, [open]); + const dismiss = ()=>{ dismissKey && localStorage.setItem(dismissKey, true); dialogRef.current?.close(); setOpen(false); }; - if(!open) return null; return (
    ; } diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx index ac64b6bd7..c5eeaee47 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.jsx @@ -1,19 +1,20 @@ require('./lockNotification.less'); const React = require('react'); -const Dialog = require('../../../../components/dialog.jsx'); +import Dialog from '../../../../components/dialog.jsx'; function LockNotification(props) { props = { shareId : 0, disableLock : ()=>{}, + message : '', ...props - } + }; - const removeLock = () => { + const removeLock = ()=>{ alert(`Not yet implemented - ID ${props.shareId}`); }; - return + return

    BREW LOCKED

    This brew been locked by the Administrators. It will not be accessible by any method other than the Editor until the lock is removed.


    @@ -22,7 +23,6 @@ function LockNotification(props) {

    Once you have resolved this issue, click REQUEST LOCK REMOVAL to notify the Administrators for review.

    Click CONTINUE TO EDITOR to temporarily hide this notification; it will reappear the next time the page is reloaded.

    -
    ; }; From 4f4cef0f6c2d7984d4cddc3216992d54658858df Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 6 Jun 2024 12:02:07 +1200 Subject: [PATCH 119/239] Tweak LockNotification styling --- .../pages/editPage/lockNotification/lockNotification.less | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.less b/client/homebrew/pages/editPage/lockNotification/lockNotification.less index 18dec07e3..f8bf72d0a 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.less +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.less @@ -2,9 +2,11 @@ background-color: #ccc; color: black; padding: 10px; - margin: 25px 100px; + margin: 5% 10%; + width: 80%; text-align: center; line-height: 1.5em; + z-index: 1; button { background-color: #333; From 978c0c4c7be3223b692856d3336422a7aebc1ce2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Jun 2024 03:01:32 +0000 Subject: [PATCH 120/239] Bump @babel/preset-react from 7.24.1 to 7.24.7 Bumps [@babel/preset-react](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-react) from 7.24.1 to 7.24.7. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.7/packages/babel-preset-react) --- updated-dependencies: - dependency-name: "@babel/preset-react" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 220 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 113 insertions(+), 109 deletions(-) diff --git a/package-lock.json b/package-lock.json index e18ca8ac7..0049b7070 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@babel/core": "^7.24.5", "@babel/plugin-transform-runtime": "^7.24.3", "@babel/preset-env": "^7.24.5", - "@babel/preset-react": "^7.24.1", + "@babel/preset-react": "^7.24.7", "@googleapis/drive": "^8.8.0", "body-parser": "^1.20.2", "classnames": "^2.5.1", @@ -89,11 +89,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -143,11 +143,11 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dependencies": { - "@babel/types": "^7.24.5", + "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -170,11 +170,11 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -260,31 +260,34 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -302,11 +305,12 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -342,9 +346,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "engines": { "node": ">=6.9.0" } @@ -404,36 +408,36 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "engines": { "node": ">=6.9.0" } @@ -465,11 +469,11 @@ } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -479,9 +483,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -681,11 +685,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1383,11 +1387,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1397,15 +1401,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", + "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1415,11 +1419,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/plugin-transform-react-jsx": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1429,12 +1433,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", - "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", + "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1729,16 +1733,16 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", + "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-react-display-name": "^7.24.1", - "@babel/plugin-transform-react-jsx": "^7.23.4", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.24.7", + "@babel/plugin-transform-react-jsx-development": "^7.24.7", + "@babel/plugin-transform-react-pure-annotations": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1764,31 +1768,31 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1797,12 +1801,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { diff --git a/package.json b/package.json index c98c42817..1eb9e667f 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "@babel/core": "^7.24.5", "@babel/plugin-transform-runtime": "^7.24.3", "@babel/preset-env": "^7.24.5", - "@babel/preset-react": "^7.24.1", + "@babel/preset-react": "^7.24.7", "@googleapis/drive": "^8.8.0", "body-parser": "^1.20.2", "classnames": "^2.5.1", From 9e041d26bd18fc236d7735afa5c58838c4797aea Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 6 Jun 2024 21:40:54 +1200 Subject: [PATCH 121/239] Fix display property on dialog causing close() to not work --- .../brewRenderer/notificationPopup/notificationPopup.less | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less index f09556a29..d09787c6d 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less @@ -8,7 +8,6 @@ .notificationPopup{ position : relative; - display : inline-block; width : 100%; padding : 15px; padding-bottom : 10px; @@ -16,6 +15,10 @@ background-color : @blue; color : white; border : none; + &[open]{ + // Do NOT set a display property on a dialog! Set it on dialog[open] instead + display: block; + } a{ color : #e0e5c1; font-weight : 800; From fa7b3ea2a0b75ca88366941d6675be6cc0057453 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 6 Jun 2024 21:41:33 +1200 Subject: [PATCH 122/239] Shift dismiss button, tweak local storage check --- client/components/dialog.jsx | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index 7bd4e5795..c37ed649c 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -3,11 +3,11 @@ const React = require('react'); const { useState, useRef, useEffect } = React; function Dialog({ dismissKey, closeText = 'Close', blocking = false, ...rest }) { - const dialogRef = useRef(); + const dialogRef = useRef(null); const [open, setOpen] = useState(false); useEffect(()=>{ - if(!dismissKey || !localStorage.getItem(dismissKey)) { + if(!localStorage.getItem(dismissKey)) { !open && setOpen(true); } }, []); @@ -22,18 +22,16 @@ function Dialog({ dismissKey, closeText = 'Close', blocking = false, ...rest }) const dismiss = ()=>{ dismissKey && localStorage.setItem(dismissKey, true); - dialogRef.current?.close(); setOpen(false); }; - return ( - - - {rest.children} - - ); -} + return + {rest.children} + + + ; +}; export default Dialog; \ No newline at end of file From 38fc6474956922b566aacbd24f9812e7c8ce70a5 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 6 Jun 2024 21:46:34 +1200 Subject: [PATCH 123/239] Change NotificationPopup to inline-block from block --- .../brewRenderer/notificationPopup/notificationPopup.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less index d09787c6d..8fdfaeff3 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less @@ -17,7 +17,7 @@ border : none; &[open]{ // Do NOT set a display property on a dialog! Set it on dialog[open] instead - display: block; + display: inline-block; } a{ color : #e0e5c1; From ed39852a8f7cd77179c75c698892c07888e00f87 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 6 Jun 2024 22:00:28 +1200 Subject: [PATCH 124/239] Move dialog[open] to Dialog component styling --- client/components/dialog.jsx | 1 + client/components/dialog.less | 6 ++++++ .../brewRenderer/notificationPopup/notificationPopup.less | 4 ---- 3 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 client/components/dialog.less diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index c37ed649c..8f298d571 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -1,4 +1,5 @@ // Dialog as a separate component +require('./dialog.less'); const React = require('react'); const { useState, useRef, useEffect } = React; diff --git a/client/components/dialog.less b/client/components/dialog.less new file mode 100644 index 000000000..bbfb40393 --- /dev/null +++ b/client/components/dialog.less @@ -0,0 +1,6 @@ +dialog{ + &[open]{ + // Do NOT set a display property on a dialog! Set it on dialog[open] instead + display: inline-block; + } +} \ No newline at end of file diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less index 8fdfaeff3..fe5e1c540 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less @@ -15,10 +15,6 @@ background-color : @blue; color : white; border : none; - &[open]{ - // Do NOT set a display property on a dialog! Set it on dialog[open] instead - display: inline-block; - } a{ color : #e0e5c1; font-weight : 800; From 866548deec0da12baa32cfef5d0830093ebc1f31 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 6 Jun 2024 22:12:13 +1200 Subject: [PATCH 125/239] Move renderWarnings to use Dialog --- .../renderWarnings/renderWarnings.jsx | 17 ++++++----------- .../renderWarnings/renderWarnings.less | 5 +++-- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/shared/homebrewery/renderWarnings/renderWarnings.jsx b/shared/homebrewery/renderWarnings/renderWarnings.jsx index 6028f1708..e9c5f6f57 100644 --- a/shared/homebrewery/renderWarnings/renderWarnings.jsx +++ b/shared/homebrewery/renderWarnings/renderWarnings.jsx @@ -3,7 +3,7 @@ const React = require('react'); const createClass = require('create-react-class'); const _ = require('lodash'); -const DISMISS_KEY = 'dismiss_render_warning'; +import Dialog from '../../../client/components/dialog.jsx'; const RenderWarnings = createClass({ displayName : 'RenderWarnings', @@ -34,9 +34,6 @@ const RenderWarnings = createClass({ }, }, checkWarnings : function(){ - const hideDismiss = localStorage.getItem(DISMISS_KEY); - if(hideDismiss) return this.setState({ warnings: {} }); - this.setState({ warnings : _.reduce(this.warnings, (r, fn, type)=>{ const element = fn(); @@ -45,20 +42,18 @@ const RenderWarnings = createClass({ }, {}) }); }, - dismiss : function(){ - localStorage.setItem(DISMISS_KEY, true); - this.checkWarnings(); - }, render : function(){ if(_.isEmpty(this.state.warnings)) return null; - return
    - + const DISMISS_KEY = 'dismiss_render_warning'; + const DISMISS_TEXT = ; + + return

    Render Warnings

    If this homebrew is rendering badly if might be because of the following:
      {_.values(this.state.warnings)}
    -
    ; +
    ; } }); diff --git a/shared/homebrewery/renderWarnings/renderWarnings.less b/shared/homebrewery/renderWarnings/renderWarnings.less index 4b038a11a..8524b5451 100644 --- a/shared/homebrewery/renderWarnings/renderWarnings.less +++ b/shared/homebrewery/renderWarnings/renderWarnings.less @@ -1,7 +1,6 @@ .renderWarnings{ position : relative; float : right; - display : inline-block; width : 350px; padding : 20px; padding-bottom : 10px; @@ -9,6 +8,7 @@ margin-bottom : 10px; background-color : @yellow; color : white; + border : none; a{ font-weight : 800; } @@ -19,12 +19,13 @@ opacity : 0.8; font-size : 2.5em; } - i.dismiss{ + button.dismiss{ position : absolute; top : 10px; right : 10px; cursor : pointer; opacity : 0.6; + background-color: transparent; &:hover{ opacity : 1; } From 359a64968cddccda1025e1414eec659634bb0d3f Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 6 Jun 2024 22:31:05 +1200 Subject: [PATCH 126/239] Nudge popups left --- .../brewRenderer/notificationPopup/notificationPopup.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less index fe5e1c540..6091a1bd8 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less @@ -1,7 +1,7 @@ .popups{ position : fixed; top : @navbarHeight; - right : 15px; + right : 24px; z-index : 10001; width : 450px; } From 8c315980e9caa14b2ba81114d8df94c9a9e8c3ff Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 6 Jun 2024 22:37:01 +1200 Subject: [PATCH 127/239] Revert dismiss styling to opacity change on hover --- .../brewRenderer/notificationPopup/notificationPopup.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less index 6091a1bd8..9505d4ffb 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less @@ -31,10 +31,10 @@ top : 10px; right : 10px; cursor : pointer; + opacity : 0.6; background-color: transparent; &:hover{ opacity : 1; - background-color: #333; } } .header { From a87d62c9c22a91fa53edc94c0aaf4528121c81eb Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 7 Jun 2024 09:30:09 +1200 Subject: [PATCH 128/239] Tweak page line brightness As per Reddit report (https://redd.it/1d8opte), on dark CodeMirror themes, it can be difficult to read the folded text between the bright backgrounds of `\page` lines. This PR tweaks the brightness down slightly by reducing opacity of the background from 75% to 50%. --- themes/codeMirror/customEditorStyles.less | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/themes/codeMirror/customEditorStyles.less b/themes/codeMirror/customEditorStyles.less index 3318e1305..367eaec33 100644 --- a/themes/codeMirror/customEditorStyles.less +++ b/themes/codeMirror/customEditorStyles.less @@ -58,7 +58,7 @@ background-color: rgba(35,153,153,0.5); } .pageLine { - background-color: rgba(255,255,255,0.75); + background-color: rgba(255,255,255,0.5); & ~ pre.CodeMirror-line { color: black; } @@ -85,4 +85,4 @@ // Future styling for themes with light backgrounds --dummyVar: 'currently unused'; } -} \ No newline at end of file +} From 7bb92bc790efe757a75863d4e4f710fe8c7021b5 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Thu, 6 Jun 2024 18:10:04 -0400 Subject: [PATCH 129/239] Refactor slightly --- client/components/dialog.jsx | 15 +++------------ client/components/dialog.less | 6 ------ 2 files changed, 3 insertions(+), 18 deletions(-) delete mode 100644 client/components/dialog.less diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index 8f298d571..97884fe5a 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -5,25 +5,16 @@ const { useState, useRef, useEffect } = React; function Dialog({ dismissKey, closeText = 'Close', blocking = false, ...rest }) { const dialogRef = useRef(null); - const [open, setOpen] = useState(false); useEffect(()=>{ - if(!localStorage.getItem(dismissKey)) { - !open && setOpen(true); + if(!dismissKey || !localStorage.getItem(dismissKey)) { + blocking ? dialogRef.current?.showModal() : dialogRef.current?.show(); } }, []); - useEffect(()=>{ - if(open && !dialogRef.current?.open){ - blocking ? dialogRef.current?.showModal() : dialogRef.current?.show(); - } else { - dialogRef.current?.close(); - } - }, [open]); - const dismiss = ()=>{ dismissKey && localStorage.setItem(dismissKey, true); - setOpen(false); + dialogRef.current?.close(); }; return diff --git a/client/components/dialog.less b/client/components/dialog.less deleted file mode 100644 index bbfb40393..000000000 --- a/client/components/dialog.less +++ /dev/null @@ -1,6 +0,0 @@ -dialog{ - &[open]{ - // Do NOT set a display property on a dialog! Set it on dialog[open] instead - display: inline-block; - } -} \ No newline at end of file From 54ec1b88271dc923a4ec25ed42bed836b397acd3 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 7 Jun 2024 10:50:57 +1200 Subject: [PATCH 130/239] Comment out dialog.less reference --- client/components/dialog.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index 97884fe5a..4d772630f 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -1,5 +1,5 @@ // Dialog as a separate component -require('./dialog.less'); +// require('./dialog.less'); const React = require('react'); const { useState, useRef, useEffect } = React; @@ -26,4 +26,4 @@ function Dialog({ dismissKey, closeText = 'Close', blocking = false, ...rest }) ; }; -export default Dialog; \ No newline at end of file +export default Dialog; From 476002ae4d9f26ac009a0403cc14f4025259eb8e Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 7 Jun 2024 11:01:47 +1200 Subject: [PATCH 131/239] Tweak notificationPopup.less Stop the notification from covering the renderWarning when both are present --- .../brewRenderer/notificationPopup/notificationPopup.less | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less index 9505d4ffb..c0a47b4b5 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less @@ -15,6 +15,9 @@ background-color : @blue; color : white; border : none; + &[open]{ + display : inline-block; + } a{ color : #e0e5c1; font-weight : 800; From 8bbf2e1ce4897af516b4c885ebe9f8106df78921 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 7 Jun 2024 11:25:34 +1200 Subject: [PATCH 132/239] Dim background while Modal displayed --- .../pages/editPage/lockNotification/lockNotification.less | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.less b/client/homebrew/pages/editPage/lockNotification/lockNotification.less index f8bf72d0a..02bee738e 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.less +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.less @@ -8,6 +8,10 @@ line-height: 1.5em; z-index: 1; + &::backdrop { + background-color: #000a; + } + button { background-color: #333; color: white; @@ -28,4 +32,4 @@ h3 { font-size: 18px; } -} \ No newline at end of file +} From 33c2bee8735a931922e9f63663eb456e6392ed5b Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 7 Jun 2024 16:05:14 +1200 Subject: [PATCH 133/239] Remove unused useState --- client/components/dialog.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index 4d772630f..c426bc80a 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -1,7 +1,7 @@ // Dialog as a separate component // require('./dialog.less'); const React = require('react'); -const { useState, useRef, useEffect } = React; +const { useRef, useEffect } = React; function Dialog({ dismissKey, closeText = 'Close', blocking = false, ...rest }) { const dialogRef = useRef(null); From 08b61a6bb423c7bd879aa1e168f236c415a84eb2 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 7 Jun 2024 11:26:47 -0400 Subject: [PATCH 134/239] Cleanup comments. Fix Indentation. --- client/components/dialog.jsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/client/components/dialog.jsx b/client/components/dialog.jsx index c426bc80a..2057ecb87 100644 --- a/client/components/dialog.jsx +++ b/client/components/dialog.jsx @@ -1,5 +1,4 @@ -// Dialog as a separate component -// require('./dialog.less'); +// Dialog box, for popups and modal blocking messages const React = require('react'); const { useRef, useEffect } = React; @@ -17,13 +16,14 @@ function Dialog({ dismissKey, closeText = 'Close', blocking = false, ...rest }) dialogRef.current?.close(); }; - return - {rest.children} - - - ; + return ( + + {rest.children} + + + ); }; export default Dialog; From fdf6acd80ad5e01701f5d07ec2f7a8e70ec06413 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 7 Jun 2024 11:27:51 -0400 Subject: [PATCH 135/239] Lint notificationPopup.less --- .../notificationPopup/notificationPopup.less | 56 ++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less index c0a47b4b5..26d764aff 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less @@ -1,4 +1,4 @@ -.popups{ +.popups { position : fixed; top : @navbarHeight; right : 24px; @@ -6,63 +6,55 @@ width : 450px; } -.notificationPopup{ +.notificationPopup { position : relative; width : 100%; padding : 15px; padding-bottom : 10px; padding-left : 25px; - background-color : @blue; color : white; + background-color : @blue; border : none; - &[open]{ - display : inline-block; - } - a{ - color : #e0e5c1; + &[open] { display : inline-block; } + a { font-weight : 800; + color : #E0E5C1; } - i.info{ + i.info { position : absolute; top : 12px; left : 12px; - opacity : 0.8; font-size : 2.5em; + opacity : 0.8; } - button.dismiss{ - position : absolute; - top : 10px; - right : 10px; - cursor : pointer; - opacity : 0.6; - background-color: transparent; - &:hover{ - opacity : 1; - } + button.dismiss { + position : absolute; + top : 10px; + right : 10px; + cursor : pointer; + background-color : transparent; + opacity : 0.6; + &:hover { opacity : 1; } } - .header { - padding-left : 50px; - } - small{ - opacity : 0.7; + .header { padding-left : 50px; } + small { font-size : 0.6em; + opacity : 0.7; } - h3{ + h3 { font-size : 1.1em; font-weight : 800; } - ul{ + ul { margin-top : 15px; font-size : 0.8em; list-style-position : outside; list-style-type : disc; - li{ + li { + margin-top : 1.4em; font-size : 0.8em; line-height : 1.4em; - margin-top : 1.4em; - em{ - font-weight : 800; - } + em { font-weight : 800; } } } } From 65770782c206e12b904c762513df1b05a81d06fb Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 7 Jun 2024 11:28:30 -0400 Subject: [PATCH 136/239] Lint lockNotification.less --- .../lockNotification/lockNotification.less | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/client/homebrew/pages/editPage/lockNotification/lockNotification.less b/client/homebrew/pages/editPage/lockNotification/lockNotification.less index 02bee738e..54f1a9569 100644 --- a/client/homebrew/pages/editPage/lockNotification/lockNotification.less +++ b/client/homebrew/pages/editPage/lockNotification/lockNotification.less @@ -1,35 +1,27 @@ .lockNotification { - background-color: #ccc; - color: black; - padding: 10px; - margin: 5% 10%; - width: 80%; - text-align: center; - line-height: 1.5em; - z-index: 1; + z-index : 1; + width : 80%; + padding : 10px; + margin : 5% 10%; + line-height : 1.5em; + color : black; + text-align : center; + background-color : #CCCCCC; - &::backdrop { - background-color: #000a; - } + &::backdrop { background-color : #000000AA; } button { - background-color: #333; - color: white; - margin: 10px; + margin : 10px; + color : white; + background-color : #333333; - &:hover { - background-color: #777; - } + &:hover { background-color : #777777; } } h1, h3 { - font-family: 'Open Sans', sans-serif; - font-weight: 800; - } - h1 { - font-size: 24px; - } - h3 { - font-size: 18px; + font-family : 'Open Sans', sans-serif; + font-weight : 800; } + h1 { font-size : 24px; } + h3 { font-size : 18px; } } From 66fdf808a64fdbd9da6d31daaa3d12dc5cf72ef5 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 7 Jun 2024 11:29:02 -0400 Subject: [PATCH 137/239] Lint renderWarnings.less --- .../renderWarnings/renderWarnings.less | 48 ++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/shared/homebrewery/renderWarnings/renderWarnings.less b/shared/homebrewery/renderWarnings/renderWarnings.less index 8524b5451..70799092a 100644 --- a/shared/homebrewery/renderWarnings/renderWarnings.less +++ b/shared/homebrewery/renderWarnings/renderWarnings.less @@ -1,54 +1,48 @@ -.renderWarnings{ - position : relative; - float : right; +.renderWarnings { + position : relative; + float : right; width : 350px; padding : 20px; padding-bottom : 10px; padding-left : 85px; margin-bottom : 10px; - background-color : @yellow; color : white; + background-color : @yellow; border : none; - a{ - font-weight : 800; - } - i.ohno{ + a { font-weight : 800; } + i.ohno { position : absolute; top : 24px; left : 24px; - opacity : 0.8; font-size : 2.5em; + opacity : 0.8; } - button.dismiss{ - position : absolute; - top : 10px; - right : 10px; - cursor : pointer; - opacity : 0.6; - background-color: transparent; - &:hover{ - opacity : 1; - } + button.dismiss { + position : absolute; + top : 10px; + right : 10px; + cursor : pointer; + background-color : transparent; + opacity : 0.6; + &:hover { opacity : 1; } } - small{ - opacity : 0.7; + small { font-size : 0.6em; + opacity : 0.7; } - h3{ + h3 { font-size : 1.1em; font-weight : 800; } - ul{ + ul { margin-top : 15px; font-size : 0.8em; list-style-position : outside; list-style-type : disc; - li{ + li { font-size : 0.8em; line-height : 1.6em; - em{ - font-weight : 800; - } + em { font-weight : 800; } } } } \ No newline at end of file From 227ab192c4e92e23e027de4fddb6a96f9c9a9574 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:45:42 +0000 Subject: [PATCH 138/239] Bump eslint-plugin-react from 7.34.1 to 7.34.2 Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.34.1 to 7.34.2. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.34.1...v7.34.2) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 417 +++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 264 insertions(+), 155 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff2d6d312..7122750e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "devDependencies": { "eslint": "^8.57.0", "eslint-plugin-jest": "^28.5.0", - "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react": "^7.34.2", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", "postcss-less": "^6.0.0", @@ -3416,15 +3416,16 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -3452,15 +3453,16 @@ } }, "node_modules/array.prototype.findlast": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", - "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", + "es-abstract": "^1.23.2", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -3611,15 +3613,6 @@ } ] }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -5088,6 +5081,57 @@ "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -5543,17 +5587,21 @@ } }, "node_modules/es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", @@ -5564,10 +5612,11 @@ "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.1", + "hasown": "^2.0.2", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.3", @@ -5578,17 +5627,17 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", + "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -5617,26 +5666,37 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", - "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, "dependencies": { - "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.4", + "es-abstract": "^1.23.3", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", + "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -5784,29 +5844,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "version": "7.34.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz", + "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", + "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.hasown": "^1.1.4", + "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.matchall": "^4.0.11" }, "engines": { "node": ">=4" @@ -7119,9 +7179,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -7629,6 +7689,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -7737,10 +7812,13 @@ } }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7826,10 +7904,13 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7906,10 +7987,13 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7927,13 +8011,16 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11154,28 +11241,29 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -11185,13 +11273,17 @@ } }, "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", "dev": true, "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11209,14 +11301,14 @@ } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -12158,16 +12250,16 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", - "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0", - "get-intrinsic": "^1.2.3", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -12460,13 +12552,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -12725,13 +12817,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13300,34 +13396,41 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -13337,28 +13440,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14121,9 +14227,9 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { "call-bind": "^1.0.7", @@ -14969,31 +15075,34 @@ "dev": true }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" diff --git a/package.json b/package.json index 012b83159..83495038c 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "devDependencies": { "eslint": "^8.57.0", "eslint-plugin-jest": "^28.5.0", - "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react": "^7.34.2", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", "postcss-less": "^6.0.0", From 7c7c6341f9837abefc67f5c9e48cb9376a1c3af7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:45:45 +0000 Subject: [PATCH 139/239] Bump dompurify from 3.1.4 to 3.1.5 Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.1.4 to 3.1.5. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.1.4...3.1.5) --- updated-dependencies: - dependency-name: dompurify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff2d6d312..5857e8d1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "cookie-parser": "^1.4.6", "create-react-class": "^15.7.0", "dedent-tabs": "^0.10.3", - "dompurify": "^3.1.4", + "dompurify": "^3.1.5", "expr-eval": "^2.0.2", "express": "^4.19.2", "express-async-handler": "^1.2.0", @@ -5420,9 +5420,9 @@ } }, "node_modules/dompurify": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.4.tgz", - "integrity": "sha512-2gnshi6OshmuKil8rMZuQCGiUF3cUxHY3NGDzUAdUx/NPEe5DVnO8BDoAQouvgwnx0R/+a6jUn36Z0FSdq8vww==" + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.5.tgz", + "integrity": "sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==" }, "node_modules/duplexer2": { "version": "0.1.4", diff --git a/package.json b/package.json index 012b83159..acd14d9c0 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "cookie-parser": "^1.4.6", "create-react-class": "^15.7.0", "dedent-tabs": "^0.10.3", - "dompurify": "^3.1.4", + "dompurify": "^3.1.5", "expr-eval": "^2.0.2", "express": "^4.19.2", "express-async-handler": "^1.2.0", From f745fdefb367ed73c197960b89118f11d9ec4b0f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:59:39 +0000 Subject: [PATCH 140/239] Bump @babel/plugin-transform-runtime from 7.24.3 to 7.24.7 Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.24.3 to 7.24.7. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.7/packages/babel-plugin-transform-runtime) --- updated-dependencies: - dependency-name: "@babel/plugin-transform-runtime" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 592e0f03d..dfa9545db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "license": "MIT", "dependencies": { "@babel/core": "^7.24.5", - "@babel/plugin-transform-runtime": "^7.24.3", + "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.5", "@babel/preset-react": "^7.24.7", "@googleapis/drive": "^8.8.0", @@ -1477,12 +1477,12 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", + "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", "dependencies": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.1", "babel-plugin-polyfill-regenerator": "^0.6.1", diff --git a/package.json b/package.json index 46b9d3f51..d69ff89ad 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ }, "dependencies": { "@babel/core": "^7.24.5", - "@babel/plugin-transform-runtime": "^7.24.3", + "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.5", "@babel/preset-react": "^7.24.7", "@googleapis/drive": "^8.8.0", From 37bc37bd94af8812308ec2ad608a203b72fd0fb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:05:03 +0000 Subject: [PATCH 141/239] Bump @babel/core from 7.24.5 to 7.24.7 Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.24.5 to 7.24.7. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.7/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 78 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index dfa9545db..3f9465ab2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.24.5", + "@babel/core": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.5", "@babel/preset-react": "^7.24.7", @@ -101,28 +101,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -192,12 +192,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -317,15 +317,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -386,11 +386,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -456,13 +457,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" diff --git a/package.json b/package.json index d69ff89ad..b595fbec4 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ ] }, "dependencies": { - "@babel/core": "^7.24.5", + "@babel/core": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.5", "@babel/preset-react": "^7.24.7", From e2a946674f44d66aac8b4b5b5c967136a9d46374 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:27:54 +0000 Subject: [PATCH 142/239] Bump @babel/preset-env from 7.24.5 to 7.24.7 Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.24.5 to 7.24.7. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.7/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 746 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 376 insertions(+), 372 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f9465ab2..b200dc32e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@babel/core": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-env": "^7.24.5", + "@babel/preset-env": "^7.24.7", "@babel/preset-react": "^7.24.7", "@googleapis/drive": "^8.8.0", "body-parser": "^1.20.2", @@ -181,11 +181,12 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -207,18 +208,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", - "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.24.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "semver": "^6.3.1" }, "engines": { @@ -229,11 +230,11 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -294,11 +295,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", - "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -335,11 +337,11 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -354,13 +356,13 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -370,13 +372,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -398,11 +400,12 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -444,13 +447,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -494,12 +498,12 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", - "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -509,11 +513,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -523,13 +527,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -539,12 +543,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -635,11 +639,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -649,11 +653,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -823,11 +827,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -837,13 +841,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -854,13 +858,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -870,11 +874,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -884,11 +888,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", - "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -898,12 +902,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -913,12 +917,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -929,17 +933,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", - "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", + "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "globals": "^11.1.0" }, "engines": { @@ -950,12 +954,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -965,11 +969,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", - "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", + "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -979,12 +983,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -994,11 +998,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1008,11 +1012,11 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1023,12 +1027,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1038,11 +1042,11 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1053,12 +1057,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1068,13 +1072,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1084,11 +1088,11 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1099,11 +1103,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1113,11 +1117,11 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1128,11 +1132,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1142,12 +1146,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1157,13 +1161,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1173,14 +1177,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1190,12 +1194,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1205,12 +1209,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1220,11 +1224,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1234,11 +1238,11 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1249,11 +1253,11 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1264,14 +1268,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", - "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.5" + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1281,12 +1285,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1296,11 +1300,11 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1311,12 +1315,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", - "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1327,11 +1331,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", - "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1341,12 +1345,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1356,13 +1360,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", - "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1373,11 +1377,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1448,11 +1452,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1463,11 +1467,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1496,11 +1500,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1510,12 +1514,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1525,11 +1529,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1539,11 +1543,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1553,11 +1557,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", - "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1567,11 +1571,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1581,12 +1585,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1596,12 +1600,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1611,12 +1615,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1626,26 +1630,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", - "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", + "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "@babel/compat-data": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1657,54 +1661,54 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.5", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.5", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.5", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.24.5", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.5", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -1757,9 +1761,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, diff --git a/package.json b/package.json index b595fbec4..2fbc8057a 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "dependencies": { "@babel/core": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-env": "^7.24.5", + "@babel/preset-env": "^7.24.7", "@babel/preset-react": "^7.24.7", "@googleapis/drive": "^8.8.0", "body-parser": "^1.20.2", From 4c14774f1a3213257c9ff6af4cdb75ba3ab01487 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:44:07 +0000 Subject: [PATCH 143/239] Bump @googleapis/drive from 8.8.0 to 8.10.0 Bumps [@googleapis/drive](https://github.com/googleapis/google-api-nodejs-client) from 8.8.0 to 8.10.0. - [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases) - [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/release-please-config.json) - [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/drive-v8.8.0...drive-v8.10.0) --- updated-dependencies: - dependency-name: "@googleapis/drive" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b200dc32e..9bcfc1e2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.7", "@babel/preset-react": "^7.24.7", - "@googleapis/drive": "^8.8.0", + "@googleapis/drive": "^8.10.0", "body-parser": "^1.20.2", "classnames": "^2.5.1", "codemirror": "^5.65.6", @@ -1993,9 +1993,9 @@ } }, "node_modules/@googleapis/drive": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-8.8.0.tgz", - "integrity": "sha512-EOZ9GZCOUdej9PJVnkai7qu5RPyFLYse8FlpgijzfnZPOACXWFf4XOFuAuMcMw4Zue8xPhAPHu1qYcy8u362Xw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-8.10.0.tgz", + "integrity": "sha512-loumtaDmAn2JvU4KuFMhhtaYG1Hxw0RVS4vl+rOWMU7NAU151XYfIWFDJfFFZjvYZxH4tbsmHEnF+DKH1hQ75Q==", "dependencies": { "googleapis-common": "^7.0.0" }, diff --git a/package.json b/package.json index 2fbc8057a..9fd057972 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.7", "@babel/preset-react": "^7.24.7", - "@googleapis/drive": "^8.8.0", + "@googleapis/drive": "^8.10.0", "body-parser": "^1.20.2", "classnames": "^2.5.1", "codemirror": "^5.65.6", From 559de2527b5f24397427704d8ed8bff4d16ea0a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:44:09 +0000 Subject: [PATCH 144/239] Bump eslint-plugin-jest from 28.5.0 to 28.6.0 Bumps [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) from 28.5.0 to 28.6.0. - [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases) - [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/jest-community/eslint-plugin-jest/compare/v28.5.0...v28.6.0) --- updated-dependencies: - dependency-name: eslint-plugin-jest dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b200dc32e..6d4db8487 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ }, "devDependencies": { "eslint": "^8.57.0", - "eslint-plugin-jest": "^28.5.0", + "eslint-plugin-jest": "^28.6.0", "eslint-plugin-react": "^7.34.2", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", @@ -5823,9 +5823,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "28.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.5.0.tgz", - "integrity": "sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==", + "version": "28.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz", + "integrity": "sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^6.0.0 || ^7.0.0" diff --git a/package.json b/package.json index 2fbc8057a..1249b59dc 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,7 @@ }, "devDependencies": { "eslint": "^8.57.0", - "eslint-plugin-jest": "^28.5.0", + "eslint-plugin-jest": "^28.6.0", "eslint-plugin-react": "^7.34.2", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", From 7a349ae26dd8faa831bc580dda2967eebda43d4c Mon Sep 17 00:00:00 2001 From: David Bolack Date: Thu, 13 Jun 2024 18:13:32 -0500 Subject: [PATCH 145/239] Remove weirdly redundant error box. --- client/homebrew/brewRenderer/brewRenderer.jsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index c26bd5e18..7eae3228f 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -244,11 +244,6 @@ const BrewRenderer = (props)=>{ tabIndex={-1} style={{ height: state.height }}> - -
    - - -
    {baseThemePath && From 8a10fac81ecb6d9f069065ca9ab3799bfbeafbc4 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 19 Jun 2024 19:16:19 -0500 Subject: [PATCH 146/239] Update Style based on suggestions. --- themes/V3/5ePHB/style.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index ff896f9d2..e580c31a9 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -874,7 +874,7 @@ .page h1 + * { margin-top : 0; } -.page .descriptive.wide { +.page .descriptive.wide + * { margin-top: 0; } From 9886200fa901ef1f0f3dccee68138acf8c1dc29f Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 28 Jun 2024 09:39:49 -0400 Subject: [PATCH 147/239] Fix partCover H1 inclusion rule --- themes/V3/5ePHB/style.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 8b805b760..f8a14f46e 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -814,7 +814,7 @@ h6, .page:has(.partCover) { --TOC: exclude; - &h1 { + & h1 { --TOC: include; } } From 179e21755cb2f6ec274efeb1e2fc5ed0c9cc51da Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 28 Jun 2024 22:01:55 -0400 Subject: [PATCH 148/239] Unify some emoji CSS across fonts --- shared/naturalcrit/codeEditor/codeEditor.less | 1 + themes/V3/Blank/style.less | 1 + themes/fonts/iconFonts/diceFont.less | 7 +++++-- themes/fonts/iconFonts/elderberryInn.less | 9 +++++---- themes/fonts/iconFonts/fontAwesome.less | 2 ++ themes/fonts/iconFonts/gameIcons.less | 6 +----- 6 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 themes/fonts/iconFonts/fontAwesome.less diff --git a/shared/naturalcrit/codeEditor/codeEditor.less b/shared/naturalcrit/codeEditor/codeEditor.less index 0f29eff7b..cb73b0a88 100644 --- a/shared/naturalcrit/codeEditor/codeEditor.less +++ b/shared/naturalcrit/codeEditor/codeEditor.less @@ -8,6 +8,7 @@ @import (less) './themes/fonts/iconFonts/diceFont.less'; @import (less) './themes/fonts/iconFonts/elderberryInn.less'; @import (less) './themes/fonts/iconFonts/gameIcons.less'; +@import (less) './themes/fonts/iconFonts/fontAwesome.less'; @keyframes sourceMoveAnimation { 50% {background-color: red; color: white;} diff --git a/themes/V3/Blank/style.less b/themes/V3/Blank/style.less index 24e87504f..0f779c38b 100644 --- a/themes/V3/Blank/style.less +++ b/themes/V3/Blank/style.less @@ -3,6 +3,7 @@ @import (less) './themes/fonts/iconFonts/elderberryInn.less'; @import (less) './themes/fonts/iconFonts/diceFont.less'; @import (less) './themes/fonts/iconFonts/gameIcons.less'; +@import (less) './themes/fonts/iconFonts/fontAwesome.less'; :root { //Colors diff --git a/themes/fonts/iconFonts/diceFont.less b/themes/fonts/iconFonts/diceFont.less index 6fe226a05..ec80f132b 100644 --- a/themes/fonts/iconFonts/diceFont.less +++ b/themes/fonts/iconFonts/diceFont.less @@ -7,7 +7,7 @@ } .df { - display : inline-block; + display : inline; font-family : 'DiceFont'; font-style : normal; font-weight : normal; @@ -16,8 +16,11 @@ text-decoration : inherit; text-transform : none; text-rendering : optimizeLegibility; - -moz-osx-font-smoothing : grayscale; + + /* Better Font Rendering =========== */ -webkit-font-smoothing : antialiased; + -moz-osx-font-smoothing : grayscale; + &.F::before { content : '\f190'; } &.F-minus::before { content : '\f191'; } &.F-plus::before { content : '\f192'; } diff --git a/themes/fonts/iconFonts/elderberryInn.less b/themes/fonts/iconFonts/elderberryInn.less index c956563fc..958d1b265 100644 --- a/themes/fonts/iconFonts/elderberryInn.less +++ b/themes/fonts/iconFonts/elderberryInn.less @@ -7,15 +7,16 @@ } .ei { - display : inline-block; - margin-right : 3px; + display : inline; font-family : 'Elderberry-Inn'; line-height : 1; vertical-align : baseline; - -moz-osx-font-smoothing : grayscale; - -webkit-font-smoothing : antialiased; text-rendering : auto; + /* Better Font Rendering =========== */ + -webkit-font-smoothing : antialiased; + -moz-osx-font-smoothing : grayscale; + &.book::before { content : '\E900'; } &.screen::before { content : '\E901'; } diff --git a/themes/fonts/iconFonts/fontAwesome.less b/themes/fonts/iconFonts/fontAwesome.less new file mode 100644 index 000000000..5f626c645 --- /dev/null +++ b/themes/fonts/iconFonts/fontAwesome.less @@ -0,0 +1,2 @@ +/* Icon Font: Font Awesome */ +.far,.fas,.fab { display : inline; } \ No newline at end of file diff --git a/themes/fonts/iconFonts/gameIcons.less b/themes/fonts/iconFonts/gameIcons.less index ea7b3aba5..a32ebdd08 100644 --- a/themes/fonts/iconFonts/gameIcons.less +++ b/themes/fonts/iconFonts/gameIcons.less @@ -8,19 +8,15 @@ .gi { /* use !important to prevent issues with browser extensions that change fonts */ - display : inline-block; - margin-right : 3px; + display : inline; font-family : 'Game-Icons' !important; line-height : 1; vertical-align : baseline; - -moz-osx-font-smoothing : grayscale; - -webkit-font-smoothing : antialiased; text-rendering : auto; /* Better Font Rendering =========== */ -webkit-font-smoothing : antialiased; -moz-osx-font-smoothing : grayscale; - &.zigzag-leaf::before { content : '\e900'; } &.zebra-shield::before { content : '\e901'; } From a87e42043734be81e4fc9656d465ea407c577c92 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 28 Jun 2024 22:46:56 -0400 Subject: [PATCH 149/239] Up version to 3.13.0 --- changelog.md | 39 +++++++++++++++++++++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/changelog.md b/changelog.md index 18c3205f7..0a9e509f2 100644 --- a/changelog.md +++ b/changelog.md @@ -84,6 +84,45 @@ pre { ## changelog For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery). +### Friday 28/6/2024 - v3.13.0 +{{taskList + +##### calculuschild + +* [x] Add `:emoji:` Markdown syntax, with autosuggest; start typing after the first `:` for matching emojis from +:fab_font_awesome: FontAwesome, :df_d20: DiceFont, :ei_action: ElderberryInn, and a subset of :gi_broadsword: GameIcons + +* [x] Fix `{curly injection}` to append to, rather than erase and replace target CSS +* [x] {{openSans **GET PDF**}} {{fa,fa-file-pdf}} now opens the print dialog directly, rather than redirecting to a separate page + +##### Gazook + +* [x] Several small style tweaks to the UI +* [x] Cleaning and refactoring several large pieces of code + +##### 5e-Cleric + +* [x] For error pages, add links to user account and `/share` page if available + +Fixes issue [#3298](https://github.com/naturalcrit/homebrewery/issues/3298) + +* [x] Change FrontCover title to use stroke outline instead of faking it with dozens of shadows +* [x] Cleaning and refactoring several large pieces of CSS + +##### abquintic + +* [x] Added additional {{openSans **TABLE OF CONTENTS**}} snippet options. Explicitly include or exclude items from the ToC generation via CSS properties +`--TOC:exclude` or `--TOC:include`, or change the included header depth from 3 to 6 (default 3) with `tocDepthH6` + +##### MurdoMaclachlan *(new contributor!)* + +* [x] Added "proficiency bonus" to Monster Stat Block snippet. + +Fixes issue [#3397](https://github.com/naturalcrit/homebrewery/issues/3397) +}} + +\column + ### Monday 18/3/2024 - v3.12.0 {{taskList diff --git a/package-lock.json b/package-lock.json index d9c862149..c7cdd1017 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "homebrewery", - "version": "3.12.0", + "version": "3.13.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "homebrewery", - "version": "3.12.0", + "version": "3.13.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index b5b7824b3..83e180280 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "homebrewery", "description": "Create authentic looking D&D homebrews using only markdown", - "version": "3.12.0", + "version": "3.13.0", "engines": { "npm": "^10.2.x", "node": "^20.8.x" From 2cdd65b083aa67428b0cfa5b6c6d2bd98eafe9c6 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 29 Jun 2024 11:29:31 -0400 Subject: [PATCH 150/239] revert DOMPURIFY for now --- client/homebrew/brewRenderer/brewRenderer.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 8168f9933..3c36244c1 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -37,7 +37,7 @@ const BrewPage = (props)=>{ index : 0, ...props }; - const cleanText = DOMPurify.sanitize(props.contents, purifyConfig); + const cleanText = props.contents; //DOMPurify.sanitize(props.contents, purifyConfig); return
    ; @@ -126,7 +126,7 @@ const BrewRenderer = (props)=>{ const renderStyle = ()=>{ if(!props.style) return; - const cleanStyle = DOMPurify.sanitize(props.style, purifyConfig); + const cleanStyle = props.style; //DOMPurify.sanitize(props.style, purifyConfig); //return
    @layer styleTab {\n${sanitizeScriptTags(props.style)}\n} ` }} />; return
    ${cleanStyle} ` }} />; }; From 8ee70b092863e072eaddc1998e52fb21aa8fa987 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Mon, 1 Jul 2024 12:21:29 -0400 Subject: [PATCH 151/239] Only split curly attributes on on first =, allow ?, = in attributes --- shared/naturalcrit/markdown.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 95431487d..529129833 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -102,7 +102,7 @@ const mustacheSpans = { start(src) { return src.match(/{{[^{]/)?.index; }, // Hint to Marked.js to stop and check for a match tokenizer(src, tokens) { const completeSpan = /^{{[^\n]*}}/; // Regex for the complete token - const inlineRegex = /{{(?=((?:[:=](?:"['\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"=':{}\s]*)*))\1 *|}}/g; + const inlineRegex = /{{(?=((?:[:=](?:"['\w,\-()#%=?. ]*"|[\w\-()#%.]*)|[^"=':{}\s]*)*))\1 *|}}/g; const match = completeSpan.exec(src); if(match) { //Find closing delimiter @@ -159,7 +159,7 @@ const mustacheDivs = { start(src) { return src.match(/\n *{{[^{]/m)?.index; }, // Hint to Marked.js to stop and check for a match tokenizer(src, tokens) { const completeBlock = /^ *{{[^\n}]* *\n.*\n *}}/s; // Regex for the complete token - const blockRegex = /^ *{{(?=((?:[:=](?:"['\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"=':{}\s]*)*))\1 *$|^ *}}$/gm; + const blockRegex = /^ *{{(?=((?:[:=](?:"['\w,\-()#%=?. ]*"|[\w\-()#%.]*)|[^"=':{}\s]*)*))\1 *$|^ *}}$/gm; const match = completeBlock.exec(src); if(match) { //Find closing delimiter @@ -214,7 +214,7 @@ const mustacheInjectInline = { level : 'inline', start(src) { return src.match(/ *{[^{\n]/)?.index; }, // Hint to Marked.js to stop and check for a match tokenizer(src, tokens) { - const inlineRegex = /^ *{(?=((?:[:=](?:"['\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"=':{}\s]*)*))\1}/g; + const inlineRegex = /^ *{(?=((?:[:=](?:"['\w,\-()#%=?. ]*"|[\w\-()#%.]*)|[^"=':{}\s]*)*))\1}/g; const match = inlineRegex.exec(src); if(match) { const lastToken = tokens[tokens.length - 1]; @@ -265,7 +265,7 @@ const mustacheInjectBlock = { level : 'block', start(src) { return src.match(/\n *{[^{\n]/m)?.index; }, // Hint to Marked.js to stop and check for a match tokenizer(src, tokens) { - const inlineRegex = /^ *{(?=((?:[:=](?:"['\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"=':{}\s]*)*))\1}/ym; + const inlineRegex = /^ *{(?=((?:[:=](?:"['\w,\-()#%=?. ]*"|[\w\-()#%.]*)|[^"=':{}\s]*)*))\1}/ym; const match = inlineRegex.exec(src); if(match) { const lastToken = tokens[tokens.length - 1]; @@ -771,7 +771,8 @@ const processStyleTags = (string)=>{ const attributes = _.remove(tags, (tag)=>(tag.includes('='))).map((tag)=>tag.replace(/="?([^"]*)"?/g, '="$1"')) ?.filter((attr)=>!attr.startsWith('class="') && !attr.startsWith('style="') && !attr.startsWith('id="')) .reduce((obj, attr)=>{ - let [key, value] = attr.split('='); + const index = attr.indexOf('='); + let [key, value] = [attr.substring(0, index), attr.substring(index + 1)]; value = value.replace(/"/g, ''); obj[key] = value; return obj; @@ -793,7 +794,8 @@ const extractHTMLStyleTags = (htmlString)=>{ const attributes = htmlString.match(/[a-zA-Z]+="[^"]*"/g) ?.filter((attr)=>!attr.startsWith('class="') && !attr.startsWith('style="') && !attr.startsWith('id="')) .reduce((obj, attr)=>{ - let [key, value] = attr.split('='); + const index = attr.indexOf('='); + let [key, value] = [attr.substring(0, index), attr.substring(index + 1)]; value = value.replace(/"/g, ''); obj[key] = value; return obj; From 2d570924d1489f35f7fad0253ee4eeb901bd07cf Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Mon, 1 Jul 2024 12:21:36 -0400 Subject: [PATCH 152/239] Add tests --- tests/markdown/mustache-syntax.test.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/markdown/mustache-syntax.test.js b/tests/markdown/mustache-syntax.test.js index b32876353..7b0115cae 100644 --- a/tests/markdown/mustache-syntax.test.js +++ b/tests/markdown/mustache-syntax.test.js @@ -338,6 +338,18 @@ describe('Injection: When an injection tag follows an element', ()=>{ const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    homebrew mug

    `); }); + + it('Renders an image with "=" in the url, and added attributes', function() { + const source = `![homebrew mug](https://i.imgur.com/hMna6G0.png?auth=12345&height=1024) {position:absolute,bottom:20px,left:130px,width:220px,a="b and c",d=e}`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    homebrew mug

    `); + }); + + it('Renders an image and added attributes with "=" in the value, ', function() { + const source = `![homebrew mug](https://i.imgur.com/hMna6G0.png) {position:absolute,bottom:20px,left:130px,width:220px,a="b and c",d=e,otherUrl="url?auth=12345"}`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    homebrew mug

    `); + }); }); describe('and that element is a block', ()=>{ From 7c60fbe6551e0bdac9832736588ae2dac40ff08a Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Tue, 2 Jul 2024 20:46:01 +1200 Subject: [PATCH 153/239] Remove page + 1 from ToC generator snippet --- themes/V3/5ePHB/snippets/tableOfContents.gen.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 1ec778944..b212dea36 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -8,14 +8,14 @@ const getTOC = (pages)=>{ if(curDepth == targetDepth) { child.push({ title : title, - page : page + 1, + page : page, children : [] }); } else { if(child.length == 0) { child.push({ title : null, - page : page + 1, + page : page, children : [] }); } From d12f644f5bf83f306b5c76ac1cb2a896d77a6c8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 03:15:49 +0000 Subject: [PATCH 154/239] Bump react-router-dom from 6.23.1 to 6.24.1 Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.23.1 to 6.24.1. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.24.1/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 26 +++++++++++++------------- package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index c7cdd1017..057871ef4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-frame-component": "^4.1.3", - "react-router-dom": "6.23.1", + "react-router-dom": "6.24.1", "sanitize-filename": "1.6.3", "superagent": "^9.0.2", "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" @@ -2864,9 +2864,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", - "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.1.tgz", + "integrity": "sha512-mCOMec4BKd6BRGBZeSnGiIgwsbLGp3yhVqAD8H+PxiRNEHgDpZb8J1TnrSDlg97t0ySKMQJTHCWBCmBpSmkF6Q==", "engines": { "node": ">=14.0.0" } @@ -12090,11 +12090,11 @@ "dev": true }, "node_modules/react-router": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", - "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.1.tgz", + "integrity": "sha512-PTXFXGK2pyXpHzVo3rR9H7ip4lSPZZc0bHG5CARmj65fTT6qG7sTngmb6lcYu1gf3y/8KxORoy9yn59pGpCnpg==", "dependencies": { - "@remix-run/router": "1.16.1" + "@remix-run/router": "1.17.1" }, "engines": { "node": ">=14.0.0" @@ -12104,12 +12104,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", - "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.1.tgz", + "integrity": "sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==", "dependencies": { - "@remix-run/router": "1.16.1", - "react-router": "6.23.1" + "@remix-run/router": "1.17.1", + "react-router": "6.24.1" }, "engines": { "node": ">=14.0.0" diff --git a/package.json b/package.json index 83e180280..9bacb6c64 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-frame-component": "^4.1.3", - "react-router-dom": "6.23.1", + "react-router-dom": "6.24.1", "sanitize-filename": "1.6.3", "superagent": "^9.0.2", "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" From 086c4f74f6b153a226d87b8b091e3332b742645d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 03:21:26 +0000 Subject: [PATCH 155/239] Bump marked-emoji from 1.4.0 to 1.4.1 Bumps [marked-emoji](https://github.com/UziTech/marked-emoji) from 1.4.0 to 1.4.1. - [Release notes](https://github.com/UziTech/marked-emoji/releases) - [Changelog](https://github.com/UziTech/marked-emoji/blob/main/release.config.cjs) - [Commits](https://github.com/UziTech/marked-emoji/compare/v1.4.0...v1.4.1) --- updated-dependencies: - dependency-name: marked-emoji dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 057871ef4..2e1f18c53 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "less": "^3.13.1", "lodash": "^4.17.21", "marked": "11.2.0", - "marked-emoji": "^1.4.0", + "marked-emoji": "^1.4.1", "marked-extended-tables": "^1.0.8", "marked-gfm-heading-id": "^3.1.3", "marked-smartypants-lite": "^1.0.2", @@ -10247,11 +10247,11 @@ } }, "node_modules/marked-emoji": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/marked-emoji/-/marked-emoji-1.4.0.tgz", - "integrity": "sha512-/2TJfGzXpiBBq+X3akHHbTrAjZPJDwR+7FV6SyQLECnQEfaoVkrpKZJzHhPTAq3Sl/A1l2frMT0u6b38VBBlNg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/marked-emoji/-/marked-emoji-1.4.1.tgz", + "integrity": "sha512-3xHWQn8XD1LyhMpHxWpHTDWBZ9bpXLlW8JIqvyXTO6he7okKIB/W9fD/3fTg0DQuZlSQvPZ6Ub5hN6Rnmn7j9g==", "peerDependencies": { - "marked": ">=4 <13" + "marked": ">=4 <14" } }, "node_modules/marked-extended-tables": { diff --git a/package.json b/package.json index 9bacb6c64..3ce1297a6 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "less": "^3.13.1", "lodash": "^4.17.21", "marked": "11.2.0", - "marked-emoji": "^1.4.0", + "marked-emoji": "^1.4.1", "marked-extended-tables": "^1.0.8", "marked-gfm-heading-id": "^3.1.3", "marked-smartypants-lite": "^1.0.2", From e8e7237a8ecb6907d0dfcc804b8b31cdef856384 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 03:21:44 +0000 Subject: [PATCH 156/239] Bump marked-gfm-heading-id from 3.1.3 to 3.2.0 Bumps [marked-gfm-heading-id](https://github.com/markedjs/marked-gfm-heading-id) from 3.1.3 to 3.2.0. - [Release notes](https://github.com/markedjs/marked-gfm-heading-id/releases) - [Changelog](https://github.com/markedjs/marked-gfm-heading-id/blob/main/release.config.cjs) - [Commits](https://github.com/markedjs/marked-gfm-heading-id/compare/v3.1.3...v3.2.0) --- updated-dependencies: - dependency-name: marked-gfm-heading-id dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 057871ef4..654e88dae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "marked": "11.2.0", "marked-emoji": "^1.4.0", "marked-extended-tables": "^1.0.8", - "marked-gfm-heading-id": "^3.1.3", + "marked-gfm-heading-id": "^3.2.0", "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", @@ -10263,9 +10263,9 @@ } }, "node_modules/marked-gfm-heading-id": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/marked-gfm-heading-id/-/marked-gfm-heading-id-3.1.3.tgz", - "integrity": "sha512-A0cRU4PCueX/5m8VE4mT8uTQ36l3xMYRojz3Eqnk4BmUFZ0T+9Xhn2KvHcANP4qbhfOeuMrWJCTQbASIBR5xeg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/marked-gfm-heading-id/-/marked-gfm-heading-id-3.2.0.tgz", + "integrity": "sha512-Xfxpr5lXLDLY10XqzSCA9l2dDaiabQUgtYM9hw8yunyVsB/xYBRpiic6BOiY/EAJw1ik1eWr1ET1HKOAPZBhXg==", "dependencies": { "github-slugger": "^2.0.0" }, diff --git a/package.json b/package.json index 9bacb6c64..419f54aa4 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "marked": "11.2.0", "marked-emoji": "^1.4.0", "marked-extended-tables": "^1.0.8", - "marked-gfm-heading-id": "^3.1.3", + "marked-gfm-heading-id": "^3.2.0", "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", From 80e039b194b72b5e7bb97791c613e9f1b0232474 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 18:41:01 +0000 Subject: [PATCH 157/239] Bump mongoose from 8.4.1 to 8.4.5 Bumps [mongoose](https://github.com/Automattic/mongoose) from 8.4.1 to 8.4.5. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/8.4.1...8.4.5) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ca19b6367..bc4ce6b7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", - "mongoose": "^8.4.1", + "mongoose": "^8.4.5", "nanoid": "3.3.4", "nconf": "^0.12.1", "react": "^18.3.1", @@ -10656,9 +10656,9 @@ } }, "node_modules/mongoose": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.1.tgz", - "integrity": "sha512-odQ2WEWGL3hb0Qex+QMN4eH6D34WdMEw7F1If2MGABApSDmG9cMmqv/G1H6WsXmuaH9mkuuadW/WbLE5+tHJwA==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.5.tgz", + "integrity": "sha512-E5KjBThxST2uFSKKXuiMa9H9Zx4DLTSLuxodAnIzJRixNwc1ARTlJUK1m0a80EB+ZKGP4QNTasyUYRG9DUSHOA==", "dependencies": { "bson": "^6.7.0", "kareem": "2.6.3", diff --git a/package.json b/package.json index 1177687ca..3cd326541 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", - "mongoose": "^8.4.1", + "mongoose": "^8.4.5", "nanoid": "3.3.4", "nconf": "^0.12.1", "react": "^18.3.1", From e07a04ebfa63113eb9bd48dc36d4ac4e61e19ce3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 18:53:33 +0000 Subject: [PATCH 158/239] Bump ws from 7.5.9 to 7.5.10 Bumps [ws](https://github.com/websockets/ws) from 7.5.9 to 7.5.10. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc4ce6b7d..4f7ab47a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15180,9 +15180,9 @@ } }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "engines": { "node": ">=8.3.0" }, From 450baee66a264674d314116ae15118da98be86c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 18:55:32 +0000 Subject: [PATCH 159/239] Bump eslint-plugin-react from 7.34.2 to 7.34.3 Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.34.2 to 7.34.3. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.34.2...v7.34.3) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 25 ++++++++++++++----------- package.json | 2 +- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f7ab47a7..8e183184b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "devDependencies": { "eslint": "^8.57.0", "eslint-plugin-jest": "^28.6.0", - "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react": "^7.34.3", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", "postcss-less": "^6.0.0", @@ -3507,16 +3507,19 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { @@ -5848,16 +5851,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz", - "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==", + "version": "7.34.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", + "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", "dev": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", diff --git a/package.json b/package.json index 3cd326541..8f2c1da06 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "devDependencies": { "eslint": "^8.57.0", "eslint-plugin-jest": "^28.6.0", - "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react": "^7.34.3", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", "postcss-less": "^6.0.0", From 1564bc744840988712d762ae1fa579ada59a500e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 18:59:10 +0000 Subject: [PATCH 160/239] Bump @googleapis/drive from 8.10.0 to 8.11.0 Bumps [@googleapis/drive](https://github.com/googleapis/google-api-nodejs-client) from 8.10.0 to 8.11.0. - [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases) - [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/release-please-config.json) - [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/drive-v8.10.0...drive-v8.11.0) --- updated-dependencies: - dependency-name: "@googleapis/drive" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8e183184b..e3a3f355d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.7", "@babel/preset-react": "^7.24.7", - "@googleapis/drive": "^8.10.0", + "@googleapis/drive": "^8.11.0", "body-parser": "^1.20.2", "classnames": "^2.5.1", "codemirror": "^5.65.6", @@ -1993,9 +1993,9 @@ } }, "node_modules/@googleapis/drive": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-8.10.0.tgz", - "integrity": "sha512-loumtaDmAn2JvU4KuFMhhtaYG1Hxw0RVS4vl+rOWMU7NAU151XYfIWFDJfFFZjvYZxH4tbsmHEnF+DKH1hQ75Q==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-8.11.0.tgz", + "integrity": "sha512-HW6/2oThc4X086mGkZxpdP4P+aHpYbjHa6wr9l1F/R+snpk6G8/EuRXEcTkgQUl2t/NdNz3lj8re0AQBG5faSA==", "dependencies": { "googleapis-common": "^7.0.0" }, diff --git a/package.json b/package.json index 8f2c1da06..4a42c528c 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.7", "@babel/preset-react": "^7.24.7", - "@googleapis/drive": "^8.10.0", + "@googleapis/drive": "^8.11.0", "body-parser": "^1.20.2", "classnames": "^2.5.1", "codemirror": "^5.65.6", From 8570335d7915aa8801dd046ed8b2c5242289390c Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 5 Jul 2024 16:53:21 -0500 Subject: [PATCH 161/239] Consolidate variable redundancy. --- client/homebrew/brewRenderer/brewRenderer.jsx | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 7eae3228f..9e4b79803 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -188,32 +188,24 @@ const BrewRenderer = (props)=>{ document.dispatchEvent(new MouseEvent('click')); }; - let rendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; - let baseRendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; - const blankRendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; + let brewThemeRendererPath = props?.renderer ? props.renderer : 'Legacy'; if(props?.theme && (props?.theme[0] === '#')) { - rendererPath = 'Brew'; + brewThemeRendererPath = 'Brew'; } let themePath = props.theme ?? '5ePHB'; const Themes = { ...staticThemes, ...props.userThemes }; - let baseThemePath = (themePath && themePath[0] !== '#') ? Themes[rendererPath][themePath]?.baseTheme : 'Brew'; + const baseThemePath = (themePath && themePath[0] !== '#') ? Themes[brewThemeRendererPath][themePath]?.baseTheme : 'Brew'; // Override static theme values if a Brew theme. if(themePath && themePath[0] === '#') { themePath = themePath.slice(1); - rendererPath = ''; + brewThemeRendererPath = ''; } else { - rendererPath += '/'; + brewThemeRendererPath += '/'; } - if(rendererPath == '') { - baseRendererPath = ''; - } else { - baseRendererPath += '/'; - } - - const staticOrUserParent = (props.theme && props?.theme[0] == '#') ? `/cssParent/${themePath}` : `/css/${baseRendererPath}${baseThemePath}`; + const staticOrUserParent = (props.theme && props?.theme[0] == '#') ? `/cssParent/${themePath}` : `/css/${brewThemeRendererPath}${baseThemePath}`; return ( <> @@ -244,11 +236,11 @@ const BrewRenderer = (props)=>{ tabIndex={-1} style={{ height: state.height }}> - + {baseThemePath && } - + {/* Apply CSS from Style tab and render pages from Markdown tab */} {state.isMounted From 9c4de58161879b4c4d26fc6cc513f7aabf2892e5 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 6 Jul 2024 13:22:47 +1200 Subject: [PATCH 162/239] Limit htmlString to the first element ONLY --- shared/naturalcrit/markdown.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 529129833..cabb73c89 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -788,10 +788,11 @@ const processStyleTags = (string)=>{ }; const extractHTMLStyleTags = (htmlString)=>{ - const id = htmlString.match(/id="([^"]*)"/)?.[1] || null; - const classes = htmlString.match(/class="([^"]*)"/)?.[1] || null; - const styles = htmlString.match(/style="([^"]*)"/)?.[1] || null; - const attributes = htmlString.match(/[a-zA-Z]+="[^"]*"/g) + const firstElementOnly = htmlString.indexOf('>') > 0 ? htmlString.substring(0, htmlString.indexOf('>')) : htmlString; + const id = firstElementOnly.match(/id="([^"]*)"/)?.[1] || null; + const classes = firstElementOnly.match(/class="([^"]*)"/)?.[1] || null; + const styles = firstElementOnly.match(/style="([^"]*)"/)?.[1] || null; + const attributes = firstElementOnly.match(/[a-zA-Z]+="[^"]*"/g) ?.filter((attr)=>!attr.startsWith('class="') && !attr.startsWith('style="') && !attr.startsWith('id="')) .reduce((obj, attr)=>{ const index = attr.indexOf('='); From 5433cda52fb1493ea25139a363e5714d4dca8a4c Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 6 Jul 2024 17:05:23 -0400 Subject: [PATCH 163/239] Add test case --- tests/markdown/mustache-syntax.test.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/markdown/mustache-syntax.test.js b/tests/markdown/mustache-syntax.test.js index 7b0115cae..3f7f2529b 100644 --- a/tests/markdown/mustache-syntax.test.js +++ b/tests/markdown/mustache-syntax.test.js @@ -333,6 +333,13 @@ describe('Injection: When an injection tag follows an element', ()=>{ expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

    text{background:blue}

    '); }); + it('Renders an parent and child element, each modified by an injector', function() { + const source = dedent`**bolded text**{color:red} + {color:blue}`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

    bolded text

    '); + }); + it('Renders an image with added attributes', function() { const source = `![homebrew mug](https://i.imgur.com/hMna6G0.png) {position:absolute,bottom:20px,left:130px,width:220px,a="b and c",d=e}`; const rendered = Markdown.render(source).trimReturns(); From 0a199e750fa6c445e126f00ed491d6fa6e75febe Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 6 Jul 2024 18:00:18 -0400 Subject: [PATCH 164/239] Simplify string splitting code String.split will return the substring before > or the whole string if no > exists. --- shared/naturalcrit/markdown.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index cabb73c89..39939f306 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -787,8 +787,9 @@ const processStyleTags = (string)=>{ }; }; +//Given a string representing an HTML element, extract all of its properties (id, class, style, and other attributes) const extractHTMLStyleTags = (htmlString)=>{ - const firstElementOnly = htmlString.indexOf('>') > 0 ? htmlString.substring(0, htmlString.indexOf('>')) : htmlString; + const firstElementOnly = htmlString.split('>')[0]; const id = firstElementOnly.match(/id="([^"]*)"/)?.[1] || null; const classes = firstElementOnly.match(/class="([^"]*)"/)?.[1] || null; const styles = firstElementOnly.match(/style="([^"]*)"/)?.[1] || null; From f8841c068f4971a44b0f943505ad331c12d1d3b9 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 6 Jul 2024 18:20:11 -0400 Subject: [PATCH 165/239] Up Version to 3.13.1 --- changelog.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/changelog.md b/changelog.md index 0a9e509f2..b331fc4f0 100644 --- a/changelog.md +++ b/changelog.md @@ -84,6 +84,16 @@ pre { ## changelog For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery). +### Saturday 6/7/2024 - v3.13.1 +{{taskList + +##### calculuschild, G-Ambatte + +* [x] Hotfixes for issues with v3.13.0 + +Fixes issues [#3559](https://github.com/naturalcrit/homebrewery/issues/3559), [#3552](https://github.com/naturalcrit/homebrewery/issues/3552), [#3554](https://github.com/naturalcrit/homebrewery/issues/3554) +}} + ### Friday 28/6/2024 - v3.13.0 {{taskList diff --git a/package-lock.json b/package-lock.json index e3a3f355d..cce4d5577 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "homebrewery", - "version": "3.13.0", + "version": "3.13.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "homebrewery", - "version": "3.13.0", + "version": "3.13.1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 4a42c528c..321f9afbe 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "homebrewery", "description": "Create authentic looking D&D homebrews using only markdown", - "version": "3.13.0", + "version": "3.13.1", "engines": { "npm": "^10.2.x", "node": "^20.8.x" From a06aa2a103885456eaf981880cf852763019fe1c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 03:17:11 +0000 Subject: [PATCH 166/239] Bump dompurify from 3.1.5 to 3.1.6 Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.1.5 to 3.1.6. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.1.5...3.1.6) --- updated-dependencies: - dependency-name: dompurify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index cce4d5577..33a47c9d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "cookie-parser": "^1.4.6", "create-react-class": "^15.7.0", "dedent-tabs": "^0.10.3", - "dompurify": "^3.1.5", + "dompurify": "^3.1.6", "expr-eval": "^2.0.2", "express": "^4.19.2", "express-async-handler": "^1.2.0", @@ -5471,9 +5471,9 @@ } }, "node_modules/dompurify": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.5.tgz", - "integrity": "sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==" + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", + "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==" }, "node_modules/duplexer2": { "version": "0.1.4", diff --git a/package.json b/package.json index 321f9afbe..9b30bc801 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "cookie-parser": "^1.4.6", "create-react-class": "^15.7.0", "dedent-tabs": "^0.10.3", - "dompurify": "^3.1.5", + "dompurify": "^3.1.6", "expr-eval": "^2.0.2", "express": "^4.19.2", "express-async-handler": "^1.2.0", From 7b9bd70554ca5cfc9d56c86948c46e2d64faa00c Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 8 Jul 2024 19:57:21 +0000 Subject: [PATCH 167/239] Change filter to box-shadow --- themes/V3/5ePHB/snippets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index d5f37ac65..11f08f560 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -349,7 +349,7 @@ module.exports = [ /* Ink Friendly */ *:is(.page,.monster,.note,.descriptive) { background : white !important; - filter : drop-shadow(0px 0px 3px #888) !important; + box-shadow : 0px 0px 3px #888 !important; } .page img { From 656edb07ea3746bb4aadebecc572208cf4ac5503 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 8 Jul 2024 18:12:58 -0500 Subject: [PATCH 168/239] Rework detection of user brews to look up themeid in static themes list before assuming is a user brew. Ended up being a fairly straightforward change. A few ternaries got smooshed or inverted. Passes builtin and local tests. Need to compare on the test instance. --- client/homebrew/brewRenderer/brewRenderer.jsx | 25 ++++++++----------- .../editor/metadataEditor/metadataEditor.jsx | 3 +-- .../homebrew/editor/snippetbar/snippetbar.jsx | 2 +- server/homebrew.api.js | 8 +++--- server/homebrew.api.spec.js | 2 +- 5 files changed, 18 insertions(+), 22 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index d87e720c1..918fdb5c9 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -188,27 +188,24 @@ const BrewRenderer = (props)=>{ document.dispatchEvent(new MouseEvent('click')); }; - let brewThemeRendererPath = props?.renderer ? props.renderer : 'Legacy'; - // Correct for casing vs theme.json - if(brewThemeRendererPath == 'legacy') { brewThemeRendererPath = 'Legacy'; } - if(props?.theme && (props?.theme[0] === '#')) { - brewThemeRendererPath = 'Brew'; - } + let brewThemeRendererPath = `${props?.renderer ? _.upperFirst(props.renderer) : 'V3'}`; + let themePath = props.theme ?? '5ePHB'; const Themes = { ...staticThemes, ...props.userThemes }; - const baseThemePath = (themePath && themePath[0] !== '#') ? Themes[brewThemeRendererPath][themePath].baseTheme : 'Brew'; + let staticOrUserParent; + let baseThemePath = null; - // Override static theme values if a Brew theme. - - if(themePath && themePath[0] === '#') { - themePath = themePath.slice(1); + if (!Themes[brewThemeRendererPath].hasOwnProperty(themePath)) { brewThemeRendererPath = ''; + staticOrUserParent = `/cssParent/${themePath}`; + baseThemePath = 'Brew'; } else { + baseThemePath = Themes[brewThemeRendererPath][themePath].baseTheme brewThemeRendererPath += '/'; + staticOrUserParent = `/css/${brewThemeRendererPath}${baseThemePath}`; + } - const staticOrUserParent = (props.theme && props?.theme[0] == '#') ? `/cssParent/${themePath}` : `/css/${brewThemeRendererPath}${baseThemePath}`; - return ( <> {/*render dummy page while iFrame is mounting.*/} @@ -238,7 +235,7 @@ const BrewRenderer = (props)=>{ tabIndex={-1} style={{ height: state.height }}> - + {baseThemePath && } diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 14a61800b..8f236b833 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -213,8 +213,7 @@ const MetadataEditor = createClass({ }); }; - const currentThemePath = this.props.metadata?.theme && this.props.metadata.theme[0] === '#' ? 'Brew' : this.props.metadata.renderer; -// const currentTheme = mergedThemes[`${_.upperFirst(currentThemePath)}`][this.props.metadata.theme]; + const currentThemePath = this.props.metadata?.theme && Themes[_.upperFirst(this.props.metadata.renderer)].hasOwnProperty(this.props.metadata?.theme) ? this.props.metadata.renderer : 'Brew'; const currentTheme = mergedThemes[`${_.upperFirst(currentThemePath)}`].hasOwnProperty(this.props.metadata.theme) ? mergedThemes[`${_.upperFirst(currentThemePath)}`][this.props.metadata.theme] : { name: `!!! THEME MISSING !!! ID=${this.props.metadata.theme.slice(1)}`}; let dropdown; diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index 80f7fc7b2..445ca2748 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -84,7 +84,7 @@ const Snippetbar = createClass({ compileSnippets : function(rendererPath, themePath, snippets) { let compiledSnippets = snippets; - const baseSnippetsPath = themePath && (themePath[0] === '#') ? false : Themes[rendererPath][themePath].baseSnippets; + const baseSnippetsPath = themePath && (Themes[rendererPath].hasOwnProperty(themePath)) ? Themes[rendererPath][themePath].baseSnippets : false; const objB = _.keyBy(compiledSnippets, 'groupName'); diff --git a/server/homebrew.api.js b/server/homebrew.api.js index f7da4f898..1fdd707fb 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -89,13 +89,13 @@ const api = { if(brews) { for await (const brew of brews) { - userThemes.Brew[`#${brew.shareId}`] = { + userThemes.Brew[brew.shareId] = { name : brew.title, renderer : 'V3', baseTheme : '', baseSnippets : false, author : brew.authors[0], - path : `#${brew.shareId}`, + path : brew.shareId, thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' }; } @@ -285,7 +285,7 @@ const api = { const brew = req.brew; splitTextStyleAndMetadata(brew); res.setHeader('Content-Type', 'text/css'); - const themePath = req.brew.theme[0] != '#' ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme.slice(1)}`; + const themePath = themes[_.upperFirst(req.brew.renderer)].hasOwnProperty(req.brew.theme) ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme}`; // Drop Parent theme if it has already been loaded. // This assumes the continued use of the V3/5ePHB and V3/Blank themes for the app. const parentThemeImport = ((req.brew.theme != '5ePHB') && (req.brew.theme != 'Blank')) ? `@import url(\"${themePath}\");\n\n`:''; @@ -296,7 +296,7 @@ const api = { const brew = req.brew; splitTextStyleAndMetadata(brew); res.setHeader('Content-Type', 'text/css'); - const themePath = req.brew.theme[0] != '#' ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme.slice(1)}`; + const themePath = themes[_.upperFirst(req.brew.renderer)].hasOwnProperty(req.brew.theme) ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme}`; const parentThemeImport = `@import url(\"${themePath}\");\n\n`; const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}${themeLocationComment}`); diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 945af7a04..5704d01fa 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -604,7 +604,7 @@ brew`); describe('getBrewThemeWithUserParent', ()=>{ it('should collect parent theme and brew style - returning as css with user-theme parent imported.', async ()=>{ const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); - model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', renderer: 'V3', shareId: 'iAmAUserTheme', theme: '#IamATheme', style: 'I Have a style!' })); + model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', renderer: 'V3', shareId: 'iAmAUserTheme', theme: 'IamATheme', style: 'I Have a style!' })); const fn = api.getBrew('share', true); const req = { brew: {}, get: ()=>{return 'localhost';}, protocol: 'https' }; const next = jest.fn(); From a247e50c9fb272f2a82132b6b1afd1979fb0adb1 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 10 Jul 2024 14:15:03 -0400 Subject: [PATCH 169/239] renaming "get" functions rename `getStaticTheme` to `getStaticThemeCSS` rename `getBrewThemeWithCSS` to `getBrewThemeCSS` rename `getBrewThemeParent` to `getBrewThemeParentCSS` to avoid confusion with other "get" endpoints like `getBrew`, and unify naming for endpoint functions that return CSS. Simplify `isStaticTheme` function (getting the parent theme is handled elsewhere) --- server/app.js | 8 ++++---- server/homebrew.api.js | 40 ++++++++++++++++++------------------- server/homebrew.api.spec.js | 12 +++++------ 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/server/app.js b/server/app.js index 98fd00937..642575ab4 100644 --- a/server/app.js +++ b/server/app.js @@ -9,7 +9,7 @@ const yaml = require('js-yaml'); const app = express(); const config = require('./config.js'); -const { homebrewApi, getBrew, getBrewThemeWithCSS, getStaticTheme, getBrewThemeParent } = require('./homebrew.api.js'); +const { homebrewApi, getBrew, getBrewThemeCSS, getStaticThemeCSS, getBrewThemeParentCSS } = require('./homebrew.api.js'); const GoogleActions = require('./googleActions.js'); const serveCompressedStaticAssets = require('./static-assets.mv.js'); const sanitizeFilename = require('sanitize-filename'); @@ -79,9 +79,9 @@ app.get('/robots.txt', (req, res)=>{ // Theme -app.get('/css/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getBrewThemeWithCSS)); -app.get('/css/:engine/:id/', asyncHandler(getStaticTheme)); -app.get('/cssParent/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getBrewThemeParent)); +app.get('/css/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getBrewThemeCSS)); +app.get('/css/:engine/:id/', asyncHandler(getStaticThemeCSS)); +app.get('/cssParent/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getBrewThemeParentCSS)); //Home page diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 1fdd707fb..b6dd9cec5 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -13,17 +13,10 @@ var url = require('url'); const { DEFAULT_BREW, DEFAULT_BREW_LOAD } = require('./brewDefaults.js'); -const themes = require('../themes/themes.json'); +const Themes = require('../themes/themes.json'); -const isStaticTheme = (engine, themeName)=>{ - if(!themes.hasOwnProperty(engine)) { - return undefined; - } - if(themes[engine].hasOwnProperty(themeName)) { - return themes[engine][themeName].baseTheme; - } else { - return undefined; - } +const isStaticTheme = (renderer, themeName)=>{ + return Themes[renderer]?.[themeName] !== undefined; }; // const getTopBrews = (cb) => { @@ -281,35 +274,40 @@ const api = { res.status(200).send(saved); }, - getBrewThemeWithCSS : async (req, res)=>{ + getBrewThemeCSS : async (req, res)=>{ const brew = req.brew; + console.log(`getBrewThemeCSS for ${brew.shareId}`) splitTextStyleAndMetadata(brew); res.setHeader('Content-Type', 'text/css'); - const themePath = themes[_.upperFirst(req.brew.renderer)].hasOwnProperty(req.brew.theme) ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme}`; + const themePath = Themes[_.upperFirst(req.brew.renderer)].hasOwnProperty(req.brew.theme) ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme}`; // Drop Parent theme if it has already been loaded. // This assumes the continued use of the V3/5ePHB and V3/Blank themes for the app. + console.log(`and parentThemeImport for ${brew.theme}`) const parentThemeImport = ((req.brew.theme != '5ePHB') && (req.brew.theme != 'Blank')) ? `@import url(\"${themePath}\");\n\n`:''; const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}${themeLocationComment}${req.brew.style}`); }, - getBrewThemeParent : async (req, res)=>{ + getBrewThemeParentCSS : async (req, res)=>{ const brew = req.brew; + console.log(`getBrewThemeParentCSS for ${brew.shareId}`) splitTextStyleAndMetadata(brew); res.setHeader('Content-Type', 'text/css'); - const themePath = themes[_.upperFirst(req.brew.renderer)].hasOwnProperty(req.brew.theme) ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme}`; + console.log(`getBrewThemeParentCSS parent is ${brew.theme}`) + const themePath = Themes[_.upperFirst(req.brew.renderer)].hasOwnProperty(req.brew.theme) ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme}`; const parentThemeImport = `@import url(\"${themePath}\");\n\n`; const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}${themeLocationComment}`); }, - getStaticTheme : async(req, res)=>{ - const themeParent = isStaticTheme(req.params.engine, req.params.id); - if(themeParent === undefined){ - res.status(404).send(`Invalid Theme - Engine: ${req.params.engine}, Name: ${req.params.id}`); - } else { + getStaticThemeCSS : async(req, res)=>{ + if (!isStaticTheme(req.params.engine, req.params.id)) + res.status(404).send(`Invalid Theme - Renderer: ${req.params.engine}, Name: ${req.params.id}`); + else { + const themeParent = Themes[req.params.engine][req.params.id].baseTheme; + console.log(`getStaticThemeCSS for ${themeParent}`) res.setHeader('Content-Type', 'text/css'); res.setHeader('Cache-Control', 'public, max-age: 43200, must-revalidate'); - const parentTheme = themeParent ? `@import url(\"/css/${req.params.engine}/${themeParent}\");\n/* Static Theme ${themes[req.params.engine][themeParent].name} */\n` : ''; - return res.status(200).send(`${parentTheme}@import url(\"/themes/${req.params.engine}/${req.params.id}/style.css\");\n/* Static Theme ${themes[req.params.engine][req.params.id].name} */\n`); + const parentTheme = themeParent ? `@import url(\"/css/${req.params.engine}/${themeParent}\");\n/* Static Theme ${Themes[req.params.engine][themeParent].name} */\n` : ''; + return res.status(200).send(`${parentTheme}@import url(\"/themes/${req.params.engine}/${req.params.id}/style.css\");\n/* Static Theme ${Themes[req.params.engine][req.params.id].name} */\n`); } }, updateBrew : async (req, res)=>{ diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 5704d01fa..c7ebfc964 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -594,7 +594,7 @@ brew`); const next = jest.fn(); await fn(req, null, next); - api.getBrewThemeWithCSS(req, res); + api.getBrewThemeCSS(req, res); const sent = res.send.mock.calls[0][0]; expect(sent).toBe(`@import url("/css/V3/5eDMG");\n\n/* From Brew: https://localhost/share/iAmAUserTheme */\n\nI Have a style!`); expect(res.status).toHaveBeenCalledWith(200); @@ -610,14 +610,14 @@ brew`); const next = jest.fn(); await fn(req, null, next); - api.getBrewThemeWithCSS(req, res); + api.getBrewThemeCSS(req, res); const sent = res.send.mock.calls[0][0]; expect(sent).toBe(`@import url("/css/IamATheme");\n\n/* From Brew: https://localhost/share/iAmAUserTheme */\n\nI Have a style!`); expect(res.status).toHaveBeenCalledWith(200); }); }); - describe('getStaticTheme', ()=>{ + describe('getStaticThemeCSS', ()=>{ it('should return an import of the theme without including a parent.', async ()=>{ const req = { params : { @@ -625,7 +625,7 @@ brew`); id : '5ePHB' } }; - api.getStaticTheme(req, res); + api.getStaticThemeCSS(req, res); const sent = res.send.mock.calls[0][0]; expect(sent).toBe('@import url("/themes/V3/5ePHB/style.css");\n/* Static Theme 5e PHB */\n'); expect(res.status).toHaveBeenCalledWith(200); @@ -637,7 +637,7 @@ brew`); id : '5eDMG' } }; - api.getStaticTheme(req, res); + api.getStaticThemeCSS(req, res); const sent = res.send.mock.calls[0][0]; expect(sent).toBe('@import url("/css/V3/5ePHB");\n/* Static Theme 5e PHB */\n@import url("/themes/V3/5eDMG/style.css");\n/* Static Theme 5e DMG */\n'); expect(res.status).toHaveBeenCalledWith(200); @@ -649,7 +649,7 @@ brew`); id : '5eDMGGGG' } }; - api.getStaticTheme(req, res); + api.getStaticThemeCSS(req, res); const sent = res.send.mock.calls[0][0]; expect(sent).toBe('Invalid Theme - Engine: V3, Name: 5eDMGGGG'); expect(res.status).toHaveBeenCalledWith(404); From 28446d3ae2c8408c577bcf752b12a8c9707631a2 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 10 Jul 2024 14:21:23 -0400 Subject: [PATCH 170/239] Comments for theme CSS endpoints --- server/homebrew.api.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index b6dd9cec5..07c339d94 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -274,6 +274,7 @@ const api = { res.status(200).send(saved); }, + //Return CSS for a brew theme, with @include endpoint for its parent theme if any (except for Blank and 5ePHB) getBrewThemeCSS : async (req, res)=>{ const brew = req.brew; console.log(`getBrewThemeCSS for ${brew.shareId}`) @@ -287,6 +288,7 @@ const api = { const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}${themeLocationComment}${req.brew.style}`); }, + //Return @include endpoint for a theme's parent theme only getBrewThemeParentCSS : async (req, res)=>{ const brew = req.brew; console.log(`getBrewThemeParentCSS for ${brew.shareId}`) @@ -298,14 +300,15 @@ const api = { const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}${themeLocationComment}`); }, + //Return CSS for a static theme, with @include endpoint for its parent theme if any getStaticThemeCSS : async(req, res)=>{ if (!isStaticTheme(req.params.engine, req.params.id)) res.status(404).send(`Invalid Theme - Renderer: ${req.params.engine}, Name: ${req.params.id}`); else { - const themeParent = Themes[req.params.engine][req.params.id].baseTheme; console.log(`getStaticThemeCSS for ${themeParent}`) res.setHeader('Content-Type', 'text/css'); res.setHeader('Cache-Control', 'public, max-age: 43200, must-revalidate'); + const themeParent = Themes[req.params.engine][req.params.id].baseTheme; const parentTheme = themeParent ? `@import url(\"/css/${req.params.engine}/${themeParent}\");\n/* Static Theme ${Themes[req.params.engine][themeParent].name} */\n` : ''; return res.status(200).send(`${parentTheme}@import url(\"/themes/${req.params.engine}/${req.params.id}/style.css\");\n/* Static Theme ${Themes[req.params.engine][req.params.id].name} */\n`); } From 88578a3d167747fc8605da25bc92c53d4ef7be81 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 10 Jul 2024 14:22:42 -0400 Subject: [PATCH 171/239] Fix failing test --- server/homebrew.api.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index c7ebfc964..d33a8f133 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -651,7 +651,7 @@ brew`); }; api.getStaticThemeCSS(req, res); const sent = res.send.mock.calls[0][0]; - expect(sent).toBe('Invalid Theme - Engine: V3, Name: 5eDMGGGG'); + expect(sent).toBe('Invalid Theme - Renderer: V3, Name: 5eDMGGGG'); expect(res.status).toHaveBeenCalledWith(404); }); }); From 27aebf0e3be7e5d6bc98e706f8910b7a586ad825 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 10 Jul 2024 17:15:45 -0400 Subject: [PATCH 172/239] Give 5ePHB and Journal themes a baseTheme of "Blank" --- themes/V3/5ePHB/settings.json | 2 +- themes/V3/Journal/settings.json | 2 +- themes/themes.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/themes/V3/5ePHB/settings.json b/themes/V3/5ePHB/settings.json index 499096a05..53329ce4a 100644 --- a/themes/V3/5ePHB/settings.json +++ b/themes/V3/5ePHB/settings.json @@ -1,6 +1,6 @@ { "name" : "5e PHB", "renderer" : "V3", - "baseTheme" : false, + "baseTheme" : "Blank", "baseSnippets" : false } diff --git a/themes/V3/Journal/settings.json b/themes/V3/Journal/settings.json index 069bdb270..74700cc8c 100644 --- a/themes/V3/Journal/settings.json +++ b/themes/V3/Journal/settings.json @@ -1,6 +1,6 @@ { "name" : "Journal", "renderer" : "V3", - "baseTheme" : false, + "baseTheme" : "Blank", "baseSnippets" : "5ePHB" } diff --git a/themes/themes.json b/themes/themes.json index 0d28c7394..16a4b9b13 100644 --- a/themes/themes.json +++ b/themes/themes.json @@ -18,7 +18,7 @@ "5ePHB": { "name": "5e PHB", "renderer": "V3", - "baseTheme": false, + "baseTheme": "Blank", "baseSnippets": false, "path": "5ePHB" }, @@ -32,7 +32,7 @@ "Journal": { "name": "Journal", "renderer": "V3", - "baseTheme": false, + "baseTheme": "Blank", "baseSnippets": "5ePHB", "path": "Journal" } From 7eb96ee6be6ce3129717a8a98669f9f43cec8dff Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 10 Jul 2024 17:46:51 -0400 Subject: [PATCH 173/239] Simplify brewRenderer output to only emit current theme Instead of Blank, Parent, and Theme, just make use of the @include chaining, to handle all parent themes down to and including Blank --- client/homebrew/brewRenderer/brewRenderer.jsx | 26 ++++--------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 918fdb5c9..4c77728fa 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -188,23 +188,11 @@ const BrewRenderer = (props)=>{ document.dispatchEvent(new MouseEvent('click')); }; - let brewThemeRendererPath = `${props?.renderer ? _.upperFirst(props.renderer) : 'V3'}`; + let rendererPath = ''; + let themePath = props.theme; - let themePath = props.theme ?? '5ePHB'; - const Themes = { ...staticThemes, ...props.userThemes }; - let staticOrUserParent; - let baseThemePath = null; - - if (!Themes[brewThemeRendererPath].hasOwnProperty(themePath)) { - brewThemeRendererPath = ''; - staticOrUserParent = `/cssParent/${themePath}`; - baseThemePath = 'Brew'; - } else { - baseThemePath = Themes[brewThemeRendererPath][themePath].baseTheme - brewThemeRendererPath += '/'; - staticOrUserParent = `/css/${brewThemeRendererPath}${baseThemePath}`; - - } + if (staticThemes[_.upperFirst(props.renderer)]?.[props.theme] !== undefined) //Change CSS path if is staticTheme + rendererPath = _.upperFirst(props.renderer) + '/'; return ( <> @@ -235,11 +223,7 @@ const BrewRenderer = (props)=>{ tabIndex={-1} style={{ height: state.height }}> - - {baseThemePath && - - } - + {/* Apply CSS from Style tab and render pages from Markdown tab */} {state.isMounted From 24c86dd1991e83b54f1d2145f8617b980f5e1dfd Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 10 Jul 2024 17:49:57 -0400 Subject: [PATCH 174/239] Remove unused test --- server/homebrew.api.spec.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index d33a8f133..fb46cfa02 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -618,18 +618,6 @@ brew`); }); describe('getStaticThemeCSS', ()=>{ - it('should return an import of the theme without including a parent.', async ()=>{ - const req = { - params : { - engine : 'V3', - id : '5ePHB' - } - }; - api.getStaticThemeCSS(req, res); - const sent = res.send.mock.calls[0][0]; - expect(sent).toBe('@import url("/themes/V3/5ePHB/style.css");\n/* Static Theme 5e PHB */\n'); - expect(res.status).toHaveBeenCalledWith(200); - }); it('should return an import of the theme including a parent.', async ()=>{ const req = { params : { From a6f787ea8f22de7514048cd1dad7954f0aff3dc3 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 10 Jul 2024 17:56:39 -0400 Subject: [PATCH 175/239] Remove `getBrewThemeParentCSS` --- server/app.js | 3 +-- server/homebrew.api.js | 21 ++++----------------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/server/app.js b/server/app.js index 642575ab4..b2f76f280 100644 --- a/server/app.js +++ b/server/app.js @@ -9,7 +9,7 @@ const yaml = require('js-yaml'); const app = express(); const config = require('./config.js'); -const { homebrewApi, getBrew, getBrewThemeCSS, getStaticThemeCSS, getBrewThemeParentCSS } = require('./homebrew.api.js'); +const { homebrewApi, getBrew, getBrewThemeCSS, getStaticThemeCSS } = require('./homebrew.api.js'); const GoogleActions = require('./googleActions.js'); const serveCompressedStaticAssets = require('./static-assets.mv.js'); const sanitizeFilename = require('sanitize-filename'); @@ -81,7 +81,6 @@ app.get('/robots.txt', (req, res)=>{ app.get('/css/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getBrewThemeCSS)); app.get('/css/:engine/:id/', asyncHandler(getStaticThemeCSS)); -app.get('/cssParent/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getBrewThemeParentCSS)); //Home page diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 07c339d94..20c1be3ed 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -274,41 +274,28 @@ const api = { res.status(200).send(saved); }, - //Return CSS for a brew theme, with @include endpoint for its parent theme if any (except for Blank and 5ePHB) + //Return CSS for a brew theme, with @include endpoint for its parent theme if any getBrewThemeCSS : async (req, res)=>{ const brew = req.brew; console.log(`getBrewThemeCSS for ${brew.shareId}`) splitTextStyleAndMetadata(brew); res.setHeader('Content-Type', 'text/css'); const themePath = Themes[_.upperFirst(req.brew.renderer)].hasOwnProperty(req.brew.theme) ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme}`; - // Drop Parent theme if it has already been loaded. - // This assumes the continued use of the V3/5ePHB and V3/Blank themes for the app. console.log(`and parentThemeImport for ${brew.theme}`) - const parentThemeImport = ((req.brew.theme != '5ePHB') && (req.brew.theme != 'Blank')) ? `@import url(\"${themePath}\");\n\n`:''; + const parentThemeImport = `@import url(\"${themePath}\");\n\n`; const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}${themeLocationComment}${req.brew.style}`); }, - //Return @include endpoint for a theme's parent theme only - getBrewThemeParentCSS : async (req, res)=>{ - const brew = req.brew; - console.log(`getBrewThemeParentCSS for ${brew.shareId}`) - splitTextStyleAndMetadata(brew); - res.setHeader('Content-Type', 'text/css'); - console.log(`getBrewThemeParentCSS parent is ${brew.theme}`) - const themePath = Themes[_.upperFirst(req.brew.renderer)].hasOwnProperty(req.brew.theme) ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme}`; - const parentThemeImport = `@import url(\"${themePath}\");\n\n`; - const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; - return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}${themeLocationComment}`); - }, //Return CSS for a static theme, with @include endpoint for its parent theme if any getStaticThemeCSS : async(req, res)=>{ if (!isStaticTheme(req.params.engine, req.params.id)) res.status(404).send(`Invalid Theme - Renderer: ${req.params.engine}, Name: ${req.params.id}`); else { - console.log(`getStaticThemeCSS for ${themeParent}`) res.setHeader('Content-Type', 'text/css'); res.setHeader('Cache-Control', 'public, max-age: 43200, must-revalidate'); const themeParent = Themes[req.params.engine][req.params.id].baseTheme; + console.log(`getStaticThemeCSS for ${req.params.id}`) + console.log(`and parentThemeImport for ${themeParent}`) const parentTheme = themeParent ? `@import url(\"/css/${req.params.engine}/${themeParent}\");\n/* Static Theme ${Themes[req.params.engine][themeParent].name} */\n` : ''; return res.status(200).send(`${parentTheme}@import url(\"/themes/${req.params.engine}/${req.params.id}/style.css\");\n/* Static Theme ${Themes[req.params.engine][req.params.id].name} */\n`); } From 29c2274a194028828d1e6836080f0e089cf87dbe Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 10 Jul 2024 18:54:45 -0400 Subject: [PATCH 176/239] Unify some variable naming --- server/homebrew.api.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 20c1be3ed..e39026b84 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -277,14 +277,17 @@ const api = { //Return CSS for a brew theme, with @include endpoint for its parent theme if any getBrewThemeCSS : async (req, res)=>{ const brew = req.brew; - console.log(`getBrewThemeCSS for ${brew.shareId}`) splitTextStyleAndMetadata(brew); res.setHeader('Content-Type', 'text/css'); - const themePath = Themes[_.upperFirst(req.brew.renderer)].hasOwnProperty(req.brew.theme) ? `/css/${req.brew.renderer}/${req.brew.theme}` : `/css/${req.brew.theme}`; + let rendererPath = ''; + if(isStaticTheme(req.brew.renderer,req.brew.theme)) //Check if parent is staticBrew + rendererPath = _.upperFirst(req.brew.renderer) + '/'; + + console.log(`getBrewThemeCSS for ${brew.shareId}`) console.log(`and parentThemeImport for ${brew.theme}`) - const parentThemeImport = `@import url(\"${themePath}\");\n\n`; + const parentThemeImport = `@import url(\"/css/${rendererPath}${req.brew.theme}\");\n\n`; const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; - return res.status(200).send(req.brew.renderer == 'legacy' ? '' : `${parentThemeImport}${themeLocationComment}${req.brew.style}`); + return res.status(200).send(`${parentThemeImport}${themeLocationComment}${req.brew.style}`); }, //Return CSS for a static theme, with @include endpoint for its parent theme if any getStaticThemeCSS : async(req, res)=>{ @@ -296,8 +299,8 @@ const api = { const themeParent = Themes[req.params.engine][req.params.id].baseTheme; console.log(`getStaticThemeCSS for ${req.params.id}`) console.log(`and parentThemeImport for ${themeParent}`) - const parentTheme = themeParent ? `@import url(\"/css/${req.params.engine}/${themeParent}\");\n/* Static Theme ${Themes[req.params.engine][themeParent].name} */\n` : ''; - return res.status(200).send(`${parentTheme}@import url(\"/themes/${req.params.engine}/${req.params.id}/style.css\");\n/* Static Theme ${Themes[req.params.engine][req.params.id].name} */\n`); + const parentThemeImport = themeParent ? `@import url(\"/css/${req.params.engine}/${themeParent}\");\n/* Static Theme ${Themes[req.params.engine][themeParent].name} */\n` : ''; + return res.status(200).send(`${parentThemeImport}@import url(\"/themes/${req.params.engine}/${req.params.id}/style.css\");\n/* Static Theme ${Themes[req.params.engine][req.params.id].name} */\n`); } }, updateBrew : async (req, res)=>{ From 5c0a072115b02cdb0dce095a72c36c90ea963eb6 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Thu, 11 Jul 2024 00:25:11 -0400 Subject: [PATCH 177/239] userThemes passed to SnippetBar.jsx is never used --- client/homebrew/editor/editor.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/client/homebrew/editor/editor.jsx b/client/homebrew/editor/editor.jsx index 3417d7c4d..efcc9c861 100644 --- a/client/homebrew/editor/editor.jsx +++ b/client/homebrew/editor/editor.jsx @@ -417,7 +417,6 @@ const Editor = createClass({ showEditButtons={this.props.showEditButtons} renderer={this.props.renderer} theme={this.props.brew.theme} - userThemes={this.props.brew.userThemes} undo={this.undo} redo={this.redo} foldCode={this.foldCode} From 2fa3c0f3114e88edba4b62b96a502de77492f0e8 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Thu, 11 Jul 2024 00:26:50 -0400 Subject: [PATCH 178/239] themeClass is never used --- client/homebrew/editor/metadataEditor/metadataEditor.jsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 8f236b833..4711cc73c 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -36,7 +36,6 @@ const MetadataEditor = createClass({ authors : [], systems : [], renderer : 'legacy', - themeClass : 'V3', theme : '5ePHB', lang : 'en' }, @@ -109,9 +108,8 @@ const MetadataEditor = createClass({ }); }, - handleTheme : function(theme, themeClass){ + handleTheme : function(theme){ this.props.metadata.renderer = theme.renderer; - this.props.metadata.themeClass = themeClass; this.props.metadata.theme = theme.path; this.props.onChange(this.props.metadata); }, @@ -200,7 +198,7 @@ const MetadataEditor = createClass({ return _.map(_.values(mergedThemes[renderer]), (theme)=>{ const preview = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`; const texture = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownTexture.png`; - return
    this.handleTheme(theme, renderer)} title={''}> + return
    this.handleTheme(theme)} title={''}>

    {`${theme?.author ? theme.author : renderer} : ${theme.name}`}

    From 23fd70e3c3bd108f8c5e51b629b241ac3bd199b1 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 11 Jul 2024 18:10:26 +1200 Subject: [PATCH 179/239] Add additional style to existing SolberaImitation --- themes/fonts/5e/fonts.less | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/themes/fonts/5e/fonts.less b/themes/fonts/5e/fonts.less index 8f089b51c..c028b06f9 100644 --- a/themes/fonts/5e/fonts.less +++ b/themes/fonts/5e/fonts.less @@ -74,8 +74,9 @@ @font-face { font-family: SolberaImitationRemake; //Tweaked 5e version src: url('../../../fonts/5e/Solbera Imitation Tweak.woff2'); - font-weight: normal; + font-weight: 100 1000; font-style: normal; + font-style: italic; } /* Cover Page */ From cb9d24d5b4eaa6b24236bc808da51cee709eeab2 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 11 Jul 2024 20:03:17 +1200 Subject: [PATCH 180/239] Remove text-decoration from Brew Item links --- .../pages/basePages/listPage/brewItem/brewItem.less | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/client/homebrew/pages/basePages/listPage/brewItem/brewItem.less b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.less index 9bee4e5eb..a3c17215e 100644 --- a/client/homebrew/pages/basePages/listPage/brewItem/brewItem.less +++ b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.less @@ -119,11 +119,12 @@ text-align : center; a{ .animate(opacity); - display : block; - margin : 8px 0px; - opacity : 0.6; - font-size : 1.3em; - color : white; + display : block; + margin : 8px 0px; + opacity : 0.6; + font-size : 1.3em; + color : white; + text-decoration : unset; &:hover{ opacity : 1; } From ade819c70c4d0cb0e18266ffceff9208c83ef863 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Sat, 13 Jul 2024 12:12:05 -0500 Subject: [PATCH 181/239] A not so light rework. This removes the existing endpoints and replaces them with /theme. /theme/:id - return a theme bundle containing all styling from this USER theme and any parents. /theme/:engine/:id - return a theme bundle containing all styling from this STATIC theme and any parents The theme bundle returns a marshalled JSON object containing: styles - an array of strings representing the collected styles in loading order snippets - an array ( currently empty ) of collected snippets. The various bits of theme rendering code for ` }} />; - return
    ${cleanStyle} ` }} />; - }; - const renderPage = (pageText, index)=>{ if(props.renderer == 'legacy') { const html = MarkdownLegacy.render(pageText); @@ -170,7 +167,44 @@ const BrewRenderer = (props)=>{ } }; + const loadAllBrewStylesAndSnippets = ()=>{ + /* + Loads the theme bundle and parses it out. + These functionally replaces the previous renderStyles() function but needs to wait until the window is mounted. + */ + const rendererPath = isStaticTheme(props.renderer, props.theme) ? `/${props.renderer}/` : '/'; + // Check for a User or Static Theme to change the endpoint path + fetch(`${window.location.protocol}//${window.location.host}/theme${rendererPath}${props.theme}`).then((response)=>response.json()).then((themeBundle)=>{ + // Load the themeBundle from the endpoint as an object. + const documentFrame = document.getElementById('BrewRenderer'); + const iframeDocument = documentFrame.contentDocument || documentFrame.contentWindow.document; + // Find the brew frame Document root. + + for (let style=0; style < themeBundle.styles.length; style++){ + /* + Walk through the styles array on the Theme Bundle. + Create a new style node and add it to the Brew Frame + */ + const newStyles = document.createElement('style'); + newStyles.appendChild(document.createTextNode(`${themeBundle.styles[style]}\n`)); + iframeDocument.head.appendChild(newStyles); + + } + /* + Add the local brew styling to the Brew Frame + */ + const newStyles = document.createElement('style'); + const cleanStyle = props.style; //DOMPurify.sanitize(props.style, purifyConfig); + + newStyles.appendChild(document.createTextNode(`/* Local Brew Styling */\n\n${cleanStyle}`)); + iframeDocument.head.appendChild(newStyles); + + // TO-DO - Walk the snippets returns and add them to the appropriate menu. + }); + }; + const frameDidMount = ()=>{ //This triggers when iFrame finishes internal "componentDidMount" + loadAllBrewStylesAndSnippets(); // Load the brew's inherited and local styles. setTimeout(()=>{ //We still see a flicker where the style isn't applied yet, so wait 100ms before showing iFrame updateSize(); window.addEventListener('resize', updateSize); @@ -189,10 +223,10 @@ const BrewRenderer = (props)=>{ }; let rendererPath = ''; - let themePath = props.theme; + const themePath = props.theme; - if (staticThemes[_.upperFirst(props.renderer)]?.[props.theme] !== undefined) //Change CSS path if is staticTheme - rendererPath = _.upperFirst(props.renderer) + '/'; + if(staticThemes[_.upperFirst(props.renderer)]?.[props.theme] !== undefined) //Change CSS path if is staticTheme + rendererPath = `${_.upperFirst(props.renderer)}/`; return ( <> @@ -222,14 +256,10 @@ const BrewRenderer = (props)=>{ onKeyDown={handleControlKeys} tabIndex={-1} style={{ height: state.height }}> - - - {/* Apply CSS from Style tab and render pages from Markdown tab */} {state.isMounted && <> - {renderStyle()}
    {renderPages()}
    diff --git a/server/app.js b/server/app.js index b2f76f280..9680c64ca 100644 --- a/server/app.js +++ b/server/app.js @@ -9,7 +9,7 @@ const yaml = require('js-yaml'); const app = express(); const config = require('./config.js'); -const { homebrewApi, getBrew, getBrewThemeCSS, getStaticThemeCSS } = require('./homebrew.api.js'); +const { homebrewApi, getBrew, getThemeBundle } = require('./homebrew.api.js'); const GoogleActions = require('./googleActions.js'); const serveCompressedStaticAssets = require('./static-assets.mv.js'); const sanitizeFilename = require('sanitize-filename'); @@ -78,10 +78,10 @@ app.get('/robots.txt', (req, res)=>{ }); // Theme - -app.get('/css/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getBrewThemeCSS)); -app.get('/css/:engine/:id/', asyncHandler(getStaticThemeCSS)); - +// Path for User Themes +app.get('/theme/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getThemeBundle)); +// Path for Static Themes +app.get('/theme/:engine/:id', asyncHandler(getThemeBundle)); //Home page app.get('/', (req, res, next)=>{ diff --git a/server/homebrew.api.js b/server/homebrew.api.js index e39026b84..ac91799dc 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -8,8 +8,8 @@ const Markdown = require('../shared/naturalcrit/markdown.js'); const yaml = require('js-yaml'); const asyncHandler = require('express-async-handler'); const { nanoid } = require('nanoid'); -var url = require('url'); - +const path = require('path'); +const fs = require('fs'); const { DEFAULT_BREW, DEFAULT_BREW_LOAD } = require('./brewDefaults.js'); @@ -274,31 +274,111 @@ const api = { res.status(200).send(saved); }, + getThemeBundle : async(req, res)=>{ + /* + getThemeBundle: Collects the theme and all parent themes + returns an object containing an array of css, in render order, and an array + of snippets ( currently empty ) + Important parameter members: + req.params.id: This is the shareId ( User theme ) or name ( static theme ) + loaded first. + req.params.engine: This is the Markdown+ version for the static theme. If a + User theme the value will come from the User Theme metadata. + */ + let parentReq = {}; + const completeStyles = []; + const completeSnippets = []; + if(!req.params.engine) { + // If this is not set, our *first* theme is a User theme. + const finalChildBrew = req.brew; + // Break up the frontmatter + splitTextStyleAndMetadata(finalChildBrew); + // If there is anything in the snippets member, append it to the snippets array. + if(finalChildBrew?.snippets) completeSnippets.push(JSON.parse(finalChildBrew.snippets)); + // If there is anything in the styles member, append it to the styles array with labelling. + if(finalChildBrew?.style) completeStyles.push(`/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.params.id} */\n\n${finalChildBrew.style}`); + + // Set up the simulated request we are using for the parent-walking. + // This is our loop control. + parentReq = { + params : { + id : finalChildBrew.theme, + // This is the only value needed for the User themes. This is the shareId of the theme. + }, + renderer : finalChildBrew.renderer + // We set this for use later when checking for Static theme inheritance. + }; + while ((parentReq.params.id) && (!isStaticTheme(finalChildBrew.renderer, parentReq.params.id))) { + await api.getBrew('share')(parentReq, res, ()=>{}); + // Load the referenced Brew + splitTextStyleAndMetadata(parentReq); + // break up the meta data + if(parentReq?.snippets) completeSnippets.push(JSON.parse(parentReq.snippets)); + // If there is anything in the snippets member, append it to the snippets array. + if(parentReq?.style) { + completeStyles.push(`/* From Brew: ${req.protocol}://${req.get('host')}/share/${parentReq.params.id} */\n\n${parentReq.style}`); + // If there is anything in the styles member, append it to the styles array with labelling. + } + // Update the loop object to point to this theme's parent + parentReq.params.id = parentReq?.theme; + } + } else { + // If the first theme wasn't a User theme, set up the loop control object + // This is done the same as above for consistant logic. + parentReq = { + params : { + id : req.params.id, + // This is the name of the theme + }, + renderer : req.params.engine + // The renderer is needed for the static pathing. + }; + } + + while ((parentReq.params.id) && (isStaticTheme(parentReq.renderer, parentReq.params.id))) { + // If we have a static path + const localStyle = fs.readFileSync(path.join(__dirname, '../build/themes/', parentReq.renderer, parentReq.params.id, 'style.css')).toString(); + // Read the Theme's style.css from the filesystem + completeStyles.push(`/* From Theme ${parentReq.params.id} */\n\n${localStyle}`); + // Label and append the themes style to the styles array. + parentReq.params.id = Themes[parentReq.renderer][parentReq.params.id].baseTheme; + // NOTE: This currently makes NO attempt to do anything with Static theme Snippets. Loading of static snippets remains unchanged. + } + + const returnObj = { + styles : completeStyles.reverse(), + // Reverse the order of the styles array so they are rendered oldest aprent to youngest child. + snippets : completeSnippets + }; + + res.setHeader('Content-Type', 'text/json'); + return res.status(200).send(JSON.stringify(returnObj)); + }, //Return CSS for a brew theme, with @include endpoint for its parent theme if any getBrewThemeCSS : async (req, res)=>{ const brew = req.brew; splitTextStyleAndMetadata(brew); res.setHeader('Content-Type', 'text/css'); let rendererPath = ''; - if(isStaticTheme(req.brew.renderer,req.brew.theme)) //Check if parent is staticBrew - rendererPath = _.upperFirst(req.brew.renderer) + '/'; + if(isStaticTheme(req.brew.renderer, req.brew.theme)) //Check if parent is staticBrew + rendererPath = `${_.upperFirst(req.brew.renderer)}/`; - console.log(`getBrewThemeCSS for ${brew.shareId}`) - console.log(`and parentThemeImport for ${brew.theme}`) + console.log(`getBrewThemeCSS for ${brew.shareId}`); + console.log(`and parentThemeImport for ${brew.theme}`); const parentThemeImport = `@import url(\"/css/${rendererPath}${req.brew.theme}\");\n\n`; const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; return res.status(200).send(`${parentThemeImport}${themeLocationComment}${req.brew.style}`); }, //Return CSS for a static theme, with @include endpoint for its parent theme if any getStaticThemeCSS : async(req, res)=>{ - if (!isStaticTheme(req.params.engine, req.params.id)) + if(!isStaticTheme(req.params.engine, req.params.id)) res.status(404).send(`Invalid Theme - Renderer: ${req.params.engine}, Name: ${req.params.id}`); else { res.setHeader('Content-Type', 'text/css'); res.setHeader('Cache-Control', 'public, max-age: 43200, must-revalidate'); const themeParent = Themes[req.params.engine][req.params.id].baseTheme; - console.log(`getStaticThemeCSS for ${req.params.id}`) - console.log(`and parentThemeImport for ${themeParent}`) + console.log(`getStaticThemeCSS for ${req.params.id}`); + console.log(`and parentThemeImport for ${themeParent}`); const parentThemeImport = themeParent ? `@import url(\"/css/${req.params.engine}/${themeParent}\");\n/* Static Theme ${Themes[req.params.engine][themeParent].name} */\n` : ''; return res.status(200).send(`${parentThemeImport}@import url(\"/themes/${req.params.engine}/${req.params.id}/style.css\");\n/* Static Theme ${Themes[req.params.engine][req.params.id].name} */\n`); } diff --git a/shared/helpers.js b/shared/helpers.js index 8ca185046..321791f84 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -15,6 +15,11 @@ const splitTextStyleAndMetadata = (brew)=>{ brew.style = brew.text.slice(7, index - 1); brew.text = brew.text.slice(index + 5); } + if(brew.text.startsWith('```snippets')) { + const index = brew.text.indexOf('```\n\n'); + brew.snippets = brew.text.slice(11, index - 1); + brew.text = brew.text.slice(index + 5); + } }; const printCurrentBrew = ()=>{ From 5f8d46f1b66c077308ff908d0b3ccddfc7b1cf9b Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 13 Jul 2024 17:09:45 -0400 Subject: [PATCH 182/239] Reuse `splitTextStyleAndMetadata` from `helpers.js` --- server/homebrew.api.js | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index ac91799dc..09eed01bd 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -10,6 +10,7 @@ const asyncHandler = require('express-async-handler'); const { nanoid } = require('nanoid'); const path = require('path'); const fs = require('fs'); +const { splitTextStyleAndMetadata } = require('../shared/helpers.js'); const { DEFAULT_BREW, DEFAULT_BREW_LOAD } = require('./brewDefaults.js'); @@ -27,22 +28,6 @@ const isStaticTheme = (renderer, themeName)=>{ const MAX_TITLE_LENGTH = 100; -const splitTextStyleAndMetadata = (brew)=>{ - brew.text = brew.text.replaceAll('\r\n', '\n'); - if(brew.text.startsWith('```metadata')) { - const index = brew.text.indexOf('```\n\n'); - const metadataSection = brew.text.slice(12, index - 1); - const metadata = yaml.load(metadataSection); - Object.assign(brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer', 'theme', 'lang'])); - brew.text = brew.text.slice(index + 5); - } - if(brew.text.startsWith('```css')) { - const index = brew.text.indexOf('```\n\n'); - brew.style = brew.text.slice(7, index - 1); - brew.text = brew.text.slice(index + 5); - } -}; - const api = { homebrewApi : router, getId : (req)=>{ From ee381c91fe55133a8a4dc9a5cd041221d5feb19e Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 13 Jul 2024 17:26:38 -0400 Subject: [PATCH 183/239] Simplify getUserBrewThemes function a bit --- server/homebrew.api.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 09eed01bd..888c1d137 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -46,6 +46,7 @@ const api = { } return { id, googleId }; }, + //Get array of any of this user's brews tagged with `meta:theme` getUsersBrewThemes : async (username, id)=>{ const fields = [ 'title', @@ -57,24 +58,20 @@ const api = { 'authors' ]; - const userThemes = { - Brew : { - - } - }; + const userThemes = {}; const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['meta:theme', 'meta:Theme'] }, shareId: { $ne: id }, renderer: { $ne: 'Legacy' } }); if(brews) { - for await (const brew of brews) { + for (const brew of brews) { userThemes.Brew[brew.shareId] = { name : brew.title, - renderer : 'V3', + renderer : brew.renderer, baseTheme : '', baseSnippets : false, author : brew.authors[0], path : brew.shareId, - thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg' + thumbnail : brew.thumbnail || '/assets/naturalCritLogoWhite.svg' }; } } From f29a5e346e591e5d32b441381585a075fbb9d19e Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 13 Jul 2024 17:35:19 -0400 Subject: [PATCH 184/239] Remove `id` parameter from getUsersBrewThemes Filtering out the current brew can be done later as needed; certain situations may call for retrieving the whole list. --- server/homebrew.api.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 888c1d137..6da3d99af 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -47,7 +47,7 @@ const api = { return { id, googleId }; }, //Get array of any of this user's brews tagged with `meta:theme` - getUsersBrewThemes : async (username, id)=>{ + getUsersBrewThemes : async (username)=>{ const fields = [ 'title', 'tags', @@ -60,7 +60,7 @@ const api = { const userThemes = {}; - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['meta:theme', 'meta:Theme'] }, shareId: { $ne: id }, renderer: { $ne: 'Legacy' } }); + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['meta:theme', 'meta:Theme'] }, renderer: { $ne: 'Legacy' } }); if(brews) { for (const brew of brews) { @@ -139,7 +139,6 @@ const api = { const userID = req?.account?.username && (accessType === 'edit') ? req.account.username : mainAuthor; // Clean up brew: fill in missing fields with defaults / fix old invalid values - const userThemes = accessType != 'themes' ? await api.getUsersBrewThemes(userID, id, req, res, next) : {}; if(stub) { stub.tags = stub.tags || undefined; // Clear empty strings stub.renderer = stub.renderer || undefined; // Clear empty strings @@ -384,7 +383,7 @@ const api = { brew.description = brew.description.trim() || ''; brew.text = api.mergeBrewText(brew); const userID = req?.account?.username ? req.account.username : brew.authors.split(',')[0]; - brew.userThemes = await api.getUsersBrewThemes(userID, brew.editId, req, res, null); + brew.userThemes = await api.getUsersBrewThemes(userID, req, res, null); if(brew.googleId && removeFromGoogle) { From 47f912750b2664b97f3d9496741d8071a2b6f27b Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 13 Jul 2024 17:44:23 -0400 Subject: [PATCH 185/239] Extract getting userThemes from `getBrew()` `getBrew()` should do one thing only; retrieve a brew. UI elements like the list of themes available to the user are not part of a brew. Moved into the handers for the `/edit/` and `/new/` endpoints --- server/app.js | 7 +++++-- server/homebrew.api.js | 7 ------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/server/app.js b/server/app.js index 9680c64ca..6c791d634 100644 --- a/server/app.js +++ b/server/app.js @@ -9,7 +9,7 @@ const yaml = require('js-yaml'); const app = express(); const config = require('./config.js'); -const { homebrewApi, getBrew, getThemeBundle } = require('./homebrew.api.js'); +const { homebrewApi, getBrew, getThemeBundle, getUsersBrewThemes } = require('./homebrew.api.js'); const GoogleActions = require('./googleActions.js'); const serveCompressedStaticAssets = require('./static-assets.mv.js'); const sanitizeFilename = require('sanitize-filename'); @@ -274,6 +274,8 @@ app.get('/user/:username', async (req, res, next)=>{ app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{ req.brew = req.brew.toObject ? req.brew.toObject() : req.brew; + req.userThemes = await(getUsersBrewThemes(req.account?.username)); + req.ogMeta = { ...defaultMetaTags, title : req.brew.title || 'Untitled Brew', description : req.brew.description || 'No description.', @@ -299,10 +301,11 @@ app.get('/new/:id', asyncHandler(getBrew('share')), (req, res, next)=>{ renderer : req.brew.renderer, theme : req.brew.theme, tags : req.brew.tags, - userThemes : req.brew.userThemes }; req.brew = _.defaults(brew, DEFAULT_BREW); + req.userThemes = await(getUsersBrewThemes(req.account?.username)); + req.ogMeta = { ...defaultMetaTags, title : 'New', description : 'Start crafting your homebrew on the Homebrewery!' diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 6da3d99af..ee361ea92 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -135,15 +135,11 @@ const api = { throw { name: 'BrewLoad Error', message: 'Brew not found', status: 404, HBErrorCode: '05', accessType: accessType, brewId: id }; } - const mainAuthor = stub.authors ? stub.authors[0] : ''; - const userID = req?.account?.username && (accessType === 'edit') ? req.account.username : mainAuthor; - // Clean up brew: fill in missing fields with defaults / fix old invalid values if(stub) { stub.tags = stub.tags || undefined; // Clear empty strings stub.renderer = stub.renderer || undefined; // Clear empty strings stub = _.defaults(stub, DEFAULT_BREW_LOAD); // Fill in blank fields - stub.userThemes = userThemes; } req.brew = stub ?? {}; @@ -382,9 +378,6 @@ const api = { brew.title = brew.title.trim(); brew.description = brew.description.trim() || ''; brew.text = api.mergeBrewText(brew); - const userID = req?.account?.username ? req.account.username : brew.authors.split(',')[0]; - brew.userThemes = await api.getUsersBrewThemes(userID, req, res, null); - if(brew.googleId && removeFromGoogle) { // If the google id exists and we're removing it from google, set afterSave to delete the google brew and mark the brew's google id as undefined From c9b885f868e20bf02912b2e1641b2a8ecb267f18 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 13 Jul 2024 18:01:50 -0400 Subject: [PATCH 186/239] include `theme` as baseTheme when getting user brew themes `baseTheme` for a user brew theme is just the `theme` value of that brew. --- server/homebrew.api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index ee361ea92..abc0d9583 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -67,7 +67,7 @@ const api = { userThemes.Brew[brew.shareId] = { name : brew.title, renderer : brew.renderer, - baseTheme : '', + baseTheme : brew.theme, baseSnippets : false, author : brew.authors[0], path : brew.shareId, From e222811d03a7093433f46f0cf1dcb7fa8df1a1c4 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 13 Jul 2024 18:06:46 -0400 Subject: [PATCH 187/239] Rename `engine` to `renderer` to unify naming This value is named `renderer` everywhere else. Relabeling to a consistent name. --- server/app.js | 2 +- server/homebrew.api.spec.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/app.js b/server/app.js index 6c791d634..7be31a01c 100644 --- a/server/app.js +++ b/server/app.js @@ -81,7 +81,7 @@ app.get('/robots.txt', (req, res)=>{ // Path for User Themes app.get('/theme/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getThemeBundle)); // Path for Static Themes -app.get('/theme/:engine/:id', asyncHandler(getThemeBundle)); +app.get('/theme/:renderer/:id', asyncHandler(getThemeBundle)); //Home page app.get('/', (req, res, next)=>{ diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index fb46cfa02..5eb8a407c 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -621,8 +621,8 @@ brew`); it('should return an import of the theme including a parent.', async ()=>{ const req = { params : { - engine : 'V3', - id : '5eDMG' + renderer : 'V3', + id : '5eDMG' } }; api.getStaticThemeCSS(req, res); @@ -633,8 +633,8 @@ brew`); it('should fail for an invalid static theme.', async()=>{ const req = { params : { - engine : 'V3', - id : '5eDMGGGG' + renderer : 'V3', + id : '5eDMGGGG' } }; api.getStaticThemeCSS(req, res); From 591cae0e8ff5105804053cb08b4793e81fddf1fd Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 13 Jul 2024 18:08:00 -0400 Subject: [PATCH 188/239] more renaming `engine` to `renderer` --- server/homebrew.api.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index abc0d9583..c28c81500 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -259,13 +259,13 @@ const api = { Important parameter members: req.params.id: This is the shareId ( User theme ) or name ( static theme ) loaded first. - req.params.engine: This is the Markdown+ version for the static theme. If a + req.params.renderer: This is the Markdown+ version for the static theme. If a User theme the value will come from the User Theme metadata. */ let parentReq = {}; const completeStyles = []; const completeSnippets = []; - if(!req.params.engine) { + if(!req.params.renderer) { // If this is not set, our *first* theme is a User theme. const finalChildBrew = req.brew; // Break up the frontmatter @@ -307,7 +307,7 @@ const api = { id : req.params.id, // This is the name of the theme }, - renderer : req.params.engine + renderer : req.params.renderer // The renderer is needed for the static pathing. }; } @@ -348,16 +348,16 @@ const api = { }, //Return CSS for a static theme, with @include endpoint for its parent theme if any getStaticThemeCSS : async(req, res)=>{ - if(!isStaticTheme(req.params.engine, req.params.id)) - res.status(404).send(`Invalid Theme - Renderer: ${req.params.engine}, Name: ${req.params.id}`); + if(!isStaticTheme(req.params.renderer, req.params.id)) + res.status(404).send(`Invalid Theme - Renderer: ${req.params.renderer}, Name: ${req.params.id}`); else { res.setHeader('Content-Type', 'text/css'); res.setHeader('Cache-Control', 'public, max-age: 43200, must-revalidate'); - const themeParent = Themes[req.params.engine][req.params.id].baseTheme; + const themeParent = Themes[req.params.renderer][req.params.id].baseTheme; console.log(`getStaticThemeCSS for ${req.params.id}`); console.log(`and parentThemeImport for ${themeParent}`); - const parentThemeImport = themeParent ? `@import url(\"/css/${req.params.engine}/${themeParent}\");\n/* Static Theme ${Themes[req.params.engine][themeParent].name} */\n` : ''; - return res.status(200).send(`${parentThemeImport}@import url(\"/themes/${req.params.engine}/${req.params.id}/style.css\");\n/* Static Theme ${Themes[req.params.engine][req.params.id].name} */\n`); + const parentThemeImport = themeParent ? `@import url(\"/css/${req.params.renderer}/${themeParent}\");\n/* Static Theme ${Themes[req.params.renderer][themeParent].name} */\n` : ''; + return res.status(200).send(`${parentThemeImport}@import url(\"/themes/${req.params.renderer}/${req.params.id}/style.css\");\n/* Static Theme ${Themes[req.params.renderer][req.params.id].name} */\n`); } }, updateBrew : async (req, res)=>{ From f392216ff4adc437fb411a58e107171d0e03e7e1 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 13 Jul 2024 18:08:29 -0400 Subject: [PATCH 189/239] Spacing --- server/app.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/server/app.js b/server/app.js index 7be31a01c..99ad650d7 100644 --- a/server/app.js +++ b/server/app.js @@ -294,13 +294,13 @@ app.get('/new/:id', asyncHandler(getBrew('share')), (req, res, next)=>{ sanitizeBrew(req.brew, 'share'); splitTextStyleAndMetadata(req.brew); const brew = { - shareId : req.brew.shareId, - title : `CLONE - ${req.brew.title}`, - text : req.brew.text, - style : req.brew.style, - renderer : req.brew.renderer, - theme : req.brew.theme, - tags : req.brew.tags, + shareId : req.brew.shareId, + title : `CLONE - ${req.brew.title}`, + text : req.brew.text, + style : req.brew.style, + renderer : req.brew.renderer, + theme : req.brew.theme, + tags : req.brew.tags, }; req.brew = _.defaults(brew, DEFAULT_BREW); From 44c96aad04d3c1312d07f8c3b290d268b78d92c4 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 13 Jul 2024 18:11:04 -0400 Subject: [PATCH 190/239] spacing --- server/homebrew.api.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index c28c81500..2ccd58e53 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -81,12 +81,11 @@ const api = { getBrew : (accessType, stubOnly = false)=>{ // Create middleware with the accessType passed in as part of the scope return async (req, res, next)=>{ - // Get relevant IDs for the brew const { id, googleId } = api.getId(req); // Try to find the document in the Homebrewery database -- if it doesn't exist, that's fine. - let stub = await HomebrewModel.get((accessType === 'edit') ? { editId: id } : { shareId: id }) + let stub = await HomebrewModel.get(accessType === 'edit' ? { editId: id } : { shareId: id }) .catch((err)=>{ if(googleId) { console.warn(`Unable to find document stub for ${accessType}Id ${id}`); From 62c619de245dbd3a668825b860a4e7224b4a0d3c Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 13 Jul 2024 19:38:51 -0400 Subject: [PATCH 191/239] userThemes need not be nested inside a Brew object --- server/homebrew.api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 2ccd58e53..1af951a74 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -64,7 +64,7 @@ const api = { if(brews) { for (const brew of brews) { - userThemes.Brew[brew.shareId] = { + userThemes[brew.shareId] = { name : brew.title, renderer : brew.renderer, baseTheme : brew.theme, From 4951b9bf1ab32845f45bc1490bd4fb2abd595d4a Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 13 Jul 2024 19:46:12 -0400 Subject: [PATCH 192/239] Add async error handler to /edit and /new Since /edit and /new endpoints now have an `await` inside that could return an error (`getUsersBrewThemes()`), asyncHandler must be added to pass errors along instead of just crashing --- server/app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/app.js b/server/app.js index 99ad650d7..d0160e3d0 100644 --- a/server/app.js +++ b/server/app.js @@ -271,7 +271,7 @@ app.get('/user/:username', async (req, res, next)=>{ }); //Edit Page -app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{ +app.get('/edit/:id', asyncHandler(getBrew('edit')), asyncHandler(async(req, res, next)=>{ req.brew = req.brew.toObject ? req.brew.toObject() : req.brew; req.userThemes = await(getUsersBrewThemes(req.account?.username)); @@ -287,10 +287,10 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{ splitTextStyleAndMetadata(req.brew); res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save. return next(); -}); +})); //New Page -app.get('/new/:id', asyncHandler(getBrew('share')), (req, res, next)=>{ +app.get('/new/:id', asyncHandler(getBrew('share')), asyncHandler(async(req, res, next)=>{ sanitizeBrew(req.brew, 'share'); splitTextStyleAndMetadata(req.brew); const brew = { @@ -312,7 +312,7 @@ app.get('/new/:id', asyncHandler(getBrew('share')), (req, res, next)=>{ }; return next(); -}); +})); //Share Page app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, res, next)=>{ From 484b0a6dff5a13832f33b3979624645563254611 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Mon, 15 Jul 2024 16:38:19 -0400 Subject: [PATCH 193/239] simplify `getThemeBundle()` by using just one loop Also, removes need for special handling of the "first" theme. --- server/app.js | 2 +- server/homebrew.api.js | 83 ++++++++++++++---------------------------- 2 files changed, 28 insertions(+), 57 deletions(-) diff --git a/server/app.js b/server/app.js index d0160e3d0..2d0e1b16d 100644 --- a/server/app.js +++ b/server/app.js @@ -79,7 +79,7 @@ app.get('/robots.txt', (req, res)=>{ // Theme // Path for User Themes -app.get('/theme/:id', asyncHandler(getBrew('theme', false)), asyncHandler(getThemeBundle)); +app.get('/theme/:id', asyncHandler(getThemeBundle)); // Path for Static Themes app.get('/theme/:renderer/:id', asyncHandler(getThemeBundle)); diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 1af951a74..98bc4c865 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -262,69 +262,40 @@ const api = { User theme the value will come from the User Theme metadata. */ let parentReq = {}; - const completeStyles = []; + let currentTheme; + const completeStyles = []; const completeSnippets = []; - if(!req.params.renderer) { - // If this is not set, our *first* theme is a User theme. - const finalChildBrew = req.brew; - // Break up the frontmatter - splitTextStyleAndMetadata(finalChildBrew); - // If there is anything in the snippets member, append it to the snippets array. - if(finalChildBrew?.snippets) completeSnippets.push(JSON.parse(finalChildBrew.snippets)); - // If there is anything in the styles member, append it to the styles array with labelling. - if(finalChildBrew?.style) completeStyles.push(`/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.params.id} */\n\n${finalChildBrew.style}`); - // Set up the simulated request we are using for the parent-walking. - // This is our loop control. - parentReq = { - params : { - id : finalChildBrew.theme, - // This is the only value needed for the User themes. This is the shareId of the theme. - }, - renderer : finalChildBrew.renderer - // We set this for use later when checking for Static theme inheritance. - }; - while ((parentReq.params.id) && (!isStaticTheme(finalChildBrew.renderer, parentReq.params.id))) { - await api.getBrew('share')(parentReq, res, ()=>{}); - // Load the referenced Brew - splitTextStyleAndMetadata(parentReq); - // break up the meta data - if(parentReq?.snippets) completeSnippets.push(JSON.parse(parentReq.snippets)); - // If there is anything in the snippets member, append it to the snippets array. - if(parentReq?.style) { - completeStyles.push(`/* From Brew: ${req.protocol}://${req.get('host')}/share/${parentReq.params.id} */\n\n${parentReq.style}`); - // If there is anything in the styles member, append it to the styles array with labelling. - } - // Update the loop object to point to this theme's parent - parentReq.params.id = parentReq?.theme; + while (req.params.id) { + console.log(`loading theme ID ${req.params.id}`) + //=== User Themes ===// + if(!isStaticTheme(req.params.renderer, req.params.id)) { + await api.getBrew('share')(req, res, ()=>{}); + currentTheme = req.brew; + splitTextStyleAndMetadata(currentTheme); + + // If there is anything in the snippets or style members, append them to the appropriate array + if(currentTheme?.snippets) completeSnippets.push(JSON.parse(currentTheme.snippets)); + if(currentTheme?.style) completeStyles.push(`/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.params.id} */\n\n${currentTheme.style}`); + + req.params.id = currentTheme.theme; + req.params.renderer = currentTheme.renderer; + } + //=== Static Themes ===// + else { + + // NOTE: This currently makes NO attempt to do anything with Static theme Snippets. Loading of static snippets remains unchanged. + const localStyle = `@import url(\"/themes/${req.params.renderer}/${req.params.id}/style.css\");`; + completeStyles.push(`/* From Theme ${req.params.id} */\n\n${localStyle}`); + + req.params.id = Themes[req.params.renderer][req.params.id].baseTheme; } - } else { - // If the first theme wasn't a User theme, set up the loop control object - // This is done the same as above for consistant logic. - parentReq = { - params : { - id : req.params.id, - // This is the name of the theme - }, - renderer : req.params.renderer - // The renderer is needed for the static pathing. - }; - } - - while ((parentReq.params.id) && (isStaticTheme(parentReq.renderer, parentReq.params.id))) { - // If we have a static path - const localStyle = fs.readFileSync(path.join(__dirname, '../build/themes/', parentReq.renderer, parentReq.params.id, 'style.css')).toString(); - // Read the Theme's style.css from the filesystem - completeStyles.push(`/* From Theme ${parentReq.params.id} */\n\n${localStyle}`); - // Label and append the themes style to the styles array. - parentReq.params.id = Themes[parentReq.renderer][parentReq.params.id].baseTheme; - // NOTE: This currently makes NO attempt to do anything with Static theme Snippets. Loading of static snippets remains unchanged. } const returnObj = { + // Reverse the order of the arrays so they are listed oldest parent to youngest child. styles : completeStyles.reverse(), - // Reverse the order of the styles array so they are rendered oldest aprent to youngest child. - snippets : completeSnippets + snippets : completeSnippets.reverse() }; res.setHeader('Content-Type', 'text/json'); From af5434c9b7e4c0a2b4fe982cd9ca6b28dc83f37c Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Mon, 15 Jul 2024 16:45:55 -0400 Subject: [PATCH 194/239] cleanup --- server/homebrew.api.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 98bc4c865..1709f4f46 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -261,7 +261,7 @@ const api = { req.params.renderer: This is the Markdown+ version for the static theme. If a User theme the value will come from the User Theme metadata. */ - let parentReq = {}; + let currentTheme; const completeStyles = []; const completeSnippets = []; @@ -283,7 +283,6 @@ const api = { } //=== Static Themes ===// else { - // NOTE: This currently makes NO attempt to do anything with Static theme Snippets. Loading of static snippets remains unchanged. const localStyle = `@import url(\"/themes/${req.params.renderer}/${req.params.id}/style.css\");`; completeStyles.push(`/* From Theme ${req.params.id} */\n\n${localStyle}`); From dfbd85a8ce6792b33af894d3a35d4b633197c5be Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Mon, 15 Jul 2024 23:29:16 -0400 Subject: [PATCH 195/239] pass `userThemes` as a new prop, rather than inside of the brew --- client/homebrew/homebrew.jsx | 4 ++-- client/homebrew/pages/editPage/editPage.jsx | 3 +-- client/homebrew/pages/newPage/newPage.jsx | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index 2489bc1ca..cd6de102d 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -66,9 +66,9 @@ const Homebrew = createClass({
    - } /> + } /> } /> - } /> + } /> } /> } /> } /> diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index e3d8c1b2c..d30e42177 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -55,7 +55,6 @@ const EditPage = createClass({ autoSaveWarning : false, unsavedTime : new Date(), currentEditorPage : 0, - userThemes : this.props.brew.userThemes, displayLockMessage : this.props.brew.lock || false }; }, @@ -415,7 +414,7 @@ const EditPage = createClass({ theme={this.state.brew.theme} errors={this.state.htmlErrors} lang={this.state.brew.lang} - userThemes={this.state.brew.userThemes} + userThemes={this.props.userThemes} currentEditorPage={this.state.currentEditorPage} allowPrint={true} /> diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 84776a1b7..276ebd7af 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -218,6 +218,7 @@ const NewPage = createClass({ theme={this.state.brew.theme} errors={this.state.htmlErrors} lang={this.state.brew.lang} + userThemes={this.props.userThemes} currentEditorPage={this.state.currentEditorPage} allowPrint={true} /> From 1444581c868242bb7570e7c78c309bf36d605189 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Mon, 15 Jul 2024 23:44:07 -0400 Subject: [PATCH 196/239] pass userThemes prop to Editor -> MetadataEditor --- client/homebrew/editor/editor.jsx | 3 ++- client/homebrew/pages/editPage/editPage.jsx | 1 + client/homebrew/pages/newPage/newPage.jsx | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/client/homebrew/editor/editor.jsx b/client/homebrew/editor/editor.jsx index efcc9c861..a766572a2 100644 --- a/client/homebrew/editor/editor.jsx +++ b/client/homebrew/editor/editor.jsx @@ -381,7 +381,8 @@ const Editor = createClass({ + reportError={this.props.reportError} + userThemes={this.props.userThemes}/> ; } }, diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index d30e42177..a67129ca3 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -406,6 +406,7 @@ const EditPage = createClass({ onMetaChange={this.handleMetaChange} reportError={this.errorReported} renderer={this.state.brew.renderer} + userThemes={this.props.userThemes} /> Date: Mon, 15 Jul 2024 23:47:19 -0400 Subject: [PATCH 197/239] fix crash in metadataeditor --- client/homebrew/editor/metadataEditor/metadataEditor.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 4711cc73c..a71b6cbc2 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -192,7 +192,7 @@ const MetadataEditor = createClass({ renderThemeDropdown : function(){ if(!global.enable_themes) return; - const mergedThemes = { ...Themes, ...this.props.metadata.userThemes }; + const mergedThemes = { ...Themes, ...this.props.userThemes }; const listThemes = (renderer)=>{ return _.map(_.values(mergedThemes[renderer]), (theme)=>{ @@ -211,8 +211,8 @@ const MetadataEditor = createClass({ }); }; - const currentThemePath = this.props.metadata?.theme && Themes[_.upperFirst(this.props.metadata.renderer)].hasOwnProperty(this.props.metadata?.theme) ? this.props.metadata.renderer : 'Brew'; - const currentTheme = mergedThemes[`${_.upperFirst(currentThemePath)}`].hasOwnProperty(this.props.metadata.theme) ? mergedThemes[`${_.upperFirst(currentThemePath)}`][this.props.metadata.theme] : { name: `!!! THEME MISSING !!! ID=${this.props.metadata.theme.slice(1)}`}; + const currentThemePath = this.props.metadata?.theme && Themes[_.upperFirst(this.props.metadata.renderer)]?.hasOwnProperty(this.props.metadata?.theme) ? this.props.metadata.renderer : 'Brew'; + const currentTheme = mergedThemes[`${_.upperFirst(currentThemePath)}`]?.hasOwnProperty(this.props.metadata.theme) ? mergedThemes[`${_.upperFirst(currentThemePath)}`][this.props.metadata.theme] : { name: `!!! THEME MISSING !!! ID=${this.props.metadata.theme.slice(1)}`}; let dropdown; if(this.props.metadata.renderer == 'legacy') { From f830104531fea71747ff0764120e1a3e523aec67 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Wed, 17 Jul 2024 13:59:00 +1200 Subject: [PATCH 198/239] Use textContent instead of innerText --- themes/V3/5ePHB/snippets/tableOfContents.gen.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index b212dea36..3aea01735 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -35,7 +35,7 @@ const getTOC = (pages)=>{ const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC'); if(ToCExclude != 'exclude') { - recursiveAdd(heading.innerText.trim(), onPage, headerDepth.indexOf(heading.tagName), res); + recursiveAdd(heading.textContent.trim(), onPage, headerDepth.indexOf(heading.tagName), res); } }); return res; From d741878f78dd10761e8754b1bb15e4a2d9280bbd Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 19 Jul 2024 00:00:06 -0400 Subject: [PATCH 199/239] Also remove userthemes from Brew object in `sharePage` --- client/homebrew/pages/sharePage/sharePage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 8e589b2e7..ac2455696 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -99,7 +99,7 @@ const SharePage = createClass({ style={this.props.brew.style} renderer={this.props.brew.renderer} theme={this.props.brew.theme} - userThemes={this.props.brew.userThemes} + userThemes={this.props.userThemes} allowPrint={true} />
    From 0448f15322a91b143e1c7eb9d2fe87e6b31b4f58 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 19 Jul 2024 00:05:45 -0400 Subject: [PATCH 200/239] Classify user brews as V3 if they use V3 Each theme in the theme chain, including user brews, must use the same renderer. When moving to V4 or future versions, it will be important to distinguish which themes are compatible with each other --- client/homebrew/editor/metadataEditor/metadataEditor.jsx | 3 +-- server/homebrew.api.js | 8 +++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index a71b6cbc2..0eee308ff 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -192,7 +192,7 @@ const MetadataEditor = createClass({ renderThemeDropdown : function(){ if(!global.enable_themes) return; - const mergedThemes = { ...Themes, ...this.props.userThemes }; + const mergedThemes = _.merge(Themes, this.props.userThemes); const listThemes = (renderer)=>{ return _.map(_.values(mergedThemes[renderer]), (theme)=>{ @@ -230,7 +230,6 @@ const MetadataEditor = createClass({
    {/*listThemes('Legacy')*/} {listThemes('V3')} - {listThemes('Brew')} ; } diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 1709f4f46..747a83b55 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -55,16 +55,18 @@ const api = { 'thumbnail', 'textBin', 'text', - 'authors' + 'authors', + 'renderer' ]; const userThemes = {}; - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['meta:theme', 'meta:Theme'] }, renderer: { $ne: 'Legacy' } }); + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['meta:theme', 'meta:Theme'] }}); if(brews) { for (const brew of brews) { - userThemes[brew.shareId] = { + userThemes[brew.renderer] ??= {}; + userThemes[brew.renderer][brew.shareId] = { name : brew.title, renderer : brew.renderer, baseTheme : brew.theme, From 460358ce1fde3f140aaa0f4f556db9c8485c8bed Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 19 Jul 2024 00:09:21 -0400 Subject: [PATCH 201/239] Simplify some logic --- client/homebrew/editor/metadataEditor/metadataEditor.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 0eee308ff..5d6972e49 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -196,8 +196,8 @@ const MetadataEditor = createClass({ const listThemes = (renderer)=>{ return _.map(_.values(mergedThemes[renderer]), (theme)=>{ - const preview = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`; - const texture = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownTexture.png`; + const preview = theme.thumbnail || `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`; + const texture = theme.thumbnail || `/themes/${theme.renderer}/${theme.path}/dropdownTexture.png`; return
    this.handleTheme(theme)} title={''}>

    {`${theme?.author ? theme.author : renderer} : ${theme.name}`}

    From f364f054f8b73864964e6ef0392401012ae9648e Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 19 Jul 2024 01:33:56 -0400 Subject: [PATCH 202/239] restore `renderStyle` `renderStyle` is still necessary; it allows us to update the style live in the component render step as the user types into the style tab. Otherwise the style is only rendered once and never updates. React also discourages directly editing the DOM ourselves, because it makes changes to the DOM that react cannot track; we should aim to provide all DOM writes inside of the component render function instead of using `document.createElement`, etc. Too that end, this commit reduces the `loadAllStylesAndSnippets` function to just fetch and parse the data; actual rendering is moved back to `renderStyle()` --- client/homebrew/brewRenderer/brewRenderer.jsx | 45 +++++++------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index fa17dfee2..fce84b5f7 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -69,6 +69,7 @@ const BrewRenderer = (props)=>{ height : PAGE_HEIGHT, isMounted : false, visibility : 'hidden', + themeBundle : {} }); const mainRef = useRef(null); @@ -128,6 +129,11 @@ const BrewRenderer = (props)=>{
    ; }; + const renderStyle = ()=>{ + const cleanStyle = props.style; //DOMPurify.sanitize(props.style, purifyConfig); + return
    ${cleanStyle} ` }} />; + }; + const renderPage = (pageText, index)=>{ if(props.renderer == 'legacy') { const html = MarkdownLegacy.render(pageText); @@ -167,39 +173,17 @@ const BrewRenderer = (props)=>{ } }; + // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected const loadAllBrewStylesAndSnippets = ()=>{ - /* - Loads the theme bundle and parses it out. - These functionally replaces the previous renderStyles() function but needs to wait until the window is mounted. - */ const rendererPath = isStaticTheme(props.renderer, props.theme) ? `/${props.renderer}/` : '/'; - // Check for a User or Static Theme to change the endpoint path + + // Load the themeBundle from the endpoint as an object fetch(`${window.location.protocol}//${window.location.host}/theme${rendererPath}${props.theme}`).then((response)=>response.json()).then((themeBundle)=>{ - // Load the themeBundle from the endpoint as an object. - const documentFrame = document.getElementById('BrewRenderer'); - const iframeDocument = documentFrame.contentDocument || documentFrame.contentWindow.document; - // Find the brew frame Document root. - - for (let style=0; style < themeBundle.styles.length; style++){ - /* - Walk through the styles array on the Theme Bundle. - Create a new style node and add it to the Brew Frame - */ - const newStyles = document.createElement('style'); - newStyles.appendChild(document.createTextNode(`${themeBundle.styles[style]}\n`)); - iframeDocument.head.appendChild(newStyles); - - } - /* - Add the local brew styling to the Brew Frame - */ - const newStyles = document.createElement('style'); - const cleanStyle = props.style; //DOMPurify.sanitize(props.style, purifyConfig); - - newStyles.appendChild(document.createTextNode(`/* Local Brew Styling */\n\n${cleanStyle}`)); - iframeDocument.head.appendChild(newStyles); - - // TO-DO - Walk the snippets returns and add them to the appropriate menu. + themeBundle.joinedStyles = themeBundle.styles.map(style => ``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); + setState((prevState)=>({ + ...prevState, + themeBundle : themeBundle + })); }); }; @@ -260,6 +244,7 @@ const BrewRenderer = (props)=>{ {state.isMounted && <> + {renderStyle()}
    {renderPages()}
    From 0a5ff213de4c90ecf3462dfe970d9f7c3bad64e5 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 20 Jul 2024 11:39:23 -0400 Subject: [PATCH 203/239] use same theme endpoint for user and static themes `getThemeBundle()` rework no longer needs two separate endpoints --- client/homebrew/brewRenderer/brewRenderer.jsx | 5 +---- server/app.js | 3 --- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index fce84b5f7..baea64d3d 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -175,10 +175,7 @@ const BrewRenderer = (props)=>{ // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected const loadAllBrewStylesAndSnippets = ()=>{ - const rendererPath = isStaticTheme(props.renderer, props.theme) ? `/${props.renderer}/` : '/'; - - // Load the themeBundle from the endpoint as an object - fetch(`${window.location.protocol}//${window.location.host}/theme${rendererPath}${props.theme}`).then((response)=>response.json()).then((themeBundle)=>{ + fetch(`${window.location.protocol}//${window.location.host}/theme/${props.renderer}/${props.theme}`).then((response)=>response.json()).then((themeBundle)=>{ themeBundle.joinedStyles = themeBundle.styles.map(style => ``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); setState((prevState)=>({ ...prevState, diff --git a/server/app.js b/server/app.js index 2d0e1b16d..62976ade6 100644 --- a/server/app.js +++ b/server/app.js @@ -78,9 +78,6 @@ app.get('/robots.txt', (req, res)=>{ }); // Theme -// Path for User Themes -app.get('/theme/:id', asyncHandler(getThemeBundle)); -// Path for Static Themes app.get('/theme/:renderer/:id', asyncHandler(getThemeBundle)); //Home page From 45f7080afd1744624d34efb78e9d925ad52a0bec Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 21 Jul 2024 16:25:24 -0400 Subject: [PATCH 204/239] Move `loadAllBrewStylesAndSnippets` to the parent page component Themes contain both CSS and Snippets. The brewRenderer only cares about the CSS, but other components need the Snippets. Better to have the parent "editPage", etc. load the theme bundles and pass them down to each child that needs it, rather than trying to pass from the child up. This also fixes the `metadataEditor.jsx` not being able to change themes live; A new theme bundle is now loaded when a new theme is selected, instead of only the first time the BrewRenderer mounts. Also renamed to "fetchThemeBundle" --- client/homebrew/brewRenderer/brewRenderer.jsx | 16 ++----------- .../editor/metadataEditor/metadataEditor.jsx | 2 +- client/homebrew/pages/editPage/editPage.jsx | 24 ++++++++++++++++--- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index baea64d3d..c01182d7b 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -61,6 +61,7 @@ const BrewRenderer = (props)=>{ lang : '', errors : [], currentEditorPage : 0, + themeBundle : {}, ...props }; @@ -69,7 +70,6 @@ const BrewRenderer = (props)=>{ height : PAGE_HEIGHT, isMounted : false, visibility : 'hidden', - themeBundle : {} }); const mainRef = useRef(null); @@ -131,7 +131,7 @@ const BrewRenderer = (props)=>{ const renderStyle = ()=>{ const cleanStyle = props.style; //DOMPurify.sanitize(props.style, purifyConfig); - return
    ${cleanStyle} ` }} />; + return
    ${cleanStyle} ` }} />; }; const renderPage = (pageText, index)=>{ @@ -173,19 +173,7 @@ const BrewRenderer = (props)=>{ } }; - // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected - const loadAllBrewStylesAndSnippets = ()=>{ - fetch(`${window.location.protocol}//${window.location.host}/theme/${props.renderer}/${props.theme}`).then((response)=>response.json()).then((themeBundle)=>{ - themeBundle.joinedStyles = themeBundle.styles.map(style => ``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); - setState((prevState)=>({ - ...prevState, - themeBundle : themeBundle - })); - }); - }; - const frameDidMount = ()=>{ //This triggers when iFrame finishes internal "componentDidMount" - loadAllBrewStylesAndSnippets(); // Load the brew's inherited and local styles. setTimeout(()=>{ //We still see a flicker where the style isn't applied yet, so wait 100ms before showing iFrame updateSize(); window.addEventListener('resize', updateSize); diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 5d6972e49..2ccf5c440 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -111,7 +111,7 @@ const MetadataEditor = createClass({ handleTheme : function(theme){ this.props.metadata.renderer = theme.renderer; this.props.metadata.theme = theme.path; - this.props.onChange(this.props.metadata); + this.props.onChange(this.props.metadata, "theme"); }, handleLanguage : function(languageCode){ diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index a67129ca3..1c6fe1620 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -55,7 +55,8 @@ const EditPage = createClass({ autoSaveWarning : false, unsavedTime : new Date(), currentEditorPage : 0, - displayLockMessage : this.props.brew.lock || false + displayLockMessage : this.props.brew.lock || false, + themeBundle : {} }; }, @@ -87,6 +88,8 @@ const EditPage = createClass({ htmlErrors : Markdown.validate(prevState.brew.text) })); + this.fetchThemeBundle(this.props.brew.renderer, this.props.brew.theme); + document.addEventListener('keydown', this.handleControlKeys); }, componentWillUnmount : function() { @@ -130,7 +133,10 @@ const EditPage = createClass({ }), ()=>{if(this.state.autoSave) this.trySave();}); }, - handleMetaChange : function(metadata){ + handleMetaChange : function(metadata, field=undefined){ + if(field == "theme") // Fetch theme bundle only if theme was changed + this.fetchThemeBundle(metadata.renderer, metadata.theme); + this.setState((prevState)=>({ brew : { ...prevState.brew, @@ -138,13 +144,24 @@ const EditPage = createClass({ }, isPending : true, }), ()=>{if(this.state.autoSave) this.trySave();}); - }, hasChanges : function(){ return !_.isEqual(this.state.brew, this.savedBrew); }, + // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected + fetchThemeBundle : function(renderer, theme) { + fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ + themeBundle.joinedStyles = themeBundle.styles.map(style => ``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); + this.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT + ...prevState, + themeBundle : themeBundle + })); + }); + + }, + trySave : function(immediate=false){ if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); if(this.hasChanges()){ @@ -413,6 +430,7 @@ const EditPage = createClass({ style={this.state.brew.style} renderer={this.state.brew.renderer} theme={this.state.brew.theme} + themeBundle={this.state.themeBundle} errors={this.state.htmlErrors} lang={this.state.brew.lang} userThemes={this.props.userThemes} From c0123b96eb018975ceb2b37740628fa1b20556a4 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Mon, 22 Jul 2024 02:44:41 -0400 Subject: [PATCH 205/239] Support snippet compilation Original handling of snippets only worked if the current selected theme was a staticTheme. This now fully merges all snippets through the theme chain no matter what the top-level theme is. So user themes built on 5ePHB can benefit from 5ePHB snippets too. User input of user snippets will be a later PR, but merging them into static snippets is now supported. --- client/homebrew/editor/editor.jsx | 1 + .../homebrew/editor/snippetbar/snippetbar.jsx | 44 ++++++++----------- client/homebrew/pages/editPage/editPage.jsx | 1 + server/homebrew.api.js | 5 ++- 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/client/homebrew/editor/editor.jsx b/client/homebrew/editor/editor.jsx index a766572a2..cb5d122f1 100644 --- a/client/homebrew/editor/editor.jsx +++ b/client/homebrew/editor/editor.jsx @@ -425,6 +425,7 @@ const Editor = createClass({ historySize={this.historySize()} currentEditorTheme={this.state.editorTheme} updateEditorTheme={this.updateEditorTheme} + snippetBundle={this.props.snippetBundle} cursorPos={this.codeEditor.current?.getCursorPosition() || {}} /> {this.renderEditor()} diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index 445ca2748..34687f020 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -6,9 +6,6 @@ const _ = require('lodash'); const cx = require('classnames'); //Import all themes - -const Themes = require('themes/themes.json'); - const ThemeSnippets = {}; ThemeSnippets['Legacy_5ePHB'] = require('themes/Legacy/5ePHB/snippets.js'); ThemeSnippets['V3_5ePHB'] = require('themes/V3/5ePHB/snippets.js'); @@ -40,7 +37,8 @@ const Snippetbar = createClass({ foldCode : ()=>{}, unfoldCode : ()=>{}, updateEditorTheme : ()=>{}, - cursorPos : {} + cursorPos : {}, + snippetBundle : [] }; }, @@ -53,21 +51,15 @@ const Snippetbar = createClass({ }, componentDidMount : async function() { - const rendererPath = this.props.renderer == 'V3' ? 'V3' : 'Legacy'; - const themePath = this.props.theme ?? '5ePHB'; - let snippets = _.cloneDeep(ThemeSnippets[`${rendererPath}_${themePath}`]); - snippets = this.compileSnippets(rendererPath, themePath, snippets); + let snippets = this.compileSnippets(); this.setState({ snippets : snippets }); }, componentDidUpdate : async function(prevProps) { - if(prevProps.renderer != this.props.renderer || prevProps.theme != this.props.theme) { - const rendererPath = this.props.renderer == 'V3' ? 'V3' : 'Legacy'; - const themePath = this.props.theme ?? '5ePHB'; - let snippets = _.cloneDeep(ThemeSnippets[`${rendererPath}_${themePath}`]); - snippets = this.compileSnippets(rendererPath, themePath, snippets); + if(prevProps.renderer != this.props.renderer || prevProps.theme != this.props.theme || prevProps.snippetBundle != this.props.snippetBundle) { + let snippets = this.compileSnippets(); this.setState({ snippets : snippets }); @@ -75,26 +67,26 @@ const Snippetbar = createClass({ }, - mergeCustomizer : function(valueA, valueB, key) { + mergeCustomizer : function(oldValue, newValue, key) { if(key == 'snippets') { - const result = _.reverse(_.unionBy(_.reverse(valueB), _.reverse(valueA), 'name')); // Join snippets together, with preference for the current theme over the base theme + const result = _.reverse(_.unionBy(_.reverse(newValue), _.reverse(oldValue), 'name')); // Join snippets together, with preference for the child theme over the parent theme return _.filter(result, 'gen'); //Only keep snippets with a 'gen' property. } }, - compileSnippets : function(rendererPath, themePath, snippets) { - let compiledSnippets = snippets; - const baseSnippetsPath = themePath && (Themes[rendererPath].hasOwnProperty(themePath)) ? Themes[rendererPath][themePath].baseSnippets : false; + compileSnippets : function() { + let compiledSnippets = []; - const objB = _.keyBy(compiledSnippets, 'groupName'); + let oldSnippets = _.keyBy(compiledSnippets, 'groupName'); + + for (let snippets of this.props.snippetBundle) { + if (typeof(snippets) == "string") // load staticThemes as needed; they were sent as just a file name + snippets = ThemeSnippets[snippets]; - if(baseSnippetsPath) { - const objA = _.keyBy(_.cloneDeep(ThemeSnippets[`${rendererPath}_${baseSnippetsPath}`]), 'groupName'); - compiledSnippets = _.values(_.mergeWith(objA, objB, this.mergeCustomizer)); - compiledSnippets = this.compileSnippets(rendererPath, baseSnippetsPath, _.cloneDeep(compiledSnippets)); - } else { - const objA = _.keyBy(_.cloneDeep(ThemeSnippets[`${rendererPath}_Blank`]), 'groupName'); - compiledSnippets = _.values(_.mergeWith(objA, objB, this.mergeCustomizer)); + let newSnippets = _.keyBy(_.cloneDeep(snippets), 'groupName'); + compiledSnippets = _.values(_.mergeWith(oldSnippets, newSnippets, this.mergeCustomizer)); + + oldSnippets = _.keyBy(compiledSnippets, 'groupName'); } return compiledSnippets; }, diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 1c6fe1620..a36d272db 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -424,6 +424,7 @@ const EditPage = createClass({ reportError={this.errorReported} renderer={this.state.brew.renderer} userThemes={this.props.userThemes} + snippetBundle={this.state.themeBundle.snippets} /> Date: Mon, 22 Jul 2024 02:46:26 -0400 Subject: [PATCH 206/239] Lint --- .../editor/metadataEditor/metadataEditor.jsx | 4 ++-- client/homebrew/editor/snippetbar/snippetbar.jsx | 10 +++++----- client/homebrew/pages/editPage/editPage.jsx | 8 ++++---- server/homebrew.api.js | 5 ++--- server/homebrew.api.spec.js | 14 +++++++------- 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 2ccf5c440..0c5b56304 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -111,7 +111,7 @@ const MetadataEditor = createClass({ handleTheme : function(theme){ this.props.metadata.renderer = theme.renderer; this.props.metadata.theme = theme.path; - this.props.onChange(this.props.metadata, "theme"); + this.props.onChange(this.props.metadata, 'theme'); }, handleLanguage : function(languageCode){ @@ -212,7 +212,7 @@ const MetadataEditor = createClass({ }; const currentThemePath = this.props.metadata?.theme && Themes[_.upperFirst(this.props.metadata.renderer)]?.hasOwnProperty(this.props.metadata?.theme) ? this.props.metadata.renderer : 'Brew'; - const currentTheme = mergedThemes[`${_.upperFirst(currentThemePath)}`]?.hasOwnProperty(this.props.metadata.theme) ? mergedThemes[`${_.upperFirst(currentThemePath)}`][this.props.metadata.theme] : { name: `!!! THEME MISSING !!! ID=${this.props.metadata.theme.slice(1)}`}; + const currentTheme = mergedThemes[`${_.upperFirst(currentThemePath)}`]?.hasOwnProperty(this.props.metadata.theme) ? mergedThemes[`${_.upperFirst(currentThemePath)}`][this.props.metadata.theme] : { name: `!!! THEME MISSING !!! ID=${this.props.metadata.theme.slice(1)}` }; let dropdown; if(this.props.metadata.renderer == 'legacy') { diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index 34687f020..af493c961 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -51,7 +51,7 @@ const Snippetbar = createClass({ }, componentDidMount : async function() { - let snippets = this.compileSnippets(); + const snippets = this.compileSnippets(); this.setState({ snippets : snippets }); @@ -59,7 +59,7 @@ const Snippetbar = createClass({ componentDidUpdate : async function(prevProps) { if(prevProps.renderer != this.props.renderer || prevProps.theme != this.props.theme || prevProps.snippetBundle != this.props.snippetBundle) { - let snippets = this.compileSnippets(); + const snippets = this.compileSnippets(); this.setState({ snippets : snippets }); @@ -78,12 +78,12 @@ const Snippetbar = createClass({ let compiledSnippets = []; let oldSnippets = _.keyBy(compiledSnippets, 'groupName'); - + for (let snippets of this.props.snippetBundle) { - if (typeof(snippets) == "string") // load staticThemes as needed; they were sent as just a file name + if(typeof(snippets) == 'string') // load staticThemes as needed; they were sent as just a file name snippets = ThemeSnippets[snippets]; - let newSnippets = _.keyBy(_.cloneDeep(snippets), 'groupName'); + const newSnippets = _.keyBy(_.cloneDeep(snippets), 'groupName'); compiledSnippets = _.values(_.mergeWith(oldSnippets, newSnippets, this.mergeCustomizer)); oldSnippets = _.keyBy(compiledSnippets, 'groupName'); diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index a36d272db..f8040d5c3 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -134,9 +134,9 @@ const EditPage = createClass({ }, handleMetaChange : function(metadata, field=undefined){ - if(field == "theme") // Fetch theme bundle only if theme was changed + if(field == 'theme') // Fetch theme bundle only if theme was changed this.fetchThemeBundle(metadata.renderer, metadata.theme); - + this.setState((prevState)=>({ brew : { ...prevState.brew, @@ -153,13 +153,13 @@ const EditPage = createClass({ // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected fetchThemeBundle : function(renderer, theme) { fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ - themeBundle.joinedStyles = themeBundle.styles.map(style => ``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); + themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); this.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT ...prevState, themeBundle : themeBundle })); }); - + }, trySave : function(immediate=false){ diff --git a/server/homebrew.api.js b/server/homebrew.api.js index b8807a439..aa3eded0a 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -61,7 +61,7 @@ const api = { const userThemes = {}; - const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['meta:theme', 'meta:Theme'] }}); + const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['meta:theme', 'meta:Theme'] } }); if(brews) { for (const brew of brews) { @@ -269,7 +269,6 @@ const api = { const completeSnippets = []; while (req.params.id) { - console.log(`loading theme ID ${req.params.id}`) //=== User Themes ===// if(!isStaticTheme(req.params.renderer, req.params.id)) { await api.getBrew('share')(req, res, ()=>{}); @@ -282,7 +281,7 @@ const api = { req.params.id = currentTheme.theme; req.params.renderer = currentTheme.renderer; - } + } //=== Static Themes ===// else { const localSnippets = `${req.params.renderer}_${req.params.id}`; // Just log the name for loading on client diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 5eb8a407c..67f4abe5f 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -288,14 +288,14 @@ describe('Tests for api', ()=>{ textBin : undefined, version : undefined, userThemes : { - Brew: {} + Brew : {} }, - createdAt : undefined, - gDrive : false, - style : undefined, - trashed : false, - updatedAt : undefined, - views : 0 + createdAt : undefined, + gDrive : false, + style : undefined, + trashed : false, + updatedAt : undefined, + views : 0 }); expect(next).toHaveBeenCalled(); expect(api.getId).toHaveBeenCalledWith(req); From d640ad6bb7cde3a94c0320ae631013c404f35949 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Mon, 22 Jul 2024 19:13:38 -0500 Subject: [PATCH 207/239] Update Node version for Docker --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 82b13ac86..84652fbf9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18-alpine +FROM node:20-alpine RUN apk --no-cache add git ENV NODE_ENV=docker From 0b01f27d11a379c7a786d12f9231f472bbc3514b Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 23 Jul 2024 16:26:33 -0400 Subject: [PATCH 208/239] Load theme bundles on `/share` page --- client/homebrew/pages/sharePage/sharePage.jsx | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index ac2455696..90dc1959a 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -18,18 +18,38 @@ const SharePage = createClass({ displayName : 'SharePage', getDefaultProps : function() { return { - brew : DEFAULT_BREW_LOAD + brew : DEFAULT_BREW_LOAD, + themeBundle : {} + }; + }, + + getInitialState : function() { + return { + themeBundle : this.props.themeBundle }; }, componentDidMount : function() { document.addEventListener('keydown', this.handleControlKeys); + + this.fetchThemeBundle(this.props.brew.renderer, this.props.brew.theme); }, componentWillUnmount : function() { document.removeEventListener('keydown', this.handleControlKeys); }, + // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected + fetchThemeBundle : function(renderer, theme) { + fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ + themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); + this.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT + ...prevState, + themeBundle : themeBundle + })); + }); + }, + handleControlKeys : function(e){ if(!(e.ctrlKey || e.metaKey)) return; const P_KEY = 80; @@ -99,7 +119,7 @@ const SharePage = createClass({ style={this.props.brew.style} renderer={this.props.brew.renderer} theme={this.props.brew.theme} - userThemes={this.props.userThemes} + themeBundle={this.state.themeBundle} allowPrint={true} />
    From 22b6aa14f0e4882ac3c9a12ea97822c276e13e12 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 23 Jul 2024 16:43:23 -0400 Subject: [PATCH 209/239] Add to /new page --- client/homebrew/homebrew.jsx | 2 +- client/homebrew/pages/editPage/editPage.jsx | 2 -- client/homebrew/pages/newPage/newPage.jsx | 25 ++++++++++++++++--- client/homebrew/pages/sharePage/sharePage.jsx | 3 +-- server/app.js | 14 ++++++++++- 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index cd6de102d..1df417872 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -69,7 +69,7 @@ const Homebrew = createClass({ } /> } /> } /> - } /> + } /> } /> } /> } /> diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index f8040d5c3..e3e7990df 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -159,7 +159,6 @@ const EditPage = createClass({ themeBundle : themeBundle })); }); - }, trySave : function(immediate=false){ @@ -434,7 +433,6 @@ const EditPage = createClass({ themeBundle={this.state.themeBundle} errors={this.state.htmlErrors} lang={this.state.brew.lang} - userThemes={this.props.userThemes} currentEditorPage={this.state.currentEditorPage} allowPrint={true} /> diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 878896a06..4b223faa7 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -44,7 +44,8 @@ const NewPage = createClass({ saveGoogle : (global.account && global.account.googleId ? true : false), error : null, htmlErrors : Markdown.validate(brew.text), - currentEditorPage : 0 + currentEditorPage : 0, + themeBundle : {} }; }, @@ -77,6 +78,8 @@ const NewPage = createClass({ saveGoogle : (saveStorage == 'GOOGLE-DRIVE' && this.state.saveGoogle) }); + this.fetchThemeBundle(this.props.brew.renderer, this.props.brew.theme); + localStorage.setItem(BREWKEY, brew.text); if(brew.style) localStorage.setItem(STYLEKEY, brew.style); @@ -86,6 +89,17 @@ const NewPage = createClass({ document.removeEventListener('keydown', this.handleControlKeys); }, + // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected + fetchThemeBundle : function(renderer, theme) { + fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ + themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); + this.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT + ...prevState, + themeBundle : themeBundle + })); + }); + }, + handleControlKeys : function(e){ if(!(e.ctrlKey || e.metaKey)) return; const S_KEY = 83; @@ -122,7 +136,10 @@ const NewPage = createClass({ localStorage.setItem(STYLEKEY, style); }, - handleMetaChange : function(metadata){ + handleMetaChange : function(metadata, field=undefined){ + if(field == 'theme') // Fetch theme bundle only if theme was changed + this.fetchThemeBundle(metadata.renderer, metadata.theme); + this.setState((prevState)=>({ brew : { ...prevState.brew, ...metadata }, }), ()=>{ @@ -157,7 +174,7 @@ const NewPage = createClass({ .catch((err)=>{ this.setState({ isSaving: false, error: err }); }); - if(!res) return; + if(!res) return; brew = res.body; localStorage.removeItem(BREWKEY); @@ -217,9 +234,9 @@ const NewPage = createClass({ style={this.state.brew.style} renderer={this.state.brew.renderer} theme={this.state.brew.theme} + themeBundle={this.state.themeBundle} errors={this.state.htmlErrors} lang={this.state.brew.lang} - userThemes={this.props.userThemes} currentEditorPage={this.state.currentEditorPage} allowPrint={true} /> diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 90dc1959a..c1f044d2d 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -19,13 +19,12 @@ const SharePage = createClass({ getDefaultProps : function() { return { brew : DEFAULT_BREW_LOAD, - themeBundle : {} }; }, getInitialState : function() { return { - themeBundle : this.props.themeBundle + themeBundle : {} }; }, diff --git a/server/app.js b/server/app.js index 62976ade6..5d3e74925 100644 --- a/server/app.js +++ b/server/app.js @@ -286,7 +286,7 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), asyncHandler(async(req, res, return next(); })); -//New Page +//New Page from ID app.get('/new/:id', asyncHandler(getBrew('share')), asyncHandler(async(req, res, next)=>{ sanitizeBrew(req.brew, 'share'); splitTextStyleAndMetadata(req.brew); @@ -311,6 +311,18 @@ app.get('/new/:id', asyncHandler(getBrew('share')), asyncHandler(async(req, res, return next(); })); +//New Page +app.get('/new', asyncHandler(async(req, res, next)=>{ + req.userThemes = await(getUsersBrewThemes(req.account?.username)); + + req.ogMeta = { ...defaultMetaTags, + title : 'New', + description : 'Start crafting your homebrew on the Homebrewery!' + }; + + return next(); +})); + //Share Page app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, res, next)=>{ const { brew } = req; From ac82e3ecb2545088590d63846c3160be1edd680b Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 23 Jul 2024 16:50:29 -0400 Subject: [PATCH 210/239] Add to home page --- client/homebrew/pages/homePage/homePage.jsx | 19 ++++++++++++++++++- server/app.js | 3 ++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index 1aa816df2..0609d5b8b 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -34,12 +34,28 @@ const HomePage = createClass({ brew : this.props.brew, welcomeText : this.props.brew.text, error : undefined, - currentEditorPage : 0 + currentEditorPage : 0, + themeBundle : {} }; }, editor : React.createRef(null), + componentDidMount : function() { + this.fetchThemeBundle(this.props.brew.renderer, this.props.brew.theme); + }, + + // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected + fetchThemeBundle : function(renderer, theme) { + fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ + themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); + this.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT + ...prevState, + themeBundle : themeBundle + })); + }); + }, + handleSave : function(){ request.post('/api') .send(this.state.brew) @@ -95,6 +111,7 @@ const HomePage = createClass({ style={this.state.brew.style} renderer={this.state.brew.renderer} currentEditorPage={this.state.currentEditorPage} + themeBundle={this.state.themeBundle} />
    diff --git a/server/app.js b/server/app.js index 5d3e74925..0de404c1e 100644 --- a/server/app.js +++ b/server/app.js @@ -84,7 +84,8 @@ app.get('/theme/:renderer/:id', asyncHandler(getThemeBundle)); app.get('/', (req, res, next)=>{ req.brew = { text : welcomeText, - renderer : 'V3' + renderer : 'V3', + theme : '5ePHB' }, req.ogMeta = { ...defaultMetaTags, From 27c52fc244671931f9d4ebd27f0b049ea8c05c3e Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 23 Jul 2024 17:11:48 -0400 Subject: [PATCH 211/239] Fix loading CSS for Legacy --- client/homebrew/editor/metadataEditor/metadataEditor.jsx | 2 +- client/homebrew/pages/editPage/editPage.jsx | 2 +- client/homebrew/pages/newPage/newPage.jsx | 2 +- server/app.js | 3 ++- server/homebrew.api.js | 4 +--- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 0c5b56304..473b2ab69 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -99,7 +99,7 @@ const MetadataEditor = createClass({ if(renderer == 'legacy') this.props.metadata.theme = '5ePHB'; } - this.props.onChange(this.props.metadata); + this.props.onChange(this.props.metadata, 'renderer'); }, handlePublish : function(val){ this.props.onChange({ diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index e3e7990df..05bd79d4d 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -134,7 +134,7 @@ const EditPage = createClass({ }, handleMetaChange : function(metadata, field=undefined){ - if(field == 'theme') // Fetch theme bundle only if theme was changed + if(field == 'theme' || field == 'renderer') // Fetch theme bundle only if theme or renderer was changed this.fetchThemeBundle(metadata.renderer, metadata.theme); this.setState((prevState)=>({ diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 4b223faa7..e8c2636b0 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -137,7 +137,7 @@ const NewPage = createClass({ }, handleMetaChange : function(metadata, field=undefined){ - if(field == 'theme') // Fetch theme bundle only if theme was changed + if(field == 'theme' || field == 'renderer') // Fetch theme bundle only if theme or renderer was changed this.fetchThemeBundle(metadata.renderer, metadata.theme); this.setState((prevState)=>({ diff --git a/server/app.js b/server/app.js index 0de404c1e..8ad35ca35 100644 --- a/server/app.js +++ b/server/app.js @@ -101,7 +101,8 @@ app.get('/', (req, res, next)=>{ app.get('/legacy', (req, res, next)=>{ req.brew = { text : welcomeTextLegacy, - renderer : 'legacy' + renderer : 'legacy', + theme : '5ePHB' }, req.ogMeta = { ...defaultMetaTags, diff --git a/server/homebrew.api.js b/server/homebrew.api.js index aa3eded0a..0b6218597 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -8,8 +8,6 @@ const Markdown = require('../shared/naturalcrit/markdown.js'); const yaml = require('js-yaml'); const asyncHandler = require('express-async-handler'); const { nanoid } = require('nanoid'); -const path = require('path'); -const fs = require('fs'); const { splitTextStyleAndMetadata } = require('../shared/helpers.js'); const { DEFAULT_BREW, DEFAULT_BREW_LOAD } = require('./brewDefaults.js'); @@ -263,7 +261,7 @@ const api = { req.params.renderer: This is the Markdown+ version for the static theme. If a User theme the value will come from the User Theme metadata. */ - + req.params.renderer = _.upperFirst(req.params.renderer); let currentTheme; const completeStyles = []; const completeSnippets = []; From 82f73fb21d42581baf3b3b65074f8f9ad3108dac Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 23 Jul 2024 17:24:50 -0400 Subject: [PATCH 212/239] cleanup --- client/homebrew/brewRenderer/brewRenderer.jsx | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index c01182d7b..cdbbfc157 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -18,12 +18,6 @@ const { printCurrentBrew } = require('../../../shared/helpers.js'); const DOMPurify = require('dompurify'); const purifyConfig = { FORCE_BODY: true, SANITIZE_DOM: false }; -const staticThemes = require('themes/themes.json'); - -const isStaticTheme = (renderer, themeName)=>{ - return staticThemes[renderer]?.[themeName] !== undefined; -}; - const PAGE_HEIGHT = 1056; const INITIAL_CONTENT = dedent` @@ -191,12 +185,6 @@ const BrewRenderer = (props)=>{ document.dispatchEvent(new MouseEvent('click')); }; - let rendererPath = ''; - const themePath = props.theme; - - if(staticThemes[_.upperFirst(props.renderer)]?.[props.theme] !== undefined) //Change CSS path if is staticTheme - rendererPath = `${_.upperFirst(props.renderer)}/`; - return ( <> {/*render dummy page while iFrame is mounting.*/} From ddc569377825d1582172fcbf71dd55a82cc47b8a Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 23 Jul 2024 17:31:07 -0400 Subject: [PATCH 213/239] revert package-lock --- package-lock.json | 2219 +++++++++++++++++++++++++++++---------------- 1 file changed, 1452 insertions(+), 767 deletions(-) diff --git a/package-lock.json b/package-lock.json index 556854e7a..cce4d5577 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,13 +67,22 @@ "npm": "^10.2.x" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -128,6 +137,11 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, "node_modules/@babel/generator": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", @@ -142,6 +156,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", @@ -219,9 +246,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -770,12 +797,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1797,9 +1824,9 @@ "dev": true }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz", - "integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.1.tgz", + "integrity": "sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA==", "dev": true, "funding": [ { @@ -1815,13 +1842,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.3.1" + "@csstools/css-tokenizer": "^2.2.0" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz", - "integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.0.tgz", + "integrity": "sha512-wErmsWCbsmig8sQKkM6pFhr/oPha1bHfvxsUY5CYSQxwyhA9Ulrs8EqCgClhg4Tgg2XapVstGqSVcz0xOYizZA==", "dev": true, "funding": [ { @@ -1838,9 +1865,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz", - "integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.4.tgz", + "integrity": "sha512-V/OUXYX91tAC1CDsiY+HotIcJR+vPtzrX8pCplCpT++i8ThZZsq5F5dzZh/bDM3WUOjrvC1ljed1oSJxMfjqhw==", "dev": true, "funding": [ { @@ -1856,14 +1883,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.3", - "@csstools/css-tokenizer": "^2.3.1" + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0" } }, "node_modules/@csstools/selector-specificity": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz", - "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", + "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", "dev": true, "funding": [ { @@ -1898,9 +1925,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1930,9 +1957,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2004,9 +2031,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -2637,6 +2664,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2746,22 +2779,21 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "engines": { "node": ">=6.0.0" } @@ -2775,9 +2807,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -2846,9 +2878,9 @@ "dev": true }, "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" @@ -2864,9 +2896,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2877,18 +2909,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -2896,72 +2928,81 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } + "version": "18.15.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz", + "integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==", + "dev": true }, "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, "node_modules/@types/webidl-conversions": { @@ -2978,31 +3019,31 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", - "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3010,12 +3051,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", - "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3023,22 +3064,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", - "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3059,10 +3100,22 @@ "balanced-match": "^1.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -3075,10 +3128,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -3086,39 +3142,81 @@ "node": ">=10" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", - "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/typescript-estree": "7.10.0" + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", - "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.10.0", - "eslint-visitor-keys": "^3.4.3" + "yallist": "^4.0.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3131,6 +3229,11 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -3144,9 +3247,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -3194,9 +3297,9 @@ } }, "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dependencies": { "debug": "^4.3.4" }, @@ -3373,24 +3476,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flatmap": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", @@ -3459,28 +3544,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, "node_modules/asn1.js/node_modules/bn.js": { @@ -3489,12 +3566,25 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/assert": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", - "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dependencies": { - "object.assign": "^4.1.4", - "util": "^0.10.4" + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dependencies": { + "inherits": "2.0.1" } }, "node_modules/assign-symbols": { @@ -3515,9 +3605,9 @@ } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "node_modules/async-each": { "version": "1.0.6", @@ -3708,12 +3798,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { @@ -3733,11 +3823,11 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3815,16 +3905,47 @@ "node": ">=0.10.0" } }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "kind-of": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/base64-js": { @@ -3855,14 +3976,11 @@ } }, "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bindings": { @@ -3956,6 +4074,33 @@ "browser-pack": "bin/cmd.js" } }, + "node_modules/browser-pack/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/browser-pack/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/browser-pack/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/browser-pack/node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -4078,23 +4223,22 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", - "readable-stream": "^2.3.8", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", "safe-buffer": "^5.2.1" }, "engines": { - "node": ">= 0.12" + "node": ">= 4" } }, "node_modules/browserify-zlib": { @@ -4110,6 +4254,33 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, + "node_modules/browserify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/browserify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/browserify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/browserify/node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -4307,9 +4478,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001620", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz", - "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==", + "version": "1.0.30001599", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", + "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", "funding": [ { "type": "opencollective", @@ -4348,9 +4519,15 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4363,9 +4540,6 @@ "engines": { "node": ">= 8.10.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -4382,9 +4556,9 @@ } }, "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, "funding": [ { @@ -4406,9 +4580,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/class-utils": { @@ -4455,9 +4629,9 @@ } }, "node_modules/codemirror": { - "version": "5.65.16", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", - "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==" + "version": "5.65.12", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.12.tgz", + "integrity": "sha512-z2jlHBocElRnPYysN2HAuhXbO3DNB0bcSKmNz3hcWR2Js2Dkhc1bEOxG93Z3DeUrnm+qx56XOY5wQmbP5KY0sw==" }, "node_modules/collect-v8-coverage": { "version": "1.0.2", @@ -4532,12 +4706,9 @@ } }, "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "node_modules/concat-map": { "version": "0.0.1", @@ -4558,6 +4729,33 @@ "typedarray": "^0.0.6" } }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -4588,9 +4786,10 @@ } }, "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "node_modules/cookie": { "version": "0.4.1", @@ -4642,9 +4841,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", "dependencies": { "browserslist": "^4.23.0" }, @@ -4659,14 +4858,14 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, "dependencies": { - "import-fresh": "^3.3.0", + "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", + "parse-json": "^5.0.0", "path-type": "^4.0.0" }, "engines": { @@ -4674,14 +4873,6 @@ }, "funding": { "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, "node_modules/create-ecdh": { @@ -4859,9 +5050,9 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", - "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", + "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", "dev": true, "engines": { "node": ">=12 || >=16" @@ -5019,9 +5210,9 @@ } }, "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -5035,8 +5226,7 @@ "node_modules/dedent-tabs": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/dedent-tabs/-/dedent-tabs-0.10.3.tgz", - "integrity": "sha512-RYq1ewj+FDOEKxjhU9a2xwSJX+ODruTeIcMwt3KVAuUpOGFLDzmQWU3ByXRLVFHYAg584gcYSv1k+KheoLExsw==", - "deprecated": "The dedent package is maintained again, so this one isn't necessary anymore. Please use dedent again. All features from this package should now be included." + "integrity": "sha512-RYq1ewj+FDOEKxjhU9a2xwSJX+ODruTeIcMwt3KVAuUpOGFLDzmQWU3ByXRLVFHYAg584gcYSv1k+KheoLExsw==" }, "node_modules/deep-is": { "version": "0.1.4", @@ -5073,6 +5263,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -5134,6 +5325,33 @@ "deps-sort": "bin/cmd.js" } }, + "node_modules/deps-sort/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/deps-sort/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/deps-sort/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/deps-sort/node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -5144,9 +5362,9 @@ } }, "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -5265,6 +5483,33 @@ "readable-stream": "^2.0.2" } }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -5279,14 +5524,14 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.775", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.775.tgz", - "integrity": "sha512-JpOfl1aNAiZ88wFzjPczTLwYIoPIsij8S9/XQH9lqMpiJOf23kxea68B8wje4f68t4rOIq4Bh+vP4I65njiJBw==" + "version": "1.4.711", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.711.tgz", + "integrity": "sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==" }, "node_modules/elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -5505,9 +5750,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { "node": ">=6" } @@ -5756,9 +6001,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -6102,16 +6347,47 @@ "node": ">=0.10.0" } }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "kind-of": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/fast-deep-equal": { @@ -6121,9 +6397,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6175,9 +6451,9 @@ } }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -6268,9 +6544,9 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { "flatted": "^3.2.9", @@ -6278,13 +6554,13 @@ "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/for-each": { @@ -6376,9 +6652,9 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, "optional": true, "os": [ @@ -6424,24 +6700,23 @@ } }, "node_modules/gaxios": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.6.0.tgz", - "integrity": "sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz", + "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==", "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" + "node-fetch": "^2.6.9" }, "engines": { "node": ">=14" } }, "node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.0.0.tgz", + "integrity": "sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==", "dependencies": { "gaxios": "^6.0.0", "json-bigint": "^1.0.0" @@ -6603,6 +6878,15 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, + "node_modules/global-prefix/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -6624,13 +6908,12 @@ } }, "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -6666,29 +6949,46 @@ "dev": true }, "node_modules/google-auth-library": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.10.0.tgz", - "integrity": "sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.0.0.tgz", + "integrity": "sha512-IQGjgQoVUAfOk6khqTVMLvWx26R+yPw9uLyb1MNyMQpdKiKt0Fd9sp4NWoINjyGHR8S3iw12hMTYK7O8J07c6Q==", "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", + "gaxios": "^6.0.0", + "gcp-metadata": "^6.0.0", "gtoken": "^7.0.0", - "jws": "^4.0.0" + "jws": "^4.0.0", + "lru-cache": "^6.0.0" }, "engines": { "node": ">=14" } }, + "node_modules/google-auth-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-auth-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/googleapis-common": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-7.2.0.tgz", - "integrity": "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-7.0.0.tgz", + "integrity": "sha512-58iSybJPQZ8XZNMpjrklICefuOuyJ0lMxfKmBqmaC0/xGT4SiOs4BE60LAOOGtBURy1n8fHa2X2YUNFEWWbXyQ==", "dependencies": { "extend": "^3.0.2", "gaxios": "^6.0.3", - "google-auth-library": "^9.7.0", + "google-auth-library": "^9.0.0", "qs": "^6.7.0", "url-template": "^2.0.8", "uuid": "^9.0.0" @@ -6720,9 +7020,9 @@ "dev": true }, "node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.0.1.tgz", + "integrity": "sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==", "dependencies": { "gaxios": "^6.0.0", "jws": "^4.0.0" @@ -6741,9 +7041,12 @@ } }, "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, "engines": { "node": ">= 0.4.0" } @@ -6860,24 +7163,14 @@ "node": ">=0.10.0" } }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "engines": { "node": ">=4" @@ -6998,9 +7291,9 @@ "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -7049,9 +7342,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -7162,9 +7455,9 @@ } }, "node_modules/inline-source-map": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.3.tgz", - "integrity": "sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", "dependencies": { "source-map": "~0.5.3" } @@ -7197,6 +7490,33 @@ "insert-module-globals": "bin/cmd.js" } }, + "node_modules/insert-module-globals/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/insert-module-globals/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/insert-module-globals/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/insert-module-globals/node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -7229,14 +7549,25 @@ } }, "node_modules/is-accessor-descriptor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", - "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dependencies": { - "hasown": "^2.0.0" + "kind-of": "^3.0.2" }, "engines": { - "node": ">= 0.10" + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/is-array-buffer": { @@ -7344,14 +7675,25 @@ } }, "node_modules/is-data-descriptor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", - "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dependencies": { - "hasown": "^2.0.0" + "kind-of": "^3.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/is-data-view": { @@ -7385,15 +7727,24 @@ } }, "node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/is-extendable": { @@ -7533,10 +7884,12 @@ } }, "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, "engines": { "node": ">=0.10.0" } @@ -7694,10 +8047,9 @@ } }, "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", @@ -7714,23 +8066,23 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", + "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", "dev": true, "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, @@ -7738,11 +8090,26 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -7750,6 +8117,12 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -7800,9 +8173,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -9049,11 +9422,26 @@ "node": ">=8" } }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -9073,6 +9461,12 @@ "node": ">=8" } }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -9508,15 +9902,13 @@ } }, "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" }, "engines": { "node": ">=4.0" @@ -9567,9 +9959,12 @@ } }, "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { "node": ">=0.10.0" } @@ -9770,11 +10165,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -9782,6 +10192,12 @@ "node": ">=10" } }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -9957,6 +10373,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -10106,6 +10531,24 @@ "node": ">= 6" } }, + "node_modules/minimist-options/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minimist-options/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -10129,17 +10572,6 @@ "node": ">=0.10.0" } }, - "node_modules/mixin-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -10173,6 +10605,33 @@ "node": ">= 0.8.0" } }, + "node_modules/module-deps/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/module-deps/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/module-deps/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/module-deps/node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -10199,37 +10658,6 @@ "whatwg-url": "^13.0.0" } }, - "node_modules/mongodb-connection-string-url/node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/mongoose": { "version": "8.4.5", "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.5.tgz", @@ -10383,9 +10811,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nan": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", - "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", "optional": true }, "node_modules/nanoid": { @@ -10444,16 +10872,39 @@ "node": ">=0.10.0" } }, - "node_modules/nanomatch/node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "node_modules/nanomatch/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "kind-of": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/nanomatch/node_modules/is-extendable": { @@ -10467,13 +10918,10 @@ "node": ">=0.10.0" } }, - "node_modules/nanomatch/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "engines": { "node": ">=0.10.0" } @@ -10531,6 +10979,14 @@ "node": ">=10" } }, + "node_modules/nconf/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -10558,6 +11014,25 @@ } } }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -10570,9 +11045,9 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.21.tgz", + "integrity": "sha512-djN/n2549DUtY33S7o1djRCd7dEm0kBnj9c7S9XVXqRUbuggN1MZH/Nqa+5RFQr63Fbefq37nFXAE9VU86yL1A==", "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", @@ -10612,6 +11087,20 @@ "semver": "bin/semver" } }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -10627,11 +11116,26 @@ "node": ">=10" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -10639,6 +11143,12 @@ "node": ">=10" } }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -10703,6 +11213,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -10722,6 +11233,7 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -10847,17 +11359,17 @@ } }, "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -10946,19 +11458,15 @@ } }, "node_modules/parse-asn1": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "node_modules/parse-json": { @@ -11074,9 +11582,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -11189,9 +11697,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -11208,9 +11716,9 @@ } ], "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -11257,9 +11765,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -11285,9 +11793,9 @@ "dev": true }, "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, "funding": [ { @@ -11420,17 +11928,17 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz", + "integrity": "sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w==", "dev": true, "funding": [ { @@ -11457,6 +11965,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", @@ -11570,9 +12087,9 @@ } }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "node_modules/react-router": { @@ -11613,6 +12130,33 @@ "readable-stream": "^2.0.2" } }, + "node_modules/read-only-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/read-only-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/read-only-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/read-pkg": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", @@ -11673,35 +12217,16 @@ } }, "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/readdirp": { @@ -11758,9 +12283,9 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dependencies": { "regenerate": "^1.4.2" }, @@ -11816,17 +12341,6 @@ "node": ">=0.10.0" } }, - "node_modules/regex-not/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -11919,11 +12433,11 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -12062,6 +12576,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -12196,16 +12716,16 @@ } }, "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", "dependencies": { - "define-data-property": "^1.1.4", + "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -12240,17 +12760,6 @@ "node": ">=0.10.0" } }, - "node_modules/set-value/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12307,9 +12816,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", + "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12487,16 +12996,47 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "kind-of": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/snapdragon-util": { @@ -12551,9 +13091,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -12607,9 +13147,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -12623,9 +13163,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "node_modules/split-string": { @@ -12662,17 +13202,6 @@ "node": ">=0.10.0" } }, - "node_modules/split-string/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -12729,6 +13258,33 @@ "readable-stream": "^2.0.2" } }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-browserify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/stream-browserify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", @@ -12738,6 +13294,33 @@ "readable-stream": "^2.0.2" } }, + "node_modules/stream-combiner2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-combiner2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/stream-combiner2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/stream-http": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", @@ -12749,19 +13332,6 @@ "xtend": "^4.0.2" } }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/stream-splicer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", @@ -12771,6 +13341,33 @@ "readable-stream": "^2.0.2" } }, + "node_modules/stream-splicer/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-splicer/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/stream-splicer/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -13025,23 +13622,22 @@ } }, "node_modules/stylelint-order": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz", - "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.3.tgz", + "integrity": "sha512-1j1lOb4EU/6w49qZeT2SQVJXm0Ht+Qnq9GMfUa3pMwoyojIWfuA+JUDmoR97Bht1RLn4ei0xtLGy87M7d29B1w==", "dev": true, "dependencies": { - "postcss": "^8.4.32", + "postcss": "^8.4.21", "postcss-sorting": "^8.0.2" }, "peerDependencies": { - "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1" + "stylelint": "^14.0.0 || ^15.0.0" } }, "node_modules/stylelint-stylistic": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/stylelint-stylistic/-/stylelint-stylistic-0.4.5.tgz", - "integrity": "sha512-E3Mz68yqmZe5Zk5UraR5MA2DjxgfE2TCZerDPk+fcd9dwLjwRupAt0j+Q1fBJRE3vhh3PvToKDhvhfMHf1tfNg==", - "deprecated": "This package has been deprecated in favor of @stylistic/stylelint-plugin", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/stylelint-stylistic/-/stylelint-stylistic-0.4.3.tgz", + "integrity": "sha512-WphmneK3MRrm5ixvRPWy7+c9+EQUh0FPvNMXW/N9VD85vyqtpxUejpD+mxubVVht0fRgidcqBxtW3s3tU2Ujhw==", "dev": true, "dependencies": { "is-plain-object": "^5.0.0", @@ -13054,6 +13650,15 @@ "stylelint": "^15.0.0" } }, + "node_modules/stylelint-stylistic/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", @@ -13061,17 +13666,26 @@ "dev": true }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", - "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.1.tgz", + "integrity": "sha512-uLfFktPmRetVCbHe5UPuekWrQ6hENufnA46qEGbfACkK5drjTTdQYUragRgMjHldcbYG+nslUerqMPjbBSHXjQ==", "dev": true, "dependencies": { - "flat-cache": "^3.2.0" + "flat-cache": "^3.1.1" }, "engines": { "node": ">=12.0.0" } }, + "node_modules/stylelint/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -13082,9 +13696,9 @@ } }, "node_modules/stylelint/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", "dev": true, "engines": { "node": ">=14" @@ -13228,9 +13842,9 @@ } }, "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "dependencies": { "ajv": "^8.0.1", @@ -13244,15 +13858,15 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3", + "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -13395,16 +14009,39 @@ "node": ">=0.10.0" } }, - "node_modules/to-regex/node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "node_modules/to-regex/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "kind-of": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/to-regex/node_modules/is-extendable": { @@ -13418,13 +14055,10 @@ "node": ">=0.10.0" } }, - "node_modules/to-regex/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, + "node_modules/to-regex/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "engines": { "node": ">=0.10.0" } @@ -13438,17 +14072,26 @@ } }, "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, "bin": { "nodetouch": "bin/nodetouch.js" } }, "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } }, "node_modules/trim-newlines": { "version": "4.1.1", @@ -13616,9 +14259,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", "dev": true, "peer": true, "bin": { @@ -13672,12 +14315,6 @@ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -13729,9 +14366,9 @@ } }, "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { "node": ">= 10.0.0" } @@ -13788,11 +14425,6 @@ "node": ">=0.10.0" } }, - "node_modules/unset-value/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -13803,9 +14435,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "funding": [ { "type": "opencollective", @@ -13821,8 +14453,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -13847,12 +14479,12 @@ "deprecated": "Please see https://github.com/lydell/urix#deprecated" }, "node_modules/url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.11.2" + "punycode": "1.3.2", + "querystring": "0.2.0" } }, "node_modules/url-template": { @@ -13861,23 +14493,9 @@ "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" }, "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/url/node_modules/qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" }, "node_modules/use": { "version": "3.1.1", @@ -13888,9 +14506,9 @@ } }, "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" }, "node_modules/util": { "version": "0.10.4", @@ -13931,14 +14549,14 @@ } }, "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "convert-source-map": "^1.6.0" }, "engines": { "node": ">=10.12.0" @@ -13965,6 +14583,7 @@ "node_modules/vitreum": { "version": "6.0.4", "resolved": "git+https://git@github.com/calculuschild/vitreum.git#9d55fd6fb7e85e7070de798c4f9d5b983c1b7dba", + "integrity": "sha512-6b5A4XEXnpyl6JDRWWOhe5lHxtzMVqNA+0Xrl7mPXqh7cYwTUm0yhkYEUkV+mz7rrHTpH7bYEWYsWEE/qTZMpg==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -14138,7 +14757,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", "hasInstallScript": true, "optional": true, "os": [ @@ -14172,6 +14791,25 @@ "node": ">=0.10.0" } }, + "node_modules/watchify/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchify/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/watchify/node_modules/is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -14183,16 +14821,44 @@ "node": ">=0.10.0" } }, - "node_modules/watchify/node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "node_modules/watchify/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "kind-of": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/watchify/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchify/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchify/node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/watchify/node_modules/is-extendable": { @@ -14217,7 +14883,7 @@ "node": ">=0.10.0" } }, - "node_modules/watchify/node_modules/is-number/node_modules/kind-of": { + "node_modules/watchify/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", @@ -14228,17 +14894,6 @@ "node": ">=0.10.0" } }, - "node_modules/watchify/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/watchify/node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -14274,6 +14929,28 @@ "node": ">=0.10.0" } }, + "node_modules/watchify/node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "node_modules/watchify/node_modules/readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -14287,6 +14964,19 @@ "node": ">=0.10" } }, + "node_modules/watchify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/watchify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/watchify/node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -14309,17 +14999,23 @@ } }, "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } }, "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" } }, "node_modules/which": { @@ -14379,6 +15075,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", @@ -14416,15 +15118,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -14490,9 +15183,9 @@ } }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "engines": { "node": ">=8.3.0" }, @@ -14549,14 +15242,6 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", From 8e7baca47d256ae301cf37f3598d840cd6397243 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 23 Jul 2024 17:40:32 -0400 Subject: [PATCH 214/239] Fix tests --- server/homebrew.api.js | 4 ---- server/homebrew.api.spec.js | 19 ++++++++----------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 0b6218597..8faebd51b 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -309,8 +309,6 @@ const api = { if(isStaticTheme(req.brew.renderer, req.brew.theme)) //Check if parent is staticBrew rendererPath = `${_.upperFirst(req.brew.renderer)}/`; - console.log(`getBrewThemeCSS for ${brew.shareId}`); - console.log(`and parentThemeImport for ${brew.theme}`); const parentThemeImport = `@import url(\"/css/${rendererPath}${req.brew.theme}\");\n\n`; const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; return res.status(200).send(`${parentThemeImport}${themeLocationComment}${req.brew.style}`); @@ -323,8 +321,6 @@ const api = { res.setHeader('Content-Type', 'text/css'); res.setHeader('Cache-Control', 'public, max-age: 43200, must-revalidate'); const themeParent = Themes[req.params.renderer][req.params.id].baseTheme; - console.log(`getStaticThemeCSS for ${req.params.id}`); - console.log(`and parentThemeImport for ${themeParent}`); const parentThemeImport = themeParent ? `@import url(\"/css/${req.params.renderer}/${themeParent}\");\n/* Static Theme ${Themes[req.params.renderer][themeParent].name} */\n` : ''; return res.status(200).send(`${parentThemeImport}@import url(\"/themes/${req.params.renderer}/${req.params.id}/style.css\");\n/* Static Theme ${Themes[req.params.renderer][req.params.id].name} */\n`); } diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 67f4abe5f..847c71946 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -287,15 +287,12 @@ describe('Tests for api', ()=>{ thumbnail : '', textBin : undefined, version : undefined, - userThemes : { - Brew : {} - }, - createdAt : undefined, - gDrive : false, - style : undefined, - trashed : false, - updatedAt : undefined, - views : 0 + createdAt : undefined, + gDrive : false, + style : undefined, + trashed : false, + updatedAt : undefined, + views : 0 }); expect(next).toHaveBeenCalled(); expect(api.getId).toHaveBeenCalledWith(req); @@ -600,7 +597,7 @@ brew`); expect(res.status).toHaveBeenCalledWith(200); }); }); - +////////////////////////////// describe('getBrewThemeWithUserParent', ()=>{ it('should collect parent theme and brew style - returning as css with user-theme parent imported.', async ()=>{ const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); @@ -643,7 +640,7 @@ brew`); expect(res.status).toHaveBeenCalledWith(404); }); }); - +//////////////////////////////// describe('deleteBrew', ()=>{ it('should handle case where fetching the brew returns an error', async ()=>{ From d2afa7adeae5327eba70535c396cd83066e521d5 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 23 Jul 2024 22:17:52 -0500 Subject: [PATCH 215/239] Move fetchThemeBundle into /shared/helpers This might not be the best rework - I was unsure if the *this* that would be available when called would see the appropriate object so I assumed not and pass it as a parameter. Works, but may be bad form. --- client/homebrew/pages/editPage/editPage.jsx | 17 +++-------------- client/homebrew/pages/homePage/homePage.jsx | 14 ++------------ client/homebrew/pages/newPage/newPage.jsx | 17 +++-------------- client/homebrew/pages/sharePage/sharePage.jsx | 15 ++------------- shared/helpers.js | 13 ++++++++++++- 5 files changed, 22 insertions(+), 54 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 05bd79d4d..39a6d1931 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -25,7 +25,7 @@ const LockNotification = require('./lockNotification/lockNotification.jsx'); const Markdown = require('naturalcrit/markdown.js'); const { DEFAULT_BREW_LOAD } = require('../../../../server/brewDefaults.js'); -const { printCurrentBrew } = require('../../../../shared/helpers.js'); +const { printCurrentBrew, fetchThemeBundle } = require('../../../../shared/helpers.js'); const googleDriveIcon = require('../../googleDrive.svg'); @@ -88,7 +88,7 @@ const EditPage = createClass({ htmlErrors : Markdown.validate(prevState.brew.text) })); - this.fetchThemeBundle(this.props.brew.renderer, this.props.brew.theme); + fetchThemeBundle(this, this.props.brew.renderer, this.props.brew.theme); document.addEventListener('keydown', this.handleControlKeys); }, @@ -135,7 +135,7 @@ const EditPage = createClass({ handleMetaChange : function(metadata, field=undefined){ if(field == 'theme' || field == 'renderer') // Fetch theme bundle only if theme or renderer was changed - this.fetchThemeBundle(metadata.renderer, metadata.theme); + fetchThemeBundle(this, metadata.renderer, metadata.theme); this.setState((prevState)=>({ brew : { @@ -150,17 +150,6 @@ const EditPage = createClass({ return !_.isEqual(this.state.brew, this.savedBrew); }, - // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected - fetchThemeBundle : function(renderer, theme) { - fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ - themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); - this.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT - ...prevState, - themeBundle : themeBundle - })); - }); - }, - trySave : function(immediate=false){ if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); if(this.hasChanges()){ diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index 0609d5b8b..bcfd237b4 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -13,6 +13,7 @@ const HelpNavItem = require('../../navbar/help.navitem.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; const AccountNavItem = require('../../navbar/account.navitem.jsx'); const ErrorNavItem = require('../../navbar/error-navitem.jsx'); +const { fetchThemeBundle } = require('../../../../shared/helpers.js'); const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); @@ -42,18 +43,7 @@ const HomePage = createClass({ editor : React.createRef(null), componentDidMount : function() { - this.fetchThemeBundle(this.props.brew.renderer, this.props.brew.theme); - }, - - // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected - fetchThemeBundle : function(renderer, theme) { - fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ - themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); - this.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT - ...prevState, - themeBundle : themeBundle - })); - }); + fetchThemeBundle(this, this.props.brew.renderer, this.props.brew.theme); }, handleSave : function(){ diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index e8c2636b0..c9160062f 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -19,7 +19,7 @@ const Editor = require('../../editor/editor.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); const { DEFAULT_BREW } = require('../../../../server/brewDefaults.js'); -const { printCurrentBrew } = require('../../../../shared/helpers.js'); +const { printCurrentBrew, fetchThemeBundle } = require('../../../../shared/helpers.js'); const BREWKEY = 'homebrewery-new'; const STYLEKEY = 'homebrewery-new-style'; @@ -78,7 +78,7 @@ const NewPage = createClass({ saveGoogle : (saveStorage == 'GOOGLE-DRIVE' && this.state.saveGoogle) }); - this.fetchThemeBundle(this.props.brew.renderer, this.props.brew.theme); + fetchThemeBundle(this, this.props.brew.renderer, this.props.brew.theme); localStorage.setItem(BREWKEY, brew.text); if(brew.style) @@ -89,17 +89,6 @@ const NewPage = createClass({ document.removeEventListener('keydown', this.handleControlKeys); }, - // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected - fetchThemeBundle : function(renderer, theme) { - fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ - themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); - this.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT - ...prevState, - themeBundle : themeBundle - })); - }); - }, - handleControlKeys : function(e){ if(!(e.ctrlKey || e.metaKey)) return; const S_KEY = 83; @@ -138,7 +127,7 @@ const NewPage = createClass({ handleMetaChange : function(metadata, field=undefined){ if(field == 'theme' || field == 'renderer') // Fetch theme bundle only if theme or renderer was changed - this.fetchThemeBundle(metadata.renderer, metadata.theme); + fetchThemeBundle(this, metadata.renderer, metadata.theme); this.setState((prevState)=>({ brew : { ...prevState.brew, ...metadata }, diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index c1f044d2d..390e577d0 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -12,7 +12,7 @@ const Account = require('../../navbar/account.navitem.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); const { DEFAULT_BREW_LOAD } = require('../../../../server/brewDefaults.js'); -const { printCurrentBrew } = require('../../../../shared/helpers.js'); +const { printCurrentBrew, fetchThemeBundle } = require('../../../../shared/helpers.js'); const SharePage = createClass({ displayName : 'SharePage', @@ -31,24 +31,13 @@ const SharePage = createClass({ componentDidMount : function() { document.addEventListener('keydown', this.handleControlKeys); - this.fetchThemeBundle(this.props.brew.renderer, this.props.brew.theme); + fetchThemeBundle(this, this.props.brew.renderer, this.props.brew.theme); }, componentWillUnmount : function() { document.removeEventListener('keydown', this.handleControlKeys); }, - // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected - fetchThemeBundle : function(renderer, theme) { - fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ - themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); - this.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT - ...prevState, - themeBundle : themeBundle - })); - }); - }, - handleControlKeys : function(e){ if(!(e.ctrlKey || e.metaKey)) return; const P_KEY = 80; diff --git a/shared/helpers.js b/shared/helpers.js index 321791f84..8f9e23928 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -33,7 +33,18 @@ const printCurrentBrew = ()=>{ } }; +const fetchThemeBundle = (obj, renderer, theme)=>{ + fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ + themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); + obj.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT + ...prevState, + themeBundle : themeBundle + })); + }); +}; + module.exports = { splitTextStyleAndMetadata, - printCurrentBrew + printCurrentBrew, + fetchThemeBundle, }; From 113f9b3fe391e179ebe264f6b8257527dc62d6da Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 27 Jul 2024 02:00:38 -0400 Subject: [PATCH 216/239] No need to stringify Theme Bundle object --- server/homebrew.api.js | 4 ++-- shared/helpers.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 8faebd51b..a766aaa6a 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -297,8 +297,8 @@ const api = { snippets : completeSnippets.reverse() }; - res.setHeader('Content-Type', 'text/json'); - return res.status(200).send(JSON.stringify(returnObj)); + res.setHeader('Content-Type', 'application/json'); + return res.status(200).send(returnObj); }, //Return CSS for a brew theme, with @include endpoint for its parent theme if any getBrewThemeCSS : async (req, res)=>{ diff --git a/shared/helpers.js b/shared/helpers.js index 8f9e23928..65dfc2752 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -36,7 +36,7 @@ const printCurrentBrew = ()=>{ const fetchThemeBundle = (obj, renderer, theme)=>{ fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); - obj.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT + obj.setState((prevState)=>({ ...prevState, themeBundle : themeBundle })); From b64a0c520006f1d96c680c831769afea8f87e8ea Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 27 Jul 2024 03:30:51 -0400 Subject: [PATCH 217/239] Start adding tests for /theme/ endpoint --- package.json | 2 +- server/homebrew.api.spec.js | 47 ++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 321f9afbe..0f5d8548f 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "circleci": "npm test && eslint **/*.{js,jsx} --max-warnings=0", "verify": "npm run lint && npm test", "test": "jest --runInBand", - "test:api-unit": "jest server/*.spec.js --verbose", + "test:api-unit": "jest \"server/.*.spec.js\" -t --verbose", "test:coverage": "jest --coverage --silent --runInBand", "test:dev": "jest --verbose --watch", "test:basic": "jest tests/markdown/basic.test.js --verbose", diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 847c71946..4aa9e5663 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -582,6 +582,51 @@ brew`); }); }); + describe('theme bundle', () => { + it('should return Theme Bundle for a User Theme', async () => { + const toBrewPromise = (brew) => new Promise((res) => res({ toObject: () => brew })); + model.get = jest.fn(() => toBrewPromise({ title: 'User Theme A', renderer: 'V3', theme: null, shareId: 'userThemeAID', style: 'User Theme A Style' })); + const req = { params: { renderer: "V3", id: "userThemeAID" }, get: () => { return 'localhost'; }, protocol: 'https' }; + + await api.getThemeBundle(req, res); + + expect(res.status).toHaveBeenCalledWith(200); + expect(res.send).toHaveBeenCalledWith({ + styles: ["/* From Brew: https://localhost/share/userThemeAID */\n\nUser Theme A Style"], + snippets: [] + }); + }); + + it('should return Theme Bundle for nested User Themes', async () => { + console.log(api.getId) + const brews = { + userThemeAID: { title: 'User Theme A', renderer: 'V3', theme: 'userThemeBID', shareId: 'userThemeAID', style: 'User Theme A Style' }, + userThemeBID: { title: 'User Theme B', renderer: 'V3', theme: 'userThemeCID', shareId: 'userThemeBID', style: 'User Theme B Style' }, + userThemeCID: { title: 'User Theme C', renderer: 'V3', theme: null, shareId: 'userThemeCID', style: 'User Theme C Style' } + }; + + const toBrewPromise = (brew) => new Promise((res) => res({ toObject: () => brew })); + model.get = jest.fn((shareId) => { + toBrewPromise(brews[shareId]); + }); + const req = { params: { renderer: "V3", id: "userThemeAID" }, get: () => { return 'localhost'; }, protocol: 'https' }; + + await api.getThemeBundle(req, res); + + expect(res.send).toHaveBeenCalledWith({ + styles: [ + "/* From Brew: https://localhost/share/userThemeCID */\n\nUser Theme C Style", + "/* From Brew: https://localhost/share/userThemeBID */\n\nUser Theme B Style", + "/* From Brew: https://localhost/share/userThemeAID */\n\nUser Theme A Style" + ], + snippets: [] + }); + expect(res.status).toHaveBeenCalledWith(200); + }); + + }); + +////////////////////////////// describe('getBrewThemeWithStaticParent', ()=>{ it('should collect parent theme and brew style - returning as css with static parent imported.', async ()=>{ const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); @@ -597,7 +642,7 @@ brew`); expect(res.status).toHaveBeenCalledWith(200); }); }); -////////////////////////////// + describe('getBrewThemeWithUserParent', ()=>{ it('should collect parent theme and brew style - returning as css with user-theme parent imported.', async ()=>{ const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); From f2d933410e7d182a09d76ddd1bcd85234f0779eb Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 27 Jul 2024 19:17:05 -0400 Subject: [PATCH 218/239] Add error handling for missing themes --- server/homebrew.api.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index a766aaa6a..3a5a444fb 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -269,7 +269,18 @@ const api = { while (req.params.id) { //=== User Themes ===// if(!isStaticTheme(req.params.renderer, req.params.id)) { - await api.getBrew('share')(req, res, ()=>{}); + await api.getBrew('share')(req, res, ()=>{}) + .catch((err)=>{ + console.error(err); + if(err.HBErrorCode == '05') + res.status(err.status).send(`Theme Not Found - Renderer: ${req.params.renderer}, Name: ${req.params.id}`); + else + res.status(err.status || err.response.status).send(err.message || err); + req.brew = undefined; + }); + if (!req.brew) + return; + currentTheme = req.brew; splitTextStyleAndMetadata(currentTheme); From edec9369ec48d924f945f88e7137a5a74eedc212 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 27 Jul 2024 19:17:19 -0400 Subject: [PATCH 219/239] Finish adding test cases --- package.json | 3 +- server/homebrew.api.spec.js | 87 ++++++++++++++++++++++++++++++++----- 2 files changed, 77 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 0f5d8548f..11d31291f 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "circleci": "npm test && eslint **/*.{js,jsx} --max-warnings=0", "verify": "npm run lint && npm test", "test": "jest --runInBand", - "test:api-unit": "jest \"server/.*.spec.js\" -t --verbose", + "test:api-unit": "jest \"server/.*.spec.js\" --verbose", + "test:api-unit:themes": "jest \"server/.*.spec.js\" -t \"theme bundle\" --verbose", "test:coverage": "jest --coverage --silent --runInBand", "test:dev": "jest --verbose --watch", "test:basic": "jest tests/markdown/basic.test.js --verbose", diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 4aa9e5663..13975bcb1 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -14,6 +14,9 @@ describe('Tests for api', ()=>{ let saved; beforeEach(()=>{ + jest.resetModules(); + jest.restoreAllMocks(); + saved = undefined; saveFunc = jest.fn(async function() { saved = { ...this, _id: '1' }; @@ -82,10 +85,6 @@ describe('Tests for api', ()=>{ }; }); - afterEach(()=>{ - jest.restoreAllMocks(); - }); - describe('getId', ()=>{ it('should return only id if google id is not present', ()=>{ const { id, googleId } = api.getId({ @@ -582,10 +581,14 @@ brew`); }); }); - describe('theme bundle', () => { + describe('Theme bundle', () => { it('should return Theme Bundle for a User Theme', async () => { + const brews = { + userThemeAID: { title: 'User Theme A', renderer: 'V3', theme: null, shareId: 'userThemeAID', style: 'User Theme A Style' } + }; + const toBrewPromise = (brew) => new Promise((res) => res({ toObject: () => brew })); - model.get = jest.fn(() => toBrewPromise({ title: 'User Theme A', renderer: 'V3', theme: null, shareId: 'userThemeAID', style: 'User Theme A Style' })); + model.get = jest.fn((getParams) => toBrewPromise(brews[getParams.shareId])); const req = { params: { renderer: "V3", id: "userThemeAID" }, get: () => { return 'localhost'; }, protocol: 'https' }; await api.getThemeBundle(req, res); @@ -598,7 +601,6 @@ brew`); }); it('should return Theme Bundle for nested User Themes', async () => { - console.log(api.getId) const brews = { userThemeAID: { title: 'User Theme A', renderer: 'V3', theme: 'userThemeBID', shareId: 'userThemeAID', style: 'User Theme A Style' }, userThemeBID: { title: 'User Theme B', renderer: 'V3', theme: 'userThemeCID', shareId: 'userThemeBID', style: 'User Theme B Style' }, @@ -606,13 +608,12 @@ brew`); }; const toBrewPromise = (brew) => new Promise((res) => res({ toObject: () => brew })); - model.get = jest.fn((shareId) => { - toBrewPromise(brews[shareId]); - }); + model.get = jest.fn((getParams) => toBrewPromise(brews[getParams.shareId])); const req = { params: { renderer: "V3", id: "userThemeAID" }, get: () => { return 'localhost'; }, protocol: 'https' }; await api.getThemeBundle(req, res); + expect(res.status).toHaveBeenCalledWith(200); expect(res.send).toHaveBeenCalledWith({ styles: [ "/* From Brew: https://localhost/share/userThemeCID */\n\nUser Theme C Style", @@ -621,9 +622,71 @@ brew`); ], snippets: [] }); - expect(res.status).toHaveBeenCalledWith(200); }); - + + it('should return Theme Bundle for a Static Theme', async () => { + const req = { params: { renderer: "V3", id: "5ePHB" }, get: () => { return 'localhost'; }, protocol: 'https' }; + + await api.getThemeBundle(req, res); + + expect(res.status).toHaveBeenCalledWith(200); + expect(res.send).toHaveBeenCalledWith({ + styles: [ + `/* From Theme Blank */\n\n@import url("/themes/V3/Blank/style.css");`, + `/* From Theme 5ePHB */\n\n@import url("/themes/V3/5ePHB/style.css");` + ], + snippets: [ + "V3_Blank", + "V3_5ePHB" + ] + }); + }); + + it('should return Theme Bundle for nested User and Static Themes together', async () => { + const brews = { + userThemeAID: { title: 'User Theme A', renderer: 'V3', theme: 'userThemeBID', shareId: 'userThemeAID', style: 'User Theme A Style' }, + userThemeBID: { title: 'User Theme B', renderer: 'V3', theme: 'userThemeCID', shareId: 'userThemeBID', style: 'User Theme B Style' }, + userThemeCID: { title: 'User Theme C', renderer: 'V3', theme: '5eDMG', shareId: 'userThemeCID', style: 'User Theme C Style' } + }; + + const toBrewPromise = (brew) => new Promise((res) => res({ toObject: () => brew })); + model.get = jest.fn((getParams) => toBrewPromise(brews[getParams.shareId])); + const req = { params: { renderer: "V3", id: "userThemeAID" }, get: () => { return 'localhost'; }, protocol: 'https' }; + + await api.getThemeBundle(req, res); + + expect(res.status).toHaveBeenCalledWith(200); + expect(res.send).toHaveBeenCalledWith({ + styles: [ + `/* From Theme Blank */\n\n@import url("/themes/V3/Blank/style.css");`, + `/* From Theme 5ePHB */\n\n@import url("/themes/V3/5ePHB/style.css");`, + `/* From Theme 5eDMG */\n\n@import url("/themes/V3/5eDMG/style.css");`, + "/* From Brew: https://localhost/share/userThemeCID */\n\nUser Theme C Style", + "/* From Brew: https://localhost/share/userThemeBID */\n\nUser Theme B Style", + "/* From Brew: https://localhost/share/userThemeAID */\n\nUser Theme A Style" + ], + snippets: [ + "V3_Blank", + "V3_5ePHB", + "V3_5eDMG" + ] + }); + }); + + it('should fail for an invalid Theme in the chain', async()=>{ + const brews = { + userThemeAID: { title: 'User Theme A', renderer: 'V3', theme: 'missingTheme', shareId: 'userThemeAID', style: 'User Theme A Style' }, + }; + + const toBrewPromise = (brew) => new Promise((res) => res({ toObject: () => brew })); + model.get = jest.fn((getParams) => toBrewPromise(brews[getParams.shareId])); + const req = { params: { renderer: "V3", id: "userThemeAID" }, get: () => { return 'localhost'; }, protocol: 'https' }; + + await api.getThemeBundle(req, res); + + expect(res.status).toHaveBeenCalledWith(404); + expect(res.send).toHaveBeenCalledWith('Theme Not Found - Renderer: V3, Name: missingTheme'); + }); }); ////////////////////////////// From 8aa88a2e4590ddccc0992470a8f32fe07568001b Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 28 Jul 2024 16:45:01 -0400 Subject: [PATCH 220/239] Add proper error popup when theme fails to load --- client/homebrew/navbar/error-navitem.jsx | 12 +++++++++++ client/homebrew/navbar/error-navitem.less | 3 +++ .../pages/errorPage/errors/errorIndex.js | 13 ++++++++++++ server/app.js | 5 +---- server/homebrew.api.js | 10 +++------ server/homebrew.api.spec.js | 15 ++++++++----- shared/helpers.js | 21 ++++++++++++------- 7 files changed, 56 insertions(+), 23 deletions(-) diff --git a/client/homebrew/navbar/error-navitem.jsx b/client/homebrew/navbar/error-navitem.jsx index 59e05a253..652959459 100644 --- a/client/homebrew/navbar/error-navitem.jsx +++ b/client/homebrew/navbar/error-navitem.jsx @@ -104,6 +104,18 @@ const ErrorNavItem = createClass({ ; } + if(HBErrorCode === '09') { + return + Oops! +
    + Looks like there was a problem retreiving + the theme, or a theme that it inherits, + for this brew. Verify that brew + {response.body.brewId} still exists! +
    +
    ; + } + return Oops!
    diff --git a/client/homebrew/navbar/error-navitem.less b/client/homebrew/navbar/error-navitem.less index 7e7dab772..be138dca4 100644 --- a/client/homebrew/navbar/error-navitem.less +++ b/client/homebrew/navbar/error-navitem.less @@ -21,6 +21,9 @@ font-size : 10px; font-weight : 800; text-transform : uppercase; + .lowercase { + text-transform : none; + } a{ color : @teal; } diff --git a/client/homebrew/pages/errorPage/errors/errorIndex.js b/client/homebrew/pages/errorPage/errors/errorIndex.js index 58725fe3f..7bf2caae1 100644 --- a/client/homebrew/pages/errorPage/errors/errorIndex.js +++ b/client/homebrew/pages/errorPage/errors/errorIndex.js @@ -136,6 +136,19 @@ const errorIndex = (props)=>{ **Brew ID:** ${props.brew.brewId}`, + // Theme load error + '09' : dedent` + ## No Homebrewery theme document could be found. + + The server could not locate the Homebrewery document. It was likely deleted by + its owner. + + : + + **Requested access:** ${props.brew.accessType} + + **Brew ID:** ${props.brew.brewId}`, + // Brew locked by Administrators error '100' : dedent` ## This brew has been locked. diff --git a/server/app.js b/server/app.js index 8ad35ca35..6863bc7cb 100644 --- a/server/app.js +++ b/server/app.js @@ -9,7 +9,7 @@ const yaml = require('js-yaml'); const app = express(); const config = require('./config.js'); -const { homebrewApi, getBrew, getThemeBundle, getUsersBrewThemes } = require('./homebrew.api.js'); +const { homebrewApi, getBrew, getUsersBrewThemes } = require('./homebrew.api.js'); const GoogleActions = require('./googleActions.js'); const serveCompressedStaticAssets = require('./static-assets.mv.js'); const sanitizeFilename = require('sanitize-filename'); @@ -77,9 +77,6 @@ app.get('/robots.txt', (req, res)=>{ return res.sendFile(`robots.txt`, { root: process.cwd() }); }); -// Theme -app.get('/theme/:renderer/:id', asyncHandler(getThemeBundle)); - //Home page app.get('/', (req, res, next)=>{ req.brew = { diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 3a5a444fb..f20e97d4c 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -271,15 +271,10 @@ const api = { if(!isStaticTheme(req.params.renderer, req.params.id)) { await api.getBrew('share')(req, res, ()=>{}) .catch((err)=>{ - console.error(err); if(err.HBErrorCode == '05') - res.status(err.status).send(`Theme Not Found - Renderer: ${req.params.renderer}, Name: ${req.params.id}`); - else - res.status(err.status || err.response.status).send(err.message || err); - req.brew = undefined; + err = {...err, name: 'ThemeLoad Error', message: 'Theme Not Found', HBErrorCode: '09'}; + throw err; }); - if (!req.brew) - return; currentTheme = req.brew; splitTextStyleAndMetadata(currentTheme); @@ -496,5 +491,6 @@ router.put('/api/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api router.put('/api/update/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.updateBrew)); router.delete('/api/:id', asyncHandler(api.deleteBrew)); router.get('/api/remove/:id', asyncHandler(api.deleteBrew)); +router.get('/api/theme/:renderer/:id', asyncHandler(api.getThemeBundle)); module.exports = api; diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 13975bcb1..90ee4dfa3 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -682,14 +682,20 @@ brew`); model.get = jest.fn((getParams) => toBrewPromise(brews[getParams.shareId])); const req = { params: { renderer: "V3", id: "userThemeAID" }, get: () => { return 'localhost'; }, protocol: 'https' }; - await api.getThemeBundle(req, res); + let err + await api.getThemeBundle(req, res) + .catch(e => err = e); - expect(res.status).toHaveBeenCalledWith(404); - expect(res.send).toHaveBeenCalledWith('Theme Not Found - Renderer: V3, Name: missingTheme'); + expect(err).toEqual({ + HBErrorCode : "09", + accessType : "share", + brewId : "missingTheme", + message : "Theme Not Found", + name : "ThemeLoad Error", + status : 404}); }); }); -////////////////////////////// describe('getBrewThemeWithStaticParent', ()=>{ it('should collect parent theme and brew style - returning as css with static parent imported.', async ()=>{ const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); @@ -748,7 +754,6 @@ brew`); expect(res.status).toHaveBeenCalledWith(404); }); }); -//////////////////////////////// describe('deleteBrew', ()=>{ it('should handle case where fetching the brew returns an error', async ()=>{ diff --git a/shared/helpers.js b/shared/helpers.js index 65dfc2752..e711de41b 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -1,5 +1,6 @@ const _ = require('lodash'); const yaml = require('js-yaml'); +const request = require('../client/homebrew/utils/request-middleware.js'); const splitTextStyleAndMetadata = (brew)=>{ brew.text = brew.text.replaceAll('\r\n', '\n'); @@ -33,14 +34,20 @@ const printCurrentBrew = ()=>{ } }; -const fetchThemeBundle = (obj, renderer, theme)=>{ - fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ - themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); - obj.setState((prevState)=>({ +const fetchThemeBundle = async (obj, renderer, theme) => { + const res = await request + .get(`${window.location.protocol}//${window.location.host}/api/theme/${renderer}/${theme}`) + .catch((err) => { + obj.setState({ error: err }); + }); + if (!res) return; + + const themeBundle = res.body; + themeBundle.joinedStyles = themeBundle.styles.map((style) => ``).join('\n\n'); + obj.setState((prevState) => ({ ...prevState, - themeBundle : themeBundle - })); - }); + themeBundle: themeBundle + })); }; module.exports = { From e0425ec6c0599eeb0a2fbd961956b269068aea46 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 28 Jul 2024 16:47:16 -0400 Subject: [PATCH 221/239] Simplify API call url --- shared/helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/helpers.js b/shared/helpers.js index e711de41b..90d0004b4 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -36,7 +36,7 @@ const printCurrentBrew = ()=>{ const fetchThemeBundle = async (obj, renderer, theme) => { const res = await request - .get(`${window.location.protocol}//${window.location.host}/api/theme/${renderer}/${theme}`) + .get(`/api/theme/${renderer}/${theme}`) .catch((err) => { obj.setState({ error: err }); }); From 2870caaae6716b427e21d2c4d9915afe3b046e01 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 28 Jul 2024 17:18:30 -0400 Subject: [PATCH 222/239] Clean up metadataEditor theme dropdown --- .../editor/metadataEditor/metadataEditor.jsx | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 473b2ab69..944c4d88a 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -199,37 +199,34 @@ const MetadataEditor = createClass({ const preview = theme.thumbnail || `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`; const texture = theme.thumbnail || `/themes/${theme.renderer}/${theme.path}/dropdownTexture.png`; return
    this.handleTheme(theme)} title={''}> -

    {`${theme?.author ? theme.author : renderer} : ${theme.name}`}

    + {theme.author ?? renderer} : {theme.name}
    - +
    -
    {`${theme.name}`} preview
    - +
    {theme.name} preview
    +
    ; }); }; - const currentThemePath = this.props.metadata?.theme && Themes[_.upperFirst(this.props.metadata.renderer)]?.hasOwnProperty(this.props.metadata?.theme) ? this.props.metadata.renderer : 'Brew'; - const currentTheme = mergedThemes[`${_.upperFirst(currentThemePath)}`]?.hasOwnProperty(this.props.metadata.theme) ? mergedThemes[`${_.upperFirst(currentThemePath)}`][this.props.metadata.theme] : { name: `!!! THEME MISSING !!! ID=${this.props.metadata.theme.slice(1)}` }; + const currentRenderer = this.props.metadata.renderer; + const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.renderer)}`][this.props.metadata.theme] + ?? { name: `!!! THEME MISSING !!! ID=${this.props.metadata.theme}` }; let dropdown; - if(this.props.metadata.renderer == 'legacy') { + if(currentRenderer == 'legacy') { dropdown = -
    - {`Themes are not supported in the Legacy Renderer`} -
    +
    {`Themes are not supported in the Legacy Renderer`}
    ; } else { dropdown = -
    - {`${currentTheme?.author ? currentTheme.author : _.upperFirst(currentThemePath)} : ${currentTheme.name}`} -
    - {/*listThemes('Legacy')*/} - {listThemes('V3')} +
    {currentTheme.author ?? _.upperFirst(currentRenderer)} : {currentTheme.name}
    + + {listThemes(currentRenderer)}
    ; } From ee9f2c8c83ba6283f2325ce23a7ff8878b3a9696 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 28 Jul 2024 17:53:25 -0400 Subject: [PATCH 223/239] Remove unused CSS endpoints in favor of #3075 Now that we have a dedicated /theme/ route for the recursive theming, the CSS endpoint can be simpler for only getting the `style` of a single brew. #3075 already has this simpler version, but no testing, so I have copied this into a comment there for implementation when it is ready. --- server/homebrew.api.js | 25 ---------------- server/homebrew.api.spec.js | 59 ------------------------------------- 2 files changed, 84 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index f20e97d4c..c8e4996cb 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -306,31 +306,6 @@ const api = { res.setHeader('Content-Type', 'application/json'); return res.status(200).send(returnObj); }, - //Return CSS for a brew theme, with @include endpoint for its parent theme if any - getBrewThemeCSS : async (req, res)=>{ - const brew = req.brew; - splitTextStyleAndMetadata(brew); - res.setHeader('Content-Type', 'text/css'); - let rendererPath = ''; - if(isStaticTheme(req.brew.renderer, req.brew.theme)) //Check if parent is staticBrew - rendererPath = `${_.upperFirst(req.brew.renderer)}/`; - - const parentThemeImport = `@import url(\"/css/${rendererPath}${req.brew.theme}\");\n\n`; - const themeLocationComment = `/* From Brew: ${req.protocol}://${req.get('host')}/share/${req.brew.shareId} */\n\n`; - return res.status(200).send(`${parentThemeImport}${themeLocationComment}${req.brew.style}`); - }, - //Return CSS for a static theme, with @include endpoint for its parent theme if any - getStaticThemeCSS : async(req, res)=>{ - if(!isStaticTheme(req.params.renderer, req.params.id)) - res.status(404).send(`Invalid Theme - Renderer: ${req.params.renderer}, Name: ${req.params.id}`); - else { - res.setHeader('Content-Type', 'text/css'); - res.setHeader('Cache-Control', 'public, max-age: 43200, must-revalidate'); - const themeParent = Themes[req.params.renderer][req.params.id].baseTheme; - const parentThemeImport = themeParent ? `@import url(\"/css/${req.params.renderer}/${themeParent}\");\n/* Static Theme ${Themes[req.params.renderer][themeParent].name} */\n` : ''; - return res.status(200).send(`${parentThemeImport}@import url(\"/themes/${req.params.renderer}/${req.params.id}/style.css\");\n/* Static Theme ${Themes[req.params.renderer][req.params.id].name} */\n`); - } - }, updateBrew : async (req, res)=>{ // Initialize brew from request and body, destructure query params, and set the initial value for the after-save method const brewFromClient = api.excludePropsFromUpdate(req.body); diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 90ee4dfa3..273900ee2 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -696,65 +696,6 @@ brew`); }); }); - describe('getBrewThemeWithStaticParent', ()=>{ - it('should collect parent theme and brew style - returning as css with static parent imported.', async ()=>{ - const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); - model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', renderer: 'V3', theme: '5eDMG', shareId: 'iAmAUserTheme', style: 'I Have a style!' })); - const fn = api.getBrew('share', true); - const req = { brew: {}, get: ()=>{return 'localhost';}, protocol: 'https' }; - const next = jest.fn(); - await fn(req, null, next); - - api.getBrewThemeCSS(req, res); - const sent = res.send.mock.calls[0][0]; - expect(sent).toBe(`@import url("/css/V3/5eDMG");\n\n/* From Brew: https://localhost/share/iAmAUserTheme */\n\nI Have a style!`); - expect(res.status).toHaveBeenCalledWith(200); - }); - }); - - describe('getBrewThemeWithUserParent', ()=>{ - it('should collect parent theme and brew style - returning as css with user-theme parent imported.', async ()=>{ - const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); - model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', renderer: 'V3', shareId: 'iAmAUserTheme', theme: 'IamATheme', style: 'I Have a style!' })); - const fn = api.getBrew('share', true); - const req = { brew: {}, get: ()=>{return 'localhost';}, protocol: 'https' }; - const next = jest.fn(); - await fn(req, null, next); - - api.getBrewThemeCSS(req, res); - const sent = res.send.mock.calls[0][0]; - expect(sent).toBe(`@import url("/css/IamATheme");\n\n/* From Brew: https://localhost/share/iAmAUserTheme */\n\nI Have a style!`); - expect(res.status).toHaveBeenCalledWith(200); - }); - }); - - describe('getStaticThemeCSS', ()=>{ - it('should return an import of the theme including a parent.', async ()=>{ - const req = { - params : { - renderer : 'V3', - id : '5eDMG' - } - }; - api.getStaticThemeCSS(req, res); - const sent = res.send.mock.calls[0][0]; - expect(sent).toBe('@import url("/css/V3/5ePHB");\n/* Static Theme 5e PHB */\n@import url("/themes/V3/5eDMG/style.css");\n/* Static Theme 5e DMG */\n'); - expect(res.status).toHaveBeenCalledWith(200); - }); - it('should fail for an invalid static theme.', async()=>{ - const req = { - params : { - renderer : 'V3', - id : '5eDMGGGG' - } - }; - api.getStaticThemeCSS(req, res); - const sent = res.send.mock.calls[0][0]; - expect(sent).toBe('Invalid Theme - Renderer: V3, Name: 5eDMGGGG'); - expect(res.status).toHaveBeenCalledWith(404); - }); - }); - describe('deleteBrew', ()=>{ it('should handle case where fetching the brew returns an error', async ()=>{ api.getBrew = jest.fn(()=>async ()=>{ throw { message: 'err', HBErrorCode: '02' }; }); From 88eaebfd4984469ca277ce83ba472a3121778ed9 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 28 Jul 2024 18:00:33 -0400 Subject: [PATCH 224/239] Raise test coverage threshold This PR adds tests which means we are now covering a larger % of the codebase. Raise the coverage thresholds to match. --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 11d31291f..c5563cca0 100644 --- a/package.json +++ b/package.json @@ -57,15 +57,15 @@ ], "coverageThreshold": { "global": { - "statements": 25, - "branches": 10, - "functions": 22, - "lines": 25 + "statements": 50, + "branches": 40, + "functions": 40, + "lines": 50 }, "server/homebrew.api.js": { - "statements": 65, + "statements": 70, "branches": 50, - "functions": 60, + "functions": 65, "lines": 70 } }, From 8221579b6a8a2c6567cc12748760f88ac3369d0e Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 28 Jul 2024 18:03:25 -0400 Subject: [PATCH 225/239] Linting --- .../editor/metadataEditor/metadataEditor.jsx | 2 +- client/homebrew/navbar/error-navitem.jsx | 2 +- server/homebrew.api.js | 2 +- server/homebrew.api.spec.js | 126 +++++++++--------- shared/helpers.js | 16 +-- 5 files changed, 74 insertions(+), 74 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 944c4d88a..4b48c2617 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -225,7 +225,7 @@ const MetadataEditor = createClass({ dropdown =
    {currentTheme.author ?? _.upperFirst(currentRenderer)} : {currentTheme.name}
    - + {listThemes(currentRenderer)}
    ; } diff --git a/client/homebrew/navbar/error-navitem.jsx b/client/homebrew/navbar/error-navitem.jsx index 652959459..5dd5c1eb9 100644 --- a/client/homebrew/navbar/error-navitem.jsx +++ b/client/homebrew/navbar/error-navitem.jsx @@ -111,7 +111,7 @@ const ErrorNavItem = createClass({ Looks like there was a problem retreiving the theme, or a theme that it inherits, for this brew. Verify that brew - {response.body.brewId} still exists! + {response.body.brewId} still exists!
    ; } diff --git a/server/homebrew.api.js b/server/homebrew.api.js index c8e4996cb..c7484da92 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -272,7 +272,7 @@ const api = { await api.getBrew('share')(req, res, ()=>{}) .catch((err)=>{ if(err.HBErrorCode == '05') - err = {...err, name: 'ThemeLoad Error', message: 'Theme Not Found', HBErrorCode: '09'}; + err = { ...err, name: 'ThemeLoad Error', message: 'Theme Not Found', HBErrorCode: '09' }; throw err; }); diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 273900ee2..679301294 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -581,118 +581,118 @@ brew`); }); }); - describe('Theme bundle', () => { - it('should return Theme Bundle for a User Theme', async () => { + describe('Theme bundle', ()=>{ + it('should return Theme Bundle for a User Theme', async ()=>{ const brews = { - userThemeAID: { title: 'User Theme A', renderer: 'V3', theme: null, shareId: 'userThemeAID', style: 'User Theme A Style' } + userThemeAID : { title: 'User Theme A', renderer: 'V3', theme: null, shareId: 'userThemeAID', style: 'User Theme A Style' } }; - const toBrewPromise = (brew) => new Promise((res) => res({ toObject: () => brew })); - model.get = jest.fn((getParams) => toBrewPromise(brews[getParams.shareId])); - const req = { params: { renderer: "V3", id: "userThemeAID" }, get: () => { return 'localhost'; }, protocol: 'https' }; + const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); + model.get = jest.fn((getParams)=>toBrewPromise(brews[getParams.shareId])); + const req = { params: { renderer: 'V3', id: 'userThemeAID' }, get: ()=>{ return 'localhost'; }, protocol: 'https' }; await api.getThemeBundle(req, res); expect(res.status).toHaveBeenCalledWith(200); expect(res.send).toHaveBeenCalledWith({ - styles: ["/* From Brew: https://localhost/share/userThemeAID */\n\nUser Theme A Style"], - snippets: [] + styles : ['/* From Brew: https://localhost/share/userThemeAID */\n\nUser Theme A Style'], + snippets : [] }); }); - it('should return Theme Bundle for nested User Themes', async () => { + it('should return Theme Bundle for nested User Themes', async ()=>{ const brews = { - userThemeAID: { title: 'User Theme A', renderer: 'V3', theme: 'userThemeBID', shareId: 'userThemeAID', style: 'User Theme A Style' }, - userThemeBID: { title: 'User Theme B', renderer: 'V3', theme: 'userThemeCID', shareId: 'userThemeBID', style: 'User Theme B Style' }, - userThemeCID: { title: 'User Theme C', renderer: 'V3', theme: null, shareId: 'userThemeCID', style: 'User Theme C Style' } + userThemeAID : { title: 'User Theme A', renderer: 'V3', theme: 'userThemeBID', shareId: 'userThemeAID', style: 'User Theme A Style' }, + userThemeBID : { title: 'User Theme B', renderer: 'V3', theme: 'userThemeCID', shareId: 'userThemeBID', style: 'User Theme B Style' }, + userThemeCID : { title: 'User Theme C', renderer: 'V3', theme: null, shareId: 'userThemeCID', style: 'User Theme C Style' } }; - const toBrewPromise = (brew) => new Promise((res) => res({ toObject: () => brew })); - model.get = jest.fn((getParams) => toBrewPromise(brews[getParams.shareId])); - const req = { params: { renderer: "V3", id: "userThemeAID" }, get: () => { return 'localhost'; }, protocol: 'https' }; + const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); + model.get = jest.fn((getParams)=>toBrewPromise(brews[getParams.shareId])); + const req = { params: { renderer: 'V3', id: 'userThemeAID' }, get: ()=>{ return 'localhost'; }, protocol: 'https' }; await api.getThemeBundle(req, res); expect(res.status).toHaveBeenCalledWith(200); expect(res.send).toHaveBeenCalledWith({ - styles: [ - "/* From Brew: https://localhost/share/userThemeCID */\n\nUser Theme C Style", - "/* From Brew: https://localhost/share/userThemeBID */\n\nUser Theme B Style", - "/* From Brew: https://localhost/share/userThemeAID */\n\nUser Theme A Style" - ], - snippets: [] + styles : [ + '/* From Brew: https://localhost/share/userThemeCID */\n\nUser Theme C Style', + '/* From Brew: https://localhost/share/userThemeBID */\n\nUser Theme B Style', + '/* From Brew: https://localhost/share/userThemeAID */\n\nUser Theme A Style' + ], + snippets : [] }); }); - it('should return Theme Bundle for a Static Theme', async () => { - const req = { params: { renderer: "V3", id: "5ePHB" }, get: () => { return 'localhost'; }, protocol: 'https' }; + it('should return Theme Bundle for a Static Theme', async ()=>{ + const req = { params: { renderer: 'V3', id: '5ePHB' }, get: ()=>{ return 'localhost'; }, protocol: 'https' }; await api.getThemeBundle(req, res); expect(res.status).toHaveBeenCalledWith(200); expect(res.send).toHaveBeenCalledWith({ - styles: [ - `/* From Theme Blank */\n\n@import url("/themes/V3/Blank/style.css");`, - `/* From Theme 5ePHB */\n\n@import url("/themes/V3/5ePHB/style.css");` - ], - snippets: [ - "V3_Blank", - "V3_5ePHB" - ] + styles : [ + `/* From Theme Blank */\n\n@import url("/themes/V3/Blank/style.css");`, + `/* From Theme 5ePHB */\n\n@import url("/themes/V3/5ePHB/style.css");` + ], + snippets : [ + 'V3_Blank', + 'V3_5ePHB' + ] }); }); - it('should return Theme Bundle for nested User and Static Themes together', async () => { + it('should return Theme Bundle for nested User and Static Themes together', async ()=>{ const brews = { - userThemeAID: { title: 'User Theme A', renderer: 'V3', theme: 'userThemeBID', shareId: 'userThemeAID', style: 'User Theme A Style' }, - userThemeBID: { title: 'User Theme B', renderer: 'V3', theme: 'userThemeCID', shareId: 'userThemeBID', style: 'User Theme B Style' }, - userThemeCID: { title: 'User Theme C', renderer: 'V3', theme: '5eDMG', shareId: 'userThemeCID', style: 'User Theme C Style' } + userThemeAID : { title: 'User Theme A', renderer: 'V3', theme: 'userThemeBID', shareId: 'userThemeAID', style: 'User Theme A Style' }, + userThemeBID : { title: 'User Theme B', renderer: 'V3', theme: 'userThemeCID', shareId: 'userThemeBID', style: 'User Theme B Style' }, + userThemeCID : { title: 'User Theme C', renderer: 'V3', theme: '5eDMG', shareId: 'userThemeCID', style: 'User Theme C Style' } }; - const toBrewPromise = (brew) => new Promise((res) => res({ toObject: () => brew })); - model.get = jest.fn((getParams) => toBrewPromise(brews[getParams.shareId])); - const req = { params: { renderer: "V3", id: "userThemeAID" }, get: () => { return 'localhost'; }, protocol: 'https' }; + const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); + model.get = jest.fn((getParams)=>toBrewPromise(brews[getParams.shareId])); + const req = { params: { renderer: 'V3', id: 'userThemeAID' }, get: ()=>{ return 'localhost'; }, protocol: 'https' }; await api.getThemeBundle(req, res); expect(res.status).toHaveBeenCalledWith(200); expect(res.send).toHaveBeenCalledWith({ - styles: [ - `/* From Theme Blank */\n\n@import url("/themes/V3/Blank/style.css");`, - `/* From Theme 5ePHB */\n\n@import url("/themes/V3/5ePHB/style.css");`, - `/* From Theme 5eDMG */\n\n@import url("/themes/V3/5eDMG/style.css");`, - "/* From Brew: https://localhost/share/userThemeCID */\n\nUser Theme C Style", - "/* From Brew: https://localhost/share/userThemeBID */\n\nUser Theme B Style", - "/* From Brew: https://localhost/share/userThemeAID */\n\nUser Theme A Style" - ], - snippets: [ - "V3_Blank", - "V3_5ePHB", - "V3_5eDMG" - ] + styles : [ + `/* From Theme Blank */\n\n@import url("/themes/V3/Blank/style.css");`, + `/* From Theme 5ePHB */\n\n@import url("/themes/V3/5ePHB/style.css");`, + `/* From Theme 5eDMG */\n\n@import url("/themes/V3/5eDMG/style.css");`, + '/* From Brew: https://localhost/share/userThemeCID */\n\nUser Theme C Style', + '/* From Brew: https://localhost/share/userThemeBID */\n\nUser Theme B Style', + '/* From Brew: https://localhost/share/userThemeAID */\n\nUser Theme A Style' + ], + snippets : [ + 'V3_Blank', + 'V3_5ePHB', + 'V3_5eDMG' + ] }); }); it('should fail for an invalid Theme in the chain', async()=>{ const brews = { - userThemeAID: { title: 'User Theme A', renderer: 'V3', theme: 'missingTheme', shareId: 'userThemeAID', style: 'User Theme A Style' }, + userThemeAID : { title: 'User Theme A', renderer: 'V3', theme: 'missingTheme', shareId: 'userThemeAID', style: 'User Theme A Style' }, }; - const toBrewPromise = (brew) => new Promise((res) => res({ toObject: () => brew })); - model.get = jest.fn((getParams) => toBrewPromise(brews[getParams.shareId])); - const req = { params: { renderer: "V3", id: "userThemeAID" }, get: () => { return 'localhost'; }, protocol: 'https' }; + const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew })); + model.get = jest.fn((getParams)=>toBrewPromise(brews[getParams.shareId])); + const req = { params: { renderer: 'V3', id: 'userThemeAID' }, get: ()=>{ return 'localhost'; }, protocol: 'https' }; - let err + let err; await api.getThemeBundle(req, res) - .catch(e => err = e); + .catch((e)=>err = e); expect(err).toEqual({ - HBErrorCode : "09", - accessType : "share", - brewId : "missingTheme", - message : "Theme Not Found", - name : "ThemeLoad Error", - status : 404}); + HBErrorCode : '09', + accessType : 'share', + brewId : 'missingTheme', + message : 'Theme Not Found', + name : 'ThemeLoad Error', + status : 404 }); }); }); diff --git a/shared/helpers.js b/shared/helpers.js index 90d0004b4..e5c1b7769 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -34,19 +34,19 @@ const printCurrentBrew = ()=>{ } }; -const fetchThemeBundle = async (obj, renderer, theme) => { +const fetchThemeBundle = async (obj, renderer, theme)=>{ const res = await request .get(`/api/theme/${renderer}/${theme}`) - .catch((err) => { - obj.setState({ error: err }); + .catch((err)=>{ + obj.setState({ error: err }); }); - if (!res) return; + if(!res) return; const themeBundle = res.body; - themeBundle.joinedStyles = themeBundle.styles.map((style) => ``).join('\n\n'); - obj.setState((prevState) => ({ - ...prevState, - themeBundle: themeBundle + themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); + obj.setState((prevState)=>({ + ...prevState, + themeBundle : themeBundle })); }; From 32fa50d608fc0d473949467f11fd6a9dd82857b2 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Mon, 29 Jul 2024 12:30:13 -0400 Subject: [PATCH 226/239] Fallback to showing "Blank" theme if themes fail to load. --- client/homebrew/brewRenderer/brewRenderer.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index cdbbfc157..4b82c6bc0 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -125,7 +125,8 @@ const BrewRenderer = (props)=>{ const renderStyle = ()=>{ const cleanStyle = props.style; //DOMPurify.sanitize(props.style, purifyConfig); - return
    ${cleanStyle} ` }} />; + const themeStyles = props.themeBundle?.joinedStyles ?? ''; + return
    ${cleanStyle} ` }} />; }; const renderPage = (pageText, index)=>{ From 9cc81d2ff928f2f6082e5b30504227ac0335226a Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Mon, 29 Jul 2024 21:52:09 -0400 Subject: [PATCH 227/239] Up to v3.14.0 --- changelog.md | 30 ++++++++++++++++++++++++++++-- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/changelog.md b/changelog.md index b331fc4f0..0cdb89c29 100644 --- a/changelog.md +++ b/changelog.md @@ -84,6 +84,34 @@ pre { ## changelog For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery). +### Monday 7/29/2024 - v3.14.0 +{{taskList + +##### abquintic, calculuschild + +* [x] Alternative Brew Themes, including importing other brews as a base theme. + +- In the :fas_circle_info: **Properties** menu, find the new {{openSans **THEME**}} dropdown. It lists Brew Themes, including a new **Blank** theme as a simpler basis for custom styling. +- Brews tagged with `meta:theme` will appear in the Brew Themes list. Selecting one loads its :fas_paintbrush: **Style** tab contents as the CSS basis for the current brew, allowing one brew to style multiple documents. +- Brews with `meta:theme` can also select their own Theme, i.e. layering Themes on top of each other. +- The next goal is to make **Published** Themes shareable between users. + + +Fixes issues [#1899](https://github.com/naturalcrit/homebrewery/issues/1899), [#3085](https://github.com/naturalcrit/homebrewery/issues/3085) + +##### G-Ambatte + +* [x] Fix Drop-cap font becoming corrupted when Bold + +Fixes issues [#3551](https://github.com/naturalcrit/homebrewery/issues/3551) + +* [x] Fixes to UI styling + +Fixes issues [#3568](https://github.com/naturalcrit/homebrewery/issues/3568) + +}} + + ### Saturday 6/7/2024 - v3.13.1 {{taskList @@ -131,8 +159,6 @@ Fixes issue [#3298](https://github.com/naturalcrit/homebrewery/issues/3298) Fixes issue [#3397](https://github.com/naturalcrit/homebrewery/issues/3397) }} -\column - ### Monday 18/3/2024 - v3.12.0 {{taskList diff --git a/package-lock.json b/package-lock.json index cce4d5577..64ce3c77c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "homebrewery", - "version": "3.13.1", + "version": "3.14.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "homebrewery", - "version": "3.13.1", + "version": "3.14.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 321f9afbe..2aa695228 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "homebrewery", "description": "Create authentic looking D&D homebrews using only markdown", - "version": "3.13.1", + "version": "3.14.0", "engines": { "npm": "^10.2.x", "node": "^20.8.x" From 4f950b6024cc1b25f00869c7b11242301521dad6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jul 2024 03:27:04 +0000 Subject: [PATCH 228/239] Bump @babel/core from 7.24.7 to 7.25.2 Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.24.7 to 7.25.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.25.2/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 170 ++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 84 insertions(+), 88 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64ce3c77c..14b03f9b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.24.7", + "@babel/core": "^7.25.2", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.7", "@babel/preset-react": "^7.24.7", @@ -101,28 +101,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -143,11 +143,11 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -193,13 +193,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -319,15 +319,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -423,9 +422,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "engines": { "node": ">=6.9.0" } @@ -439,9 +438,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "engines": { "node": ">=6.9.0" } @@ -461,12 +460,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -487,9 +486,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", + "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1772,31 +1771,28 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.2.tgz", + "integrity": "sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1805,11 +1801,11 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -4291,9 +4287,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", "funding": [ { "type": "opencollective", @@ -4309,10 +4305,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -4478,9 +4474,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001599", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", - "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", + "version": "1.0.30001643", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", + "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==", "funding": [ { "type": "opencollective", @@ -5524,9 +5520,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.711", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.711.tgz", - "integrity": "sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==" + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.3.tgz", + "integrity": "sha512-QNdYSS5i8D9axWp/6XIezRObRHqaav/ur9z1VzCDUCH1XIFOr9WQk5xmgunhsTpjjgDy3oLxO/WMOVZlpUQrlA==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -5750,9 +5746,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -11582,9 +11578,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -14435,9 +14431,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -14453,8 +14449,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" diff --git a/package.json b/package.json index 7f07d8164..08bab38c6 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ ] }, "dependencies": { - "@babel/core": "^7.24.7", + "@babel/core": "^7.25.2", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.7", "@babel/preset-react": "^7.24.7", From fac0d151b637b60eb566178046692081f125bc11 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jul 2024 03:27:30 +0000 Subject: [PATCH 229/239] Bump @babel/preset-env from 7.24.7 to 7.25.2 Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.24.7 to 7.25.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.25.2/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 419 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 217 insertions(+), 204 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64ce3c77c..ac8ea13b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@babel/core": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-env": "^7.24.7", + "@babel/preset-env": "^7.25.2", "@babel/preset-react": "^7.24.7", "@googleapis/drive": "^8.11.0", "body-parser": "^1.20.2", @@ -101,9 +101,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "engines": { "node": ">=6.9.0" } @@ -143,11 +143,11 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -193,13 +193,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -230,9 +230,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", @@ -283,24 +283,13 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -319,15 +308,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -348,21 +336,21 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -372,13 +360,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -423,9 +411,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "engines": { "node": ">=6.9.0" } @@ -439,22 +427,21 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dependencies": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -487,9 +474,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", + "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -498,12 +485,26 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.0.tgz", + "integrity": "sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -513,11 +514,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -543,12 +544,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -841,14 +842,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", + "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -888,11 +889,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -933,17 +934,15 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", - "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", + "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.0", "globals": "^11.1.0" }, "engines": { @@ -969,11 +968,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", - "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1011,6 +1010,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", @@ -1072,13 +1086,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -1103,11 +1117,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1161,12 +1175,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-simple-access": "^7.24.7" }, "engines": { @@ -1177,14 +1191,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dependencies": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1315,11 +1329,11 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", - "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1557,11 +1571,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", - "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1630,18 +1644,19 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", - "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.2.tgz", + "integrity": "sha512-Y2Vkwy3ITW4id9c6KXshVV/x5yCGK7VdJmKkzOzNsDZMojRKfSA/033rRbLqlRozmhRXCejxWHLSJOg/wUHfzw==", "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/compat-data": "^7.25.2", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.0", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1662,29 +1677,30 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.0", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.24.7", "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.0", "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-dotall-regex": "^7.24.7", "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", "@babel/plugin-transform-dynamic-import": "^7.24.7", "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", "@babel/plugin-transform-modules-umd": "^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-new-target": "^7.24.7", @@ -1693,7 +1709,7 @@ "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-object-super": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", @@ -1704,7 +1720,7 @@ "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", "@babel/plugin-transform-unicode-escapes": "^7.24.7", "@babel/plugin-transform-unicode-property-regex": "^7.24.7", "@babel/plugin-transform-unicode-regex": "^7.24.7", @@ -1713,7 +1729,7 @@ "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", + "core-js-compat": "^3.37.1", "semver": "^6.3.1" }, "engines": { @@ -1772,31 +1788,28 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.2.tgz", + "integrity": "sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1805,11 +1818,11 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -4291,9 +4304,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", "funding": [ { "type": "opencollective", @@ -4309,10 +4322,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -4478,9 +4491,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001599", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", - "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", + "version": "1.0.30001643", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", + "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==", "funding": [ { "type": "opencollective", @@ -4841,9 +4854,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dependencies": { "browserslist": "^4.23.0" }, @@ -5524,9 +5537,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.711", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.711.tgz", - "integrity": "sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==" + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.3.tgz", + "integrity": "sha512-QNdYSS5i8D9axWp/6XIezRObRHqaav/ur9z1VzCDUCH1XIFOr9WQk5xmgunhsTpjjgDy3oLxO/WMOVZlpUQrlA==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -5750,9 +5763,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -11582,9 +11595,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -14435,9 +14448,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -14453,8 +14466,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" diff --git a/package.json b/package.json index 7f07d8164..57b6bb4f9 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "dependencies": { "@babel/core": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-env": "^7.24.7", + "@babel/preset-env": "^7.25.2", "@babel/preset-react": "^7.24.7", "@googleapis/drive": "^8.11.0", "body-parser": "^1.20.2", From 1abced20d673c86aac1ba84725a9392ceeaefafd Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 31 Jul 2024 16:53:34 -0400 Subject: [PATCH 230/239] Do not fetch user themes if there is no user. --- server/homebrew.api.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index c7484da92..569d35202 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -46,6 +46,9 @@ const api = { }, //Get array of any of this user's brews tagged with `meta:theme` getUsersBrewThemes : async (username)=>{ + if(!username) + return {}; + const fields = [ 'title', 'tags', @@ -251,16 +254,12 @@ const api = { res.status(200).send(saved); }, getThemeBundle : async(req, res)=>{ - /* - getThemeBundle: Collects the theme and all parent themes - returns an object containing an array of css, in render order, and an array - of snippets ( currently empty ) - Important parameter members: - req.params.id: This is the shareId ( User theme ) or name ( static theme ) - loaded first. - req.params.renderer: This is the Markdown+ version for the static theme. If a - User theme the value will come from the User Theme metadata. - */ + /* getThemeBundle: Collects the theme and all parent themes + returns an object containing an array of css, and an array of snippets, in render order + + req.params.id : The shareId ( User theme ) or name ( static theme ) + req.params.renderer : The Markdown renderer used for this theme */ + req.params.renderer = _.upperFirst(req.params.renderer); let currentTheme; const completeStyles = []; From 27a4831ea0cf92bac593ca9c7804efee0414f14d Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 31 Jul 2024 16:53:54 -0400 Subject: [PATCH 231/239] Add a theme to our reference pages (changelog, FAQ, migrate) --- server/app.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/server/app.js b/server/app.js index 6863bc7cb..b419c5cea 100644 --- a/server/app.js +++ b/server/app.js @@ -115,7 +115,8 @@ app.get('/legacy', (req, res, next)=>{ app.get('/migrate', (req, res, next)=>{ req.brew = { text : migrateText, - renderer : 'V3' + renderer : 'V3', + theme : '5ePHB' }, req.ogMeta = { ...defaultMetaTags, @@ -132,7 +133,8 @@ app.get('/changelog', async (req, res, next)=>{ req.brew = { title : 'Changelog', text : changelogText, - renderer : 'V3' + renderer : 'V3', + theme : '5ePHB' }, req.ogMeta = { ...defaultMetaTags, @@ -149,7 +151,8 @@ app.get('/faq', async (req, res, next)=>{ req.brew = { title : 'FAQ', text : faqText, - renderer : 'V3' + renderer : 'V3', + theme : '5ePHB' }, req.ogMeta = { ...defaultMetaTags, From 915f9aafa843e6fb74f99ce64452cc856cbcb88e Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 31 Jul 2024 17:27:58 -0400 Subject: [PATCH 232/239] restore snippetBundle field somehow lost from /new and /home --- client/homebrew/pages/homePage/homePage.jsx | 1 + client/homebrew/pages/newPage/newPage.jsx | 1 + 2 files changed, 2 insertions(+) diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index bcfd237b4..490b22596 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -95,6 +95,7 @@ const HomePage = createClass({ onTextChange={this.handleTextChange} renderer={this.state.brew.renderer} showEditButtons={false} + snippetBundle={this.state.themeBundle.snippets} /> Date: Wed, 31 Jul 2024 18:13:31 -0400 Subject: [PATCH 233/239] Allow renderer and pagecount into stubs At this point, only text and textbin contents are still in google drive. Which is the majority of the file still. Renderer and Pagecount may become useful for Vault page, and Renderer is needed for themes. --- server/homebrew.api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 569d35202..c314454e2 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -186,7 +186,7 @@ const api = { return modified; }, excludeStubProps : (brew)=>{ - const propsToExclude = ['text', 'textBin', 'renderer', 'pageCount']; + const propsToExclude = ['text', 'textBin']; for (const prop of propsToExclude) { brew[prop] = undefined; } From 26fdc1ba9137789f31f662ecb4be0025acf282db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 23:33:27 +0000 Subject: [PATCH 234/239] Bump mongoose from 8.4.5 to 8.5.2 Bumps [mongoose](https://github.com/Automattic/mongoose) from 8.4.5 to 8.5.2. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/8.4.5...8.5.2) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 28 ++++++++++++++-------------- package.json | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78ad6acde..8b0ee30f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", - "mongoose": "^8.4.5", + "mongoose": "^8.5.2", "nanoid": "3.3.4", "nconf": "^0.12.1", "react": "^18.3.1", @@ -2817,9 +2817,9 @@ } }, "node_modules/@mongodb-js/saslprep": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.7.tgz", - "integrity": "sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.8.tgz", + "integrity": "sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==", "dependencies": { "sparse-bitfield": "^3.0.3" } @@ -4327,9 +4327,9 @@ } }, "node_modules/bson": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.7.0.tgz", - "integrity": "sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz", + "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==", "engines": { "node": ">=16.20.1" } @@ -10655,13 +10655,13 @@ } }, "node_modules/mongoose": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.5.tgz", - "integrity": "sha512-E5KjBThxST2uFSKKXuiMa9H9Zx4DLTSLuxodAnIzJRixNwc1ARTlJUK1m0a80EB+ZKGP4QNTasyUYRG9DUSHOA==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.5.2.tgz", + "integrity": "sha512-GZB4rHMdYfGatV+23IpCrqFbyCOjCNOHXgWbirr92KRwTEncBrtW3kgU9vmpKjsGf7nMmnAy06SwWUv1vhDkSg==", "dependencies": { "bson": "^6.7.0", "kareem": "2.6.3", - "mongodb": "6.6.2", + "mongodb": "6.7.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", @@ -10733,9 +10733,9 @@ } }, "node_modules/mongoose/node_modules/mongodb": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.2.tgz", - "integrity": "sha512-ZF9Ugo2JCG/GfR7DEb4ypfyJJyiKbg5qBYKRintebj8+DNS33CyGMkWbrS9lara+u+h+yEOGSRiLhFO/g1s1aw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.7.0.tgz", + "integrity": "sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==", "dependencies": { "@mongodb-js/saslprep": "^1.1.5", "bson": "^6.7.0", diff --git a/package.json b/package.json index 4600acce0..0ae7a0e2f 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", - "mongoose": "^8.4.5", + "mongoose": "^8.5.2", "nanoid": "3.3.4", "nconf": "^0.12.1", "react": "^18.3.1", From 7949df1865357a94933f5765572300dad2a294af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 23:35:06 +0000 Subject: [PATCH 235/239] Bump react-router-dom from 6.24.1 to 6.25.1 Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.24.1 to 6.25.1. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.25.1/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 26 +++++++++++++------------- package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 61dfd86b4..30a787b37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-frame-component": "^4.1.3", - "react-router-dom": "6.24.1", + "react-router-dom": "6.25.1", "sanitize-filename": "1.6.3", "superagent": "^9.0.2", "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" @@ -2877,9 +2877,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.1.tgz", - "integrity": "sha512-mCOMec4BKd6BRGBZeSnGiIgwsbLGp3yhVqAD8H+PxiRNEHgDpZb8J1TnrSDlg97t0ySKMQJTHCWBCmBpSmkF6Q==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz", + "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==", "engines": { "node": ">=14.0.0" } @@ -12106,11 +12106,11 @@ "dev": true }, "node_modules/react-router": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.1.tgz", - "integrity": "sha512-PTXFXGK2pyXpHzVo3rR9H7ip4lSPZZc0bHG5CARmj65fTT6qG7sTngmb6lcYu1gf3y/8KxORoy9yn59pGpCnpg==", + "version": "6.25.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.25.1.tgz", + "integrity": "sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==", "dependencies": { - "@remix-run/router": "1.17.1" + "@remix-run/router": "1.18.0" }, "engines": { "node": ">=14.0.0" @@ -12120,12 +12120,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.1.tgz", - "integrity": "sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==", + "version": "6.25.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.25.1.tgz", + "integrity": "sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==", "dependencies": { - "@remix-run/router": "1.17.1", - "react-router": "6.24.1" + "@remix-run/router": "1.18.0", + "react-router": "6.25.1" }, "engines": { "node": ">=14.0.0" diff --git a/package.json b/package.json index 058c4a81e..797280f5f 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-frame-component": "^4.1.3", - "react-router-dom": "6.24.1", + "react-router-dom": "6.25.1", "sanitize-filename": "1.6.3", "superagent": "^9.0.2", "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" From fc67a40167687b36b97767da4ea1b65166a9c24d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 23:35:07 +0000 Subject: [PATCH 236/239] Bump eslint-plugin-react from 7.34.3 to 7.35.0 Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.34.3 to 7.35.0. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.34.3...v7.35.0) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 55 ++++++++++++++++------------------------------- package.json | 2 +- 2 files changed, 19 insertions(+), 38 deletions(-) diff --git a/package-lock.json b/package-lock.json index 61dfd86b4..d27796f0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "devDependencies": { "eslint": "^8.57.0", "eslint-plugin-jest": "^28.6.0", - "eslint-plugin-react": "^7.34.3", + "eslint-plugin-react": "^7.35.0", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", "postcss-less": "^6.0.0", @@ -3507,18 +3507,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", @@ -5864,35 +5852,35 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", - "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", "dev": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", - "object.hasown": "^1.1.4", "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11" + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react/node_modules/doctrine": { @@ -11292,23 +11280,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -13441,6 +13412,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", diff --git a/package.json b/package.json index 058c4a81e..813e5d225 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "devDependencies": { "eslint": "^8.57.0", "eslint-plugin-jest": "^28.6.0", - "eslint-plugin-react": "^7.34.3", + "eslint-plugin-react": "^7.35.0", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", "postcss-less": "^6.0.0", From e7108947d670bc9e6b93062d9a926571bc7d4651 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 1 Aug 2024 13:24:23 +1200 Subject: [PATCH 237/239] Fix expected values for pageCount and renderer --- server/homebrew.api.spec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 679301294..5f1739b97 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -408,8 +408,8 @@ brew`); expect(sent).not.toEqual(googleBrew); expect(result.text).toBeUndefined(); expect(result.textBin).toBeUndefined(); - expect(result.renderer).toBeUndefined(); - expect(result.pageCount).toBeUndefined(); + expect(result.renderer).toBe('v3'); + expect(result.pageCount).toBe(1); }); }); @@ -540,9 +540,9 @@ brew`); description : '', editId : expect.any(String), gDrive : false, - pageCount : undefined, + pageCount : 1, published : false, - renderer : undefined, + renderer : 'V3', lang : 'en', shareId : expect.any(String), googleId : expect.any(String), From 7fce362a5253bcdfd882964a49937667a4a10686 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 03:47:39 +0000 Subject: [PATCH 238/239] Bump @babel/preset-env from 7.25.2 to 7.25.3 Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.25.2 to 7.25.3. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.25.3/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 35 +++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0480c07b6..284841d76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-env": "^7.25.2", + "@babel/preset-env": "^7.25.3", "@babel/preset-react": "^7.24.7", "@googleapis/drive": "^8.11.0", "body-parser": "^1.20.2", @@ -474,9 +474,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", - "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -485,12 +488,12 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.0.tgz", - "integrity": "sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.3" }, "engines": { "node": ">=6.9.0" @@ -1644,15 +1647,15 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.2.tgz", - "integrity": "sha512-Y2Vkwy3ITW4id9c6KXshVV/x5yCGK7VdJmKkzOzNsDZMojRKfSA/033rRbLqlRozmhRXCejxWHLSJOg/wUHfzw==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", + "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", "dependencies": { "@babel/compat-data": "^7.25.2", "@babel/helper-compilation-targets": "^7.25.2", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.0", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", @@ -1801,13 +1804,13 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.2.tgz", - "integrity": "sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.0", + "@babel/parser": "^7.25.3", "@babel/template": "^7.25.0", "@babel/types": "^7.25.2", "debug": "^4.3.1", diff --git a/package.json b/package.json index c2f3a41cc..984ff58f3 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-env": "^7.25.2", + "@babel/preset-env": "^7.25.3", "@babel/preset-react": "^7.24.7", "@googleapis/drive": "^8.11.0", "body-parser": "^1.20.2", From c77395149b48e6b341e36a58f5d42e74cfe68815 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Thu, 1 Aug 2024 00:46:08 -0400 Subject: [PATCH 239/239] Tweak shadow values to match 5ePHB box-shadows are a little smaller than drop-shadow. This just uses the same values we already found previously so the shadow size is not affected. --- themes/V3/5ePHB/snippets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index 11f08f560..4daa05c51 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -349,7 +349,7 @@ module.exports = [ /* Ink Friendly */ *:is(.page,.monster,.note,.descriptive) { background : white !important; - box-shadow : 0px 0px 3px #888 !important; + box-shadow : 1px 4px 14px #888 !important; } .page img {