mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2026-09-23 18:22:57 +00:00
Merge branch 'master' into brewRendererCleanup
This commit is contained in:
@@ -82,6 +82,9 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
name: Test - HTML sanitization
|
name: Test - HTML sanitization
|
||||||
command: npm run test:safehtml
|
command: npm run test:safehtml
|
||||||
|
- run:
|
||||||
|
name: Test - Helpers
|
||||||
|
command: npm run test:helpers
|
||||||
- run:
|
- run:
|
||||||
name: Test - Coverage
|
name: Test - Coverage
|
||||||
command: npm run test:coverage
|
command: npm run test:coverage
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import 'core-js/es/string/to-well-formed.js'; // Polyfill for older browsers
|
import 'core-js/es/string/to-well-formed.js'; // Polyfill for older browsers
|
||||||
import './homebrew.less';
|
import './homebrew.less';
|
||||||
import React from 'react';
|
|
||||||
import { BrowserRouter as Router, Routes, Route, useParams, useSearchParams } from 'react-router';
|
import { BrowserRouter as Router, Routes, Route, useParams, useSearchParams } from 'react-router';
|
||||||
|
|
||||||
import { updateLocalStorage } from './utils/updateLocalStorage/updateLocalStorageKeys.js';
|
import { updateLocalStorage } from './utils/updateLocalStorage/updateLocalStorageKeys.js';
|
||||||
|
|||||||
@@ -16,8 +16,9 @@ import { DEFAULT_BREW_LOAD } from '../../../../server/brewDefaults.js';
|
|||||||
import { printCurrentBrew, fetchThemeBundle } from '@shared/helpers.js';
|
import { printCurrentBrew, fetchThemeBundle } from '@shared/helpers.js';
|
||||||
|
|
||||||
const SharePage = (props)=>{
|
const SharePage = (props)=>{
|
||||||
const { brew = DEFAULT_BREW_LOAD, disableMeta = false } = props;
|
const { disableMeta = false } = props;
|
||||||
|
|
||||||
|
const [currentBrew, setCurrentBrew] = useState(props.brew || DEFAULT_BREW_LOAD);
|
||||||
const [themeBundle, setThemeBundle] = useState({});
|
const [themeBundle, setThemeBundle] = useState({});
|
||||||
const [currentBrewRendererPageNum, setCurrentBrewRendererPageNum] = useState(1);
|
const [currentBrewRendererPageNum, setCurrentBrewRendererPageNum] = useState(1);
|
||||||
|
|
||||||
@@ -37,7 +38,20 @@ const SharePage = (props)=>{
|
|||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
document.addEventListener('keydown', handleControlKeys);
|
document.addEventListener('keydown', handleControlKeys);
|
||||||
fetchThemeBundle(undefined, setThemeBundle, brew.renderer, brew.theme);
|
fetchThemeBundle(undefined, setThemeBundle, currentBrew.renderer, currentBrew.theme);
|
||||||
|
|
||||||
|
// listen for changes in the brew version
|
||||||
|
const eventSource = new EventSource('/stream');
|
||||||
|
eventSource.addEventListener('message', (evt)=>{
|
||||||
|
const messageData = JSON.parse(evt.data);
|
||||||
|
|
||||||
|
if(messageData.eventType == 'brewUpdated'){
|
||||||
|
if(messageData.shareId == currentBrew.shareId && messageData.version != currentBrew.version) {
|
||||||
|
console.log(`brew has been updated, viewing ${currentBrew.version}, new version is ${messageData.version}`);
|
||||||
|
console.log('should fetch brew');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return ()=>{
|
return ()=>{
|
||||||
document.removeEventListener('keydown', handleControlKeys);
|
document.removeEventListener('keydown', handleControlKeys);
|
||||||
@@ -45,13 +59,13 @@ const SharePage = (props)=>{
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const processShareId = ()=>{
|
const processShareId = ()=>{
|
||||||
return brew.googleId && !brew.stubbed ? brew.googleId + brew.shareId : brew.shareId;
|
return currentBrew.googleId && !currentBrew.stubbed ? currentBrew.googleId + currentBrew.shareId : currentBrew.shareId;
|
||||||
};
|
};
|
||||||
|
|
||||||
const renderEditLink = ()=>{
|
const renderEditLink = ()=>{
|
||||||
if(!brew.editId) return null;
|
if(!currentBrew.editId) return null;
|
||||||
|
|
||||||
const editLink = brew.googleId && ! brew.stubbed ? brew.googleId + brew.editId : brew.editId;
|
const editLink = currentBrew.googleId && ! currentBrew.stubbed ? currentBrew.googleId + currentBrew.editId : currentBrew.editId;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Nav.item color='orange' icon='fas fa-pencil-alt' href={`/edit/${editLink}`}>
|
<Nav.item color='orange' icon='fas fa-pencil-alt' href={`/edit/${editLink}`}>
|
||||||
@@ -62,7 +76,7 @@ const SharePage = (props)=>{
|
|||||||
|
|
||||||
const titleEl = (
|
const titleEl = (
|
||||||
<Nav.item className='brewTitle' style={disableMeta ? { cursor: 'default' } : {}}>
|
<Nav.item className='brewTitle' style={disableMeta ? { cursor: 'default' } : {}}>
|
||||||
{brew.title}
|
{currentBrew.title}
|
||||||
</Nav.item>
|
</Nav.item>
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -71,11 +85,11 @@ const SharePage = (props)=>{
|
|||||||
<Meta name='robots' content='noindex, nofollow' />
|
<Meta name='robots' content='noindex, nofollow' />
|
||||||
<Navbar>
|
<Navbar>
|
||||||
<Nav.section className='titleSection'>
|
<Nav.section className='titleSection'>
|
||||||
{disableMeta ? titleEl : <MetadataNav brew={brew}>{titleEl}</MetadataNav>}
|
{disableMeta ? titleEl : <MetadataNav brew={currentBrew}>{titleEl}</MetadataNav>}
|
||||||
</Nav.section>
|
</Nav.section>
|
||||||
|
|
||||||
<Nav.section>
|
<Nav.section>
|
||||||
{brew.shareId && (
|
{currentBrew.shareId && (
|
||||||
<>
|
<>
|
||||||
<PrintNavItem />
|
<PrintNavItem />
|
||||||
<Nav.dropdown>
|
<Nav.dropdown>
|
||||||
@@ -108,18 +122,18 @@ const SharePage = (props)=>{
|
|||||||
</Nav.dropdown>
|
</Nav.dropdown>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
<RecentNavItem brew={brew} storageKey='view' />
|
<RecentNavItem brew={currentBrew} storageKey='view' />
|
||||||
<Account />
|
<Account />
|
||||||
</Nav.section>
|
</Nav.section>
|
||||||
</Navbar>
|
</Navbar>
|
||||||
|
|
||||||
<div className='content'>
|
<div className='content'>
|
||||||
<BrewRenderer
|
<BrewRenderer
|
||||||
text={brew.text}
|
text={currentBrew.text}
|
||||||
style={brew.style}
|
style={currentBrew.style}
|
||||||
lang={brew.lang}
|
lang={currentBrew.lang}
|
||||||
renderer={brew.renderer}
|
renderer={currentBrew.renderer}
|
||||||
theme={brew.theme}
|
theme={currentBrew.theme}
|
||||||
themeBundle={themeBundle}
|
themeBundle={themeBundle}
|
||||||
onPageChange={handleBrewRendererPageChange}
|
onPageChange={handleBrewRendererPageChange}
|
||||||
currentBrewRendererPageNum={currentBrewRendererPageNum}
|
currentBrewRendererPageNum={currentBrewRendererPageNum}
|
||||||
|
|||||||
+19
-18
@@ -39,6 +39,7 @@
|
|||||||
"test:emojis": "jest tests/markdown/emojis.test.js --verbose --noStackTrace",
|
"test:emojis": "jest tests/markdown/emojis.test.js --verbose --noStackTrace",
|
||||||
"test:route": "jest tests/routes/static-pages.test.js --verbose",
|
"test:route": "jest tests/routes/static-pages.test.js --verbose",
|
||||||
"test:safehtml": "jest tests/html/safeHTML.test.js --verbose",
|
"test:safehtml": "jest tests/html/safeHTML.test.js --verbose",
|
||||||
|
"test:helpers": "jest tests/html/helpers.test.js --verbose",
|
||||||
"phb": "node --experimental-require-module scripts/phb.js",
|
"phb": "node --experimental-require-module scripts/phb.js",
|
||||||
"prod": "set NODE_ENV=production && npm run build",
|
"prod": "set NODE_ENV=production && npm run build",
|
||||||
"postinstall": "npm run build",
|
"postinstall": "npm run build",
|
||||||
@@ -86,13 +87,13 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/core": "^8.0.1",
|
"@babel/core": "^8.0.6",
|
||||||
"@babel/plugin-transform-runtime": "^8.0.1",
|
"@babel/plugin-transform-runtime": "^8.0.6",
|
||||||
"@babel/preset-env": "^8.0.2",
|
"@babel/preset-env": "^8.0.6",
|
||||||
"@babel/preset-react": "^8.0.1",
|
"@babel/preset-react": "^8.0.1",
|
||||||
"@babel/runtime": "^8.0.0",
|
"@babel/runtime": "^8.0.5",
|
||||||
"@codemirror/autocomplete": "^6.20.3",
|
"@codemirror/autocomplete": "^6.20.3",
|
||||||
"@codemirror/commands": "^6.11.0",
|
"@codemirror/commands": "^6.11.1",
|
||||||
"@codemirror/highlight": "^0.19.8",
|
"@codemirror/highlight": "^0.19.8",
|
||||||
"@codemirror/lang-css": "^6.3.1",
|
"@codemirror/lang-css": "^6.3.1",
|
||||||
"@codemirror/lang-javascript": "^6.2.5",
|
"@codemirror/lang-javascript": "^6.2.5",
|
||||||
@@ -100,8 +101,8 @@
|
|||||||
"@codemirror/language": "^6.12.2",
|
"@codemirror/language": "^6.12.2",
|
||||||
"@codemirror/language-data": "^6.5.2",
|
"@codemirror/language-data": "^6.5.2",
|
||||||
"@codemirror/search": "^6.6.0",
|
"@codemirror/search": "^6.6.0",
|
||||||
"@codemirror/state": "^6.6.0",
|
"@codemirror/state": "^6.7.5",
|
||||||
"@codemirror/view": "^6.43.9",
|
"@codemirror/view": "^6.43.12",
|
||||||
"@dmsnell/diff-match-patch": "^1.1.0",
|
"@dmsnell/diff-match-patch": "^1.1.0",
|
||||||
"@googleapis/drive": "^21.0.0",
|
"@googleapis/drive": "^21.0.0",
|
||||||
"@lezer/highlight": "^1.2.3",
|
"@lezer/highlight": "^1.2.3",
|
||||||
@@ -110,7 +111,7 @@
|
|||||||
"@vitejs/plugin-react": "^6.0.5",
|
"@vitejs/plugin-react": "^6.0.5",
|
||||||
"body-parser": "^2.3.0",
|
"body-parser": "^2.3.0",
|
||||||
"classnames": "^2.5.1",
|
"classnames": "^2.5.1",
|
||||||
"codemirror-5-themes": "^1.5.1",
|
"codemirror-5-themes": "^1.5.3",
|
||||||
"cookie-parser": "^1.4.7",
|
"cookie-parser": "^1.4.7",
|
||||||
"core-js": "^3.50.0",
|
"core-js": "^3.50.0",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
@@ -118,14 +119,14 @@
|
|||||||
"dedent": "^1.7.2",
|
"dedent": "^1.7.2",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"express-async-handler": "^1.2.0",
|
"express-async-handler": "^1.2.0",
|
||||||
"express-static-gzip": "3.0.1",
|
"express-static-gzip": "3.0.2",
|
||||||
"fflate": "^0.8.3",
|
"fflate": "^0.8.3",
|
||||||
"fs-extra": "^11.3.5",
|
"fs-extra": "^11.3.5",
|
||||||
"hash-wasm": "^4.12.0",
|
"hash-wasm": "^4.12.0",
|
||||||
"idb-keyval": "^6.2.5",
|
"idb-keyval": "^6.2.5",
|
||||||
"js-yaml": "^5.3.0",
|
"js-yaml": "^5.4.2",
|
||||||
"jwt-simple": "^0.5.6",
|
"jwt-simple": "^0.5.6",
|
||||||
"less": "^4.8.1",
|
"less": "^4.9.1",
|
||||||
"lodash": "^4.18.1",
|
"lodash": "^4.18.1",
|
||||||
"marked": "15.0.12",
|
"marked": "15.0.12",
|
||||||
"marked-alignment-paragraphs": "^1.0.0",
|
"marked-alignment-paragraphs": "^1.0.0",
|
||||||
@@ -140,16 +141,16 @@
|
|||||||
"marked-subsuper-text": "^1.0.4",
|
"marked-subsuper-text": "^1.0.4",
|
||||||
"marked-variables": "^1.0.5",
|
"marked-variables": "^1.0.5",
|
||||||
"markedLegacy": "npm:marked@^0.3.19",
|
"markedLegacy": "npm:marked@^0.3.19",
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.31.0",
|
||||||
"mongoose": "^9.9.3",
|
"mongoose": "^9.10.1",
|
||||||
"nanoid": "6.0.1",
|
"nanoid": "6.0.1",
|
||||||
"nconf": "^0.13.0",
|
"nconf": "^0.13.0",
|
||||||
"node": "^26.7.0",
|
"node": "^26.9.0",
|
||||||
"prettier": "^3.8.1",
|
"prettier": "^3.9.8",
|
||||||
"react": "^19.2.7",
|
"react": "^19.3.0",
|
||||||
"react-dom": "^19.2.7",
|
"react-dom": "^19.3.0",
|
||||||
"react-frame-component": "^5.3.2",
|
"react-frame-component": "^5.3.2",
|
||||||
"react-router": "^8.3.0",
|
"react-router": "^8.4.0",
|
||||||
"sanitize-filename": "1.6.4",
|
"sanitize-filename": "1.6.4",
|
||||||
"superagent": "^10.2.1"
|
"superagent": "^10.2.1"
|
||||||
},
|
},
|
||||||
|
|||||||
+26
-3
@@ -1,4 +1,4 @@
|
|||||||
/*eslint max-lines: ["warn", {"max": 500, "skipBlankLines": true, "skipComments": true}]*/
|
/*eslint max-lines: ["warn", {"max": 400, "skipBlankLines": true, "skipComments": true}]*/
|
||||||
// Set working directory to project root
|
// Set working directory to project root
|
||||||
import { dirname } from 'path';
|
import { dirname } from 'path';
|
||||||
import { fileURLToPath } from 'url';
|
import { fileURLToPath } from 'url';
|
||||||
@@ -30,6 +30,8 @@ import contentNegotiation from './middleware/content-negotiation.js';
|
|||||||
import bodyParser from 'body-parser';
|
import bodyParser from 'body-parser';
|
||||||
import cookieParser from 'cookie-parser';
|
import cookieParser from 'cookie-parser';
|
||||||
import forceSSL from './forcessl.mw.js';
|
import forceSSL from './forcessl.mw.js';
|
||||||
|
|
||||||
|
import Stream from './eventStreamSource.js';
|
||||||
import dbCheck from './middleware/dbCheck.js';
|
import dbCheck from './middleware/dbCheck.js';
|
||||||
|
|
||||||
import cors from 'cors';
|
import cors from 'cors';
|
||||||
@@ -124,10 +126,10 @@ export default async function createApp(vite) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
app.use(pageRoutes({
|
app.use(pageRoutes({
|
||||||
defaultMetaTags,
|
defaultMetaTags,
|
||||||
HomebrewModel,
|
HomebrewModel,
|
||||||
sanitizeBrew,
|
sanitizeBrew,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
//Robots.txt
|
//Robots.txt
|
||||||
app.get('/robots.txt', (req, res)=>{
|
app.get('/robots.txt', (req, res)=>{
|
||||||
@@ -182,6 +184,27 @@ export default async function createApp(vite) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Create Event Stream source for pages to listen to
|
||||||
|
app.get('/stream', (req, res)=>{
|
||||||
|
res.writeHead(200, {
|
||||||
|
'Content-Type' : 'text/event-stream',
|
||||||
|
'Cache-Control' : 'no-cache',
|
||||||
|
'Connection' : 'keep-alive',
|
||||||
|
'Content-Encoding' : 'none'
|
||||||
|
});
|
||||||
|
|
||||||
|
Stream.on('sendUpdate', (event, data)=>{
|
||||||
|
console.log('Event:', event, '\nData:', data);
|
||||||
|
res.write(`data: ${JSON.stringify({ ...data, eventType: event })}\n\n`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// After Stream starts, send initStream event
|
||||||
|
setTimeout(()=>{
|
||||||
|
Stream.emit('sendUpdate', 'initStream', { time: new Date });
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
|
||||||
// Local only
|
// Local only
|
||||||
if(isLocalEnvironment){
|
if(isLocalEnvironment){
|
||||||
// Login
|
// Login
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import { EventEmitter } from 'events';
|
||||||
|
|
||||||
|
const Stream = new EventEmitter;
|
||||||
|
|
||||||
|
export default {
|
||||||
|
emit : function(event) {return Stream.emit(event, ...([...arguments].slice(1)));}, // Arguments doesn't work for arrow functions
|
||||||
|
on : (event, listener)=>{return Stream.on(event, listener);},
|
||||||
|
off : (event, listener)=>{return Stream.off(event, listener);}
|
||||||
|
};
|
||||||
@@ -21,6 +21,8 @@ const router = express.Router();
|
|||||||
import { DEFAULT_BREW, DEFAULT_BREW_LOAD } from './brewDefaults.js';
|
import { DEFAULT_BREW, DEFAULT_BREW_LOAD } from './brewDefaults.js';
|
||||||
import Themes from '../themes/themes.json' with { type: 'json' };
|
import Themes from '../themes/themes.json' with { type: 'json' };
|
||||||
|
|
||||||
|
import Stream from './eventStreamSource.js';
|
||||||
|
|
||||||
const isStaticTheme = (renderer, themeName)=>{
|
const isStaticTheme = (renderer, themeName)=>{
|
||||||
return Themes[renderer]?.[themeName] !== undefined;
|
return Themes[renderer]?.[themeName] !== undefined;
|
||||||
};
|
};
|
||||||
@@ -168,8 +170,7 @@ const api = {
|
|||||||
|
|
||||||
const googleBrew = await GoogleActions.getGoogleBrew(oAuth2Client, googleId, id, accessType)
|
const googleBrew = await GoogleActions.getGoogleBrew(oAuth2Client, googleId, id, accessType)
|
||||||
.catch((googleError)=>{
|
.catch((googleError)=>{
|
||||||
const reason = googleError.errors?.[0].reason;
|
if(googleError.code === 404 || googleError.status === 404)
|
||||||
if(reason == 'notFound')
|
|
||||||
throw { ...googleError, HBErrorCode: '02', authors: stub?.authors, account: req.account?.username };
|
throw { ...googleError, HBErrorCode: '02', authors: stub?.authors, account: req.account?.username };
|
||||||
else
|
else
|
||||||
throw { ...googleError, HBErrorCode: '01' };
|
throw { ...googleError, HBErrorCode: '01' };
|
||||||
@@ -501,6 +502,8 @@ const api = {
|
|||||||
|
|
||||||
saved.textBin = undefined; // Remove textBin from the saved object to save bandwidth
|
saved.textBin = undefined; // Remove textBin from the saved object to save bandwidth
|
||||||
|
|
||||||
|
Stream.emit('sendUpdate', 'brewUpdated', { time: new Date, shareId: brew.shareId, version: brew.version });
|
||||||
|
|
||||||
res.status(200).send(saved);
|
res.status(200).send(saved);
|
||||||
},
|
},
|
||||||
deleteGoogleBrew : async (account, id, editId, res)=>{
|
deleteGoogleBrew : async (account, id, editId, res)=>{
|
||||||
|
|||||||
+2
-1
@@ -229,5 +229,6 @@ export {
|
|||||||
printCurrentBrew,
|
printCurrentBrew,
|
||||||
fetchThemeBundle,
|
fetchThemeBundle,
|
||||||
brewSnippetsToJSON,
|
brewSnippetsToJSON,
|
||||||
debugTextMismatch
|
debugTextMismatch,
|
||||||
|
yamlSnippetsToText
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
import {
|
||||||
|
fetchThemeBundle,
|
||||||
|
brewSnippetsToJSON,
|
||||||
|
debugTextMismatch,
|
||||||
|
yamlSnippetsToText,
|
||||||
|
} from '../../shared/helpers.js';
|
||||||
|
|
||||||
|
import dedent from 'dedent';
|
||||||
|
|
||||||
|
// Marked.js adds line returns after closing tags on some default tokens.
|
||||||
|
// This removes those line returns for comparison sake.
|
||||||
|
String.prototype.trimReturns = function(){
|
||||||
|
return this.replace(/\r?\n|\r/g, '');
|
||||||
|
};
|
||||||
|
|
||||||
|
const emoji = 'df_d12_2';
|
||||||
|
|
||||||
|
const brewSnippetsThemeTest = [
|
||||||
|
{
|
||||||
|
name : 'Test Theme',
|
||||||
|
snippets : dedent `
|
||||||
|
\snippet First Theme Snippet
|
||||||
|
I am the first theme snippet!
|
||||||
|
|
||||||
|
\snippet Second Theme Snippet
|
||||||
|
I am the second theme Snippet!`,
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const brewSnippetsBrewTest = dedent`
|
||||||
|
\snippet First Brew Snippet
|
||||||
|
I am the first brew snippet!
|
||||||
|
|
||||||
|
\snippet Second Brew Snippet
|
||||||
|
I am the second brew Snippet!`;
|
||||||
|
|
||||||
|
describe(`brewSnippetsToJSON`, ()=>{
|
||||||
|
it('converts raw brew snippets without theme snippets to JSON', function() {
|
||||||
|
const testMenuObject = {
|
||||||
|
groupName : 'Brew Snippets',
|
||||||
|
icon : 'fas fa-th-list',
|
||||||
|
view : 'text',
|
||||||
|
snippets : [{
|
||||||
|
name : 'Test Snippets JSON without theme snippets',
|
||||||
|
subsnippets : [
|
||||||
|
{
|
||||||
|
gen : 'I am the first brew snippet!\n',
|
||||||
|
name : 'First Brew Snippet'
|
||||||
|
}, {
|
||||||
|
gen : 'I am the second brew Snippet!',
|
||||||
|
name: 'Second Brew Snippet'
|
||||||
|
}
|
||||||
|
]}]
|
||||||
|
};
|
||||||
|
const rendered = brewSnippetsToJSON(`Test Snippets JSON without theme snippets`, brewSnippetsBrewTest, null, true);
|
||||||
|
expect(rendered).toStrictEqual(testMenuObject);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('converts raw brew snippets with theme snippets to JSON', function() {
|
||||||
|
const testMenuObject = {
|
||||||
|
groupName : 'Brew Snippets',
|
||||||
|
icon : 'fas fa-th-list',
|
||||||
|
view : 'text',
|
||||||
|
snippets : [{
|
||||||
|
gen : '',
|
||||||
|
icon : '',
|
||||||
|
name : 'Test Theme',
|
||||||
|
subsnippets : [
|
||||||
|
{
|
||||||
|
gen : 'I am the first theme snippet!\n',
|
||||||
|
icon : '',
|
||||||
|
name : 'First Theme Snippet',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gen : 'I am the second theme Snippet!',
|
||||||
|
icon : '',
|
||||||
|
name : 'Second Theme Snippet',
|
||||||
|
},
|
||||||
|
]},
|
||||||
|
{
|
||||||
|
name : 'Test Snippets JSON with theme snippets',
|
||||||
|
subsnippets : [
|
||||||
|
{
|
||||||
|
gen : 'I am the first brew snippet!\n',
|
||||||
|
name : 'First Brew Snippet'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gen : 'I am the second brew Snippet!',
|
||||||
|
name: 'Second Brew Snippet'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}]};
|
||||||
|
const rendered = brewSnippetsToJSON(`Test Snippets JSON with theme snippets`, brewSnippetsBrewTest, brewSnippetsThemeTest, true);
|
||||||
|
expect(rendered).toStrictEqual(testMenuObject);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe(`YAMLSnippetsToText`, ()=>{
|
||||||
|
it('converts brew snippet YAML to a string ', function() {
|
||||||
|
const brewSnippetsYAML = [{
|
||||||
|
subsnippets : [
|
||||||
|
{
|
||||||
|
gen : 'I am the first brew snippet!\n',
|
||||||
|
name : 'First Brew Snippet'
|
||||||
|
}, {
|
||||||
|
gen : 'I am the second brew Snippet!',
|
||||||
|
name: 'Second Brew Snippet'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}];
|
||||||
|
const rendered = yamlSnippetsToText(brewSnippetsYAML);
|
||||||
|
expect(rendered).toBe(`${brewSnippetsBrewTest}\n`);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user