From 500a6cd9767f6f284a74ce5c86e425910184e5f2 Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Fri, 1 Mar 2019 11:40:18 -0500 Subject: [PATCH 01/16] Add _Patterns_ page --- src/Layout.jsx | 2 ++ src/components/Header.jsx | 1 + src/pages/Patterns.jsx | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 src/pages/Patterns.jsx diff --git a/src/Layout.jsx b/src/Layout.jsx index fcf0644..23a3bfe 100644 --- a/src/Layout.jsx +++ b/src/Layout.jsx @@ -12,6 +12,7 @@ import { themeLight } from './styles/themes/theme.light'; import { themeDark } from './styles/themes/theme.dark'; import Game from './pages/Game'; import About from './pages/About'; +import Patterns from './pages/Patterns'; import { getMode } from './selectors'; const Layout = props => { @@ -32,6 +33,7 @@ const Layout = props => {
} /> + diff --git a/src/components/Header.jsx b/src/components/Header.jsx index 1430c6e..eb9f739 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -46,6 +46,7 @@ const Header = () => ( Game + Patterns About GitHub diff --git a/src/pages/Patterns.jsx b/src/pages/Patterns.jsx new file mode 100644 index 0000000..9b91cba --- /dev/null +++ b/src/pages/Patterns.jsx @@ -0,0 +1,36 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; + +const StyledPatterns = styled.div``; + +const Header = styled.h3` + color: ${props => props.theme.buttonColorHover}; + margin-top: 2rem; +`; + +// const Patterns = ({ match }) => { +// const { pattern } = match.params; + +const Patterns = props => { + console.log(props); + + props.history.listen(location => { + console.log(location); + }); + + const { pattern } = props.match.params; + + return ( + +
{pattern}
+
+ ); +}; + +Patterns.propTypes = { + history: PropTypes.object.isRequired, + match: PropTypes.object.isRequired +}; + +export default Patterns; From 9c7db3ad0a82257b0943f21271250f4c5f0586a0 Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Thu, 7 Mar 2019 12:20:13 -0500 Subject: [PATCH 02/16] Fix code snippets indentation --- .../behavioral_chainOfResponsibility.js | 153 +++++++++--------- src/static/patterns/behavioral_command.js | 104 ++++++------ src/static/patterns/behavioral_interpreter.js | 56 +++---- src/static/patterns/behavioral_iterator.js | 36 ++--- src/static/patterns/behavioral_mediator.js | 50 +++--- src/static/patterns/behavioral_memento.js | 56 +++---- src/static/patterns/behavioral_observer.js | 96 +++++------ src/static/patterns/behavioral_state.js | 76 ++++----- src/static/patterns/behavioral_strategy.js | 40 ++--- src/static/patterns/behavioral_template.js | 58 +++---- src/static/patterns/behavioral_visitor.js | 42 ++--- .../patterns/creational_abstractFactory.js | 36 ++--- src/static/patterns/creational_builder.js | 84 +++++----- src/static/patterns/creational_factory.js | 28 ++-- src/static/patterns/creational_prototype.js | 20 +-- src/static/patterns/creational_singleton.js | 20 +-- src/static/patterns/structural_adapter.js | 48 +++--- src/static/patterns/structural_bridge.js | 69 ++++---- src/static/patterns/structural_composite.js | 126 +++++++-------- src/static/patterns/structural_decorator.js | 75 ++++----- src/static/patterns/structural_facade.js | 60 +++---- src/static/patterns/structural_flyweight.js | 44 ++--- src/static/patterns/structural_proxy.js | 44 ++--- 23 files changed, 725 insertions(+), 696 deletions(-) diff --git a/src/static/patterns/behavioral_chainOfResponsibility.js b/src/static/patterns/behavioral_chainOfResponsibility.js index 7477a7c..c5772b4 100644 --- a/src/static/patterns/behavioral_chainOfResponsibility.js +++ b/src/static/patterns/behavioral_chainOfResponsibility.js @@ -4,125 +4,126 @@ const CHAIN_OF_RESPONSIBILITY = { type: 'behavioral', hint: 'delegates commands to a chain of processing objects', codeES5: `function ShoppingCart() { -this.products = []; + this.products = []; -this.addProduct = function(p) { - this.products.push(p); -}; + this.addProduct = function(p) { + this.products.push(p); + }; } function Discount() { -this.calc = function(products) { - var ndiscount = new NumberDiscount(); - var pdiscount = new PriceDiscount(); - var none = new NoneDiscount(); + this.calc = function(products) { + var ndiscount = new NumberDiscount(); + var pdiscount = new PriceDiscount(); + var none = new NoneDiscount(); - ndiscount.setNext(pdiscount); - pdiscount.setNext(none); + ndiscount.setNext(pdiscount); + pdiscount.setNext(none); - return ndiscount.exec(products); -}; + return ndiscount.exec(products); + }; } function NumberDiscount() { -this.next = null; -this.setNext = function(fn) { - this.next = fn; -}; + this.next = null; + this.setNext = function(fn) { + this.next = fn; + }; -this.exec = function(products) { - var result = 0; - if (products.length > 3) result = 0.05; + this.exec = function(products) { + var result = 0; + if (products.length > 3) result = 0.05; - return result + this.next.exec(products); -}; + return result + this.next.exec(products); + }; } function PriceDiscount() { -this.next = null; -this.setNext = function(fn) { - this.next = fn; -}; -this.exec = function(products) { - var result = 0; - var total = products.reduce(function(a, b) { - return a + b; - }); + this.next = null; + this.setNext = function(fn) { + this.next = fn; + }; + this.exec = function(products) { + var result = 0; + var total = products.reduce(function(a, b) { + return a + b; + }); - if (total >= 500) result = 0.1; + if (total >= 500) result = 0.1; - return result + this.next.exec(products); -}; + return result + this.next.exec(products); + }; } function NoneDiscount() { -this.exec = function() { - return 0; -}; + this.exec = function() { + return 0; + }; } module.exports = [ShoppingCart, Discount];`, codeES6: `class ShoppingCart { -constructor() { - this.products = []; -} + constructor() { + this.products = []; + } -addProduct(p) { - this.products.push(p); -} + addProduct(p) { + this.products.push(p); + } } class Discount { -calc(products) { - let ndiscount = new NumberDiscount(); - let pdiscount = new PriceDiscount(); - let none = new NoneDiscount(); - ndiscount.setNext(pdiscount); - pdiscount.setNext(none); - return ndiscount.exec(products); -} + calc(products) { + let ndiscount = new NumberDiscount(); + let pdiscount = new PriceDiscount(); + let none = new NoneDiscount(); + ndiscount.setNext(pdiscount); + pdiscount.setNext(none); + + return ndiscount.exec(products); + } } class NumberDiscount { -constructor() { - this.next = null; -} + constructor() { + this.next = null; + } -setNext(fn) { - this.next = fn; -} + setNext(fn) { + this.next = fn; + } -exec(products) { - let result = 0; - if (products.length > 3) result = 0.05; + exec(products) { + let result = 0; + if (products.length > 3) result = 0.05; - return result + this.next.exec(products); -} + return result + this.next.exec(products); + } } class PriceDiscount { -constructor() { - this.next = null; -} + constructor() { + this.next = null; + } -setNext(fn) { - this.next = fn; -} + setNext(fn) { + this.next = fn; + } -exec(products) { - let result = 0; - let total = products.reduce((a, b) => a + b); + exec(products) { + let result = 0; + let total = products.reduce((a, b) => a + b); - if (total >= 500) result = 0.1; + if (total >= 500) result = 0.1; - return result + this.next.exec(products); -} + return result + this.next.exec(products); + } } class NoneDiscount { -exec() { - return 0; -} + exec() { + return 0; + } } export { ShoppingCart, Discount };` diff --git a/src/static/patterns/behavioral_command.js b/src/static/patterns/behavioral_command.js index 16cd307..2a68d23 100644 --- a/src/static/patterns/behavioral_command.js +++ b/src/static/patterns/behavioral_command.js @@ -4,105 +4,115 @@ const COMMAND = { type: 'behavioral', hint: 'creates objects which encapsulate actions and parameters', codeES5: `function Cockpit(instruction) { -this.instruction = instruction; + this.instruction = instruction; } + Cockpit.prototype.execute = function() { -this.instruction.execute(); + this.instruction.execute(); }; function Turbine() { -this.speed = 0; -this.state = false; + this.speed = 0; + this.state = false; } Turbine.prototype.on = function() { -this.state = true; -this.speed = 100; + this.state = true; + this.speed = 100; }; Turbine.prototype.off = function() { -this.speed = 0; -this.state = false; + this.speed = 0; + this.state = false; }; Turbine.prototype.speedDown = function() { -if (!this.state) return; + if (!this.state) return; -this.speed -= 100; + this.speed -= 100; }; Turbine.prototype.speedUp = function() { -if (!this.state) return; + if (!this.state) return; -this.speed += 100; + this.speed += 100; }; function OnInstruction(turbine) { -this.turbine = turbine; + this.turbine = turbine; } + OnInstruction.prototype.execute = function() { -this.turbine.on(); + this.turbine.on(); }; function OffInstruction(turbine) { -this.turbine = turbine; + this.turbine = turbine; } + OffInstruction.prototype.execute = function() { -this.turbine.off(); + this.turbine.off(); }; function SpeedUpInstruction(turbine) { -this.turbine = turbine; + this.turbine = turbine; } + SpeedUpInstruction.prototype.execute = function() { -this.turbine.speedUp(); + this.turbine.speedUp(); }; function SpeedDownInstruction(turbine) { -this.turbine = turbine; + this.turbine = turbine; } + SpeedDownInstruction.prototype.execute = function() { -this.turbine.speedDown(); + this.turbine.speedDown(); }; module.exports = [Cockpit, Turbine, OnInstruction, OffInstruction, SpeedUpInstruction, SpeedDownInstruction];`, codeES6: `class Cockpit { -constructor(instruction) { - this.instruction = instruction; -} -execute() { - this.instruction.execute(); -} + constructor(instruction) { + this.instruction = instruction; + } + + execute() { + this.instruction.execute(); + } } class Turbine { -constructor() { - this.state = false; -} -on() { - this.state = true; -} -off() { - this.state = false; -} + constructor() { + this.state = false; + } + + on() { + this.state = true; + } + + off() { + this.state = false; + } } class OnInstruction { -constructor(turbine) { - this.turbine = turbine; -} -execute() { - this.turbine.on(); -} + constructor(turbine) { + this.turbine = turbine; + } + + execute() { + this.turbine.on(); + } } class OffInstruction { -constructor(turbine) { - this.turbine = turbine; -} -execute() { - this.turbine.off(); -} + constructor(turbine) { + this.turbine = turbine; + } + + execute() { + this.turbine.off(); + } } export { Cockpit, Turbine, OnInstruction, OffInstruction };` diff --git a/src/static/patterns/behavioral_interpreter.js b/src/static/patterns/behavioral_interpreter.js index f7dbe49..734c99c 100644 --- a/src/static/patterns/behavioral_interpreter.js +++ b/src/static/patterns/behavioral_interpreter.js @@ -4,62 +4,62 @@ const INTERPRETER = { type: 'behavioral', hint: 'implements a specialized language', codeES5: `function Sum(left, right) { -this.left = left; -this.right = right; + this.left = left; + this.right = right; } Sum.prototype.pattern = function() { -return this.left.pattern() + this.right.pattern(); + return this.left.pattern() + this.right.pattern(); }; function Min(left, right) { -this.left = left; -this.right = right; + this.left = left; + this.right = right; } Min.prototype.pattern = function() { -return this.left.pattern() - this.right.pattern(); + return this.left.pattern() - this.right.pattern(); }; function Num(val) { -this.val = val; + this.val = val; } Num.prototype.pattern = function() { -return this.val; + return this.val; }; module.exports = [Num, Min, Sum];`, codeES6: `class Sum { -constructor(left, right) { - this.left = left; - this.right = right; -} + constructor(left, right) { + this.left = left; + this.right = right; + } -pattern() { - return this.left.pattern() + this.right.pattern(); -} + pattern() { + return this.left.pattern() + this.right.pattern(); + } } class Min { -constructor(left, right) { - this.left = left; - this.right = right; -} + constructor(left, right) { + this.left = left; + this.right = right; + } -pattern() { - return this.left.pattern() - this.right.pattern(); -} + pattern() { + return this.left.pattern() - this.right.pattern(); + } } class Num { -constructor(val) { - this.val = val; -} + constructor(val) { + this.val = val; + } -pattern() { - return this.val; -} + pattern() { + return this.val; + } } export { Num, Min, Sum };` diff --git a/src/static/patterns/behavioral_iterator.js b/src/static/patterns/behavioral_iterator.js index 30272b1..6f91d3c 100644 --- a/src/static/patterns/behavioral_iterator.js +++ b/src/static/patterns/behavioral_iterator.js @@ -5,33 +5,33 @@ const ITERATOR = { hint: 'accesses the elements of an object sequentially without exposing its underlying representation', codeES5: `function Pattern(el) { -this.index = 0; -this.elements = el; + this.index = 0; + this.elements = el; } Pattern.prototype = { -next: function() { - return this.elements[this.index++]; -}, -hasNext: function() { - return this.index < this.elements.length; -} + next: function() { + return this.elements[this.index++]; + }, + hasNext: function() { + return this.index < this.elements.length; + } }; module.exports = Pattern;`, codeES6: `class Pattern { -constructor(el) { - this.index = 0; - this.elements = el; -} + constructor(el) { + this.index = 0; + this.elements = el; + } -next() { - return this.elements[this.index++]; -} + next() { + return this.elements[this.index++]; + } -hasNext() { - return this.index < this.elements.length; -} + hasNext() { + return this.index < this.elements.length; + } } export default Pattern;` diff --git a/src/static/patterns/behavioral_mediator.js b/src/static/patterns/behavioral_mediator.js index fff02ce..c1914b3 100644 --- a/src/static/patterns/behavioral_mediator.js +++ b/src/static/patterns/behavioral_mediator.js @@ -5,48 +5,48 @@ const MEDIATOR = { hint: 'allows loose coupling between classes by being the only class that has detailed knowledge of their methods', codeES5: `function TrafficTower() { -this.airplanes = []; + this.airplanes = []; } TrafficTower.prototype.requestPositions = function() { -return this.airplanes.map(function(airplane) { - return airplane.position; -}); + return this.airplanes.map(function(airplane) { + return airplane.position; + }); }; function Airplane(position, trafficTower) { -this.position = position; -this.trafficTower = trafficTower; -this.trafficTower.airplanes.push(this); + this.position = position; + this.trafficTower = trafficTower; + this.trafficTower.airplanes.push(this); } Airplane.prototype.requestPositions = function() { -return this.trafficTower.requestPositions(); + return this.trafficTower.requestPositions(); }; module.exports = [TrafficTower, Airplane];`, codeES6: `class TrafficTower { -constructor() { - this.airplanes = []; -} + constructor() { + this.airplanes = []; + } -requestPositions() { - return this.airplanes.map(airplane => { - return airplane.position; - }); -} + requestPositions() { + return this.airplanes.map(airplane => { + return airplane.position; + }); + } } class Airplane { -constructor(position, trafficTower) { - this.position = position; - this.trafficTower = trafficTower; - this.trafficTower.airplanes.push(this); -} - -requestPositions() { - return this.trafficTower.requestPositions(); -} + constructor(position, trafficTower) { + this.position = position; + this.trafficTower = trafficTower; + this.trafficTower.airplanes.push(this); + } + + requestPositions() { + return this.trafficTower.requestPositions(); + } } export { TrafficTower, Airplane };` diff --git a/src/static/patterns/behavioral_memento.js b/src/static/patterns/behavioral_memento.js index 1cef9c1..d59898b 100644 --- a/src/static/patterns/behavioral_memento.js +++ b/src/static/patterns/behavioral_memento.js @@ -4,58 +4,58 @@ const MEMENTO = { type: 'behavioral', hint: 'provides the ability to restore an object to its previous state', codeES5: `function Pattern(value) { -this.value = value; + this.value = value; } var originator = { -store: function(val) { - return new Pattern(val); -}, -restore: function(pattern) { - return pattern.value; -} + store: function(val) { + return new Pattern(val); + }, + restore: function(pattern) { + return pattern.value; + } }; function Caretaker() { -this.values = []; + this.values = []; } Caretaker.prototype.addPattern = function(pattern) { -this.values.push(pattern); + this.values.push(pattern); }; Caretaker.prototype.getPattern = function(index) { -return this.values[index]; + return this.values[index]; }; module.exports = [originator, Caretaker];`, codeES6: `class Pattern { -constructor(value) { - this.value = value; -} + constructor(value) { + this.value = value; + } } const originator = { -store: function(val) { - return new Pattern(val); -}, -restore: function(pattern) { - return pattern.value; -} + store: function(val) { + return new Pattern(val); + }, + restore: function(pattern) { + return pattern.value; + } }; class Caretaker { -constructor() { - this.values = []; -} + constructor() { + this.values = []; + } -addPattern(pattern) { - this.values.push(pattern); -} + addPattern(pattern) { + this.values.push(pattern); + } -getPattern(index) { - return this.values[index]; -} + getPattern(index) { + return this.values[index]; + } } export { originator, Caretaker };` diff --git a/src/static/patterns/behavioral_observer.js b/src/static/patterns/behavioral_observer.js index 29f1aa1..ff95a23 100644 --- a/src/static/patterns/behavioral_observer.js +++ b/src/static/patterns/behavioral_observer.js @@ -4,86 +4,86 @@ const OBSERVER = { type: 'behavioral', hint: 'is a publish/subscribe pattern which allows a number of observer objects to see an event', codeES5: `function Product() { -this.price = 0; -this.actions = []; + this.price = 0; + this.actions = []; } Product.prototype.setBasePrice = function(val) { -this.price = val; -this.notifyAll(); + this.price = val; + this.notifyAll(); }; Product.prototype.register = function(observer) { -this.actions.push(observer); + this.actions.push(observer); }; Product.prototype.unregister = function(observer) { -this.actions.remove.filter(function(el) { - return el !== observer; -}); + this.actions.remove.filter(function(el) { + return el !== observer; + }); }; Product.prototype.notifyAll = function() { -return this.actions.forEach( - function(el) { - el.update(this); - }.bind(this) -); + return this.actions.forEach( + function(el) { + el.update(this); + }.bind(this) + ); }; var fees = { -update: function(product) { - product.price = product.price * 1.2; -} + update: function(product) { + product.price = product.price * 1.2; + } }; var proft = { -update: function(product) { - product.price = product.price * 2; -} + update: function(product) { + product.price = product.price * 2; + } }; module.exports = [Product, fees, proft];`, codeES6: `class Product { -constructor() { - this.price = 0; - this.actions = []; -} + constructor() { + this.price = 0; + this.actions = []; + } -setBasePrice(val) { - this.price = val; - this.notifyAll(); -} + setBasePrice(val) { + this.price = val; + this.notifyAll(); + } -register(observer) { - this.actions.push(observer); -} + register(observer) { + this.actions.push(observer); + } -unregister(observer) { - this.actions.remove.filter(function(el) { - return el !== observer; - }); -} + unregister(observer) { + this.actions.remove.filter(function(el) { + return el !== observer; + }); + } -notifyAll() { - return this.actions.forEach( - function(el) { - el.update(this); - }.bind(this) - ); -} + notifyAll() { + return this.actions.forEach( + function(el) { + el.update(this); + }.bind(this) + ); + } } class fees { -update(product) { - product.price = product.price * 1.2; -} + update(product) { + product.price = product.price * 1.2; + } } class proft { -update(product) { - product.price = product.price * 2; -} + update(product) { + product.price = product.price * 2; + } } export { Product, fees, proft };` diff --git a/src/static/patterns/behavioral_state.js b/src/static/patterns/behavioral_state.js index c89ed61..8ac4e76 100644 --- a/src/static/patterns/behavioral_state.js +++ b/src/static/patterns/behavioral_state.js @@ -4,72 +4,72 @@ const STATE = { type: 'behavioral', hint: 'allows an object to alter its behavior when its internal state changes', codeES5: `function Order() { -this.pattern = new WaitingForPayment(); + this.pattern = new WaitingForPayment(); -this.nextPattern = function() { - this.pattern = this.pattern.next(); -}; + this.nextPattern = function() { + this.pattern = this.pattern.next(); + }; } function WaitingForPayment() { -this.name = 'waitingForPayment'; -this.next = function() { - return new Shipping(); -}; + this.name = 'waitingForPayment'; + this.next = function() { + return new Shipping(); + }; } function Shipping() { -this.name = 'shipping'; -this.next = function() { - return new Delivered(); -}; + this.name = 'shipping'; + this.next = function() { + return new Delivered(); + }; } function Delivered() { -this.name = 'delivered'; -this.next = function() { - return this; -}; + this.name = 'delivered'; + this.next = function() { + return this; + }; } module.exports = Order;`, codeES6: `class OrderStatus { -constructor(name, nextStatus) { - this.name = name; - this.nextStatus = nextStatus; -} + constructor(name, nextStatus) { + this.name = name; + this.nextStatus = nextStatus; + } -next() { - return new this.nextStatus(); -} + next() { + return new this.nextStatus(); + } } class WaitingForPayment extends OrderStatus { -constructor() { - super('waitingForPayment', Shipping); -} + constructor() { + super('waitingForPayment', Shipping); + } } class Shipping extends OrderStatus { -constructor() { - super('shipping', Delivered); -} + constructor() { + super('shipping', Delivered); + } } class Delivered extends OrderStatus { -constructor() { - super('delivered', Delivered); -} + constructor() { + super('delivered', Delivered); + } } class Order { -constructor() { - this.pattern = new WaitingForPayment(); -} + constructor() { + this.pattern = new WaitingForPayment(); + } -nextPattern() { - this.pattern = this.pattern.next(); -} + nextPattern() { + this.pattern = this.pattern.next(); + } } export default Order;` diff --git a/src/static/patterns/behavioral_strategy.js b/src/static/patterns/behavioral_strategy.js index 3d0cbc2..a3f6f7f 100644 --- a/src/static/patterns/behavioral_strategy.js +++ b/src/static/patterns/behavioral_strategy.js @@ -4,56 +4,56 @@ const STRATEGY = { type: 'behavioral', hint: 'allows one of a family of algorithms to be selected on-the-fly at runtime', codeES5: `function ShoppingCart(discount) { -this.discount = discount; -this.amount = 0; + this.discount = discount; + this.amount = 0; } ShoppingCart.prototype.setAmount = function(amount) { -this.amount = amount; + this.amount = amount; }; ShoppingCart.prototype.checkout = function() { -return this.discount(this.amount); + return this.discount(this.amount); }; function guestPattern(amount) { -return amount; + return amount; } function regularPattern(amount) { -return amount * 0.9; + return amount * 0.9; } function premiumPattern(amount) { -return amount * 0.8; + return amount * 0.8; } module.exports = [ShoppingCart, guestPattern, regularPattern, premiumPattern];`, codeES6: `class ShoppingCart { -constructor(discount) { - this.discount = discount; - this.amount = 0; -} + constructor(discount) { + this.discount = discount; + this.amount = 0; + } -checkout() { - return this.discount(this.amount); -} + checkout() { + return this.discount(this.amount); + } -setAmount(amount) { - this.amount = amount; -} + setAmount(amount) { + this.amount = amount; + } } function guestPattern(amount) { -return amount; + return amount; } function regularPattern(amount) { -return amount * 0.9; + return amount * 0.9; } function premiumPattern(amount) { -return amount * 0.8; + return amount * 0.8; } export { ShoppingCart, guestPattern, regularPattern, premiumPattern };` diff --git a/src/static/patterns/behavioral_template.js b/src/static/patterns/behavioral_template.js index 1fd1bd3..1ad0020 100644 --- a/src/static/patterns/behavioral_template.js +++ b/src/static/patterns/behavioral_template.js @@ -7,58 +7,60 @@ const TEMPLATE = { codeES5: `function Tax() {} Tax.prototype.calc = function(value) { -if (value >= 1000) value = this.overThousand(value); + if (value >= 1000) value = this.overThousand(value); -return this.complementaryFee(value); + return this.complementaryFee(value); }; Tax.prototype.complementaryFee = function(value) { -return value + 10; + return value + 10; }; function Tax1() {} -Tax1.prototype = Object.create(Tax.prototype); + Tax1.prototype = Object.create(Tax.prototype); -Tax1.prototype.overThousand = function(value) { -return value * 1.1; + Tax1.prototype.overThousand = function(value) { + return value * 1.1; }; function Tax2() {} -Tax2.prototype = Object.create(Tax.prototype); + Tax2.prototype = Object.create(Tax.prototype); -Tax2.prototype.overThousand = function(value) { -return value * 1.2; + Tax2.prototype.overThousand = function(value) { + return value * 1.2; }; module.exports = [Tax1, Tax2];`, codeES6: `class Tax { -calc(value) { - if (value >= 1000) value = this.overThousand(value); + calc(value) { + if (value >= 1000) value = this.overThousand(value); - return this.complementaryFee(value); -} + return this.complementaryFee(value); + } -complementaryFee(value) { - return value + 10; -} + complementaryFee(value) { + return value + 10; + } } class Tax1 extends Tax { -constructor() { - super(); -} -overThousand(value) { - return value * 1.1; -} + constructor() { + super(); + } + + overThousand(value) { + return value * 1.1; + } } class Tax2 extends Tax { -constructor() { - super(); -} -overThousand(value) { - return value * 1.2; -} + constructor() { + super(); + } + + overThousand(value) { + return value * 1.2; + } } export { Tax1, Tax2 };` diff --git a/src/static/patterns/behavioral_visitor.js b/src/static/patterns/behavioral_visitor.js index 42f4eb9..d7e4a49 100644 --- a/src/static/patterns/behavioral_visitor.js +++ b/src/static/patterns/behavioral_visitor.js @@ -5,57 +5,57 @@ const VISITOR = { hint: 'separates an algorithm from an object structure by moving the hierarchy of methods into one object', codeES5: `function bonusPattern(employee) { -if (employee instanceof Manager) employee.bonus = employee.salary * 2; -if (employee instanceof Developer) employee.bonus = employee.salary; + if (employee instanceof Manager) employee.bonus = employee.salary * 2; + if (employee instanceof Developer) employee.bonus = employee.salary; } function Employee() { -this.bonus = 0; + this.bonus = 0; } Employee.prototype.accept = function(item) { -item(this); + item(this); }; function Manager(salary) { -this.salary = salary; + this.salary = salary; } Manager.prototype = Object.create(Employee.prototype); function Developer(salary) { -this.salary = salary; + this.salary = salary; } Developer.prototype = Object.create(Employee.prototype); module.exports = [Developer, Manager, bonusPattern];`, codeES6: `function bonusPattern(employee) { -if (employee instanceof Manager) employee.bonus = employee.salary * 2; -if (employee instanceof Developer) employee.bonus = employee.salary; + if (employee instanceof Manager) employee.bonus = employee.salary * 2; + if (employee instanceof Developer) employee.bonus = employee.salary; } class Employee { -constructor(salary) { - this.bonus = 0; - this.salary = salary; -} + constructor(salary) { + this.bonus = 0; + this.salary = salary; + } -accept(item) { - item(this); -} + accept(item) { + item(this); + } } class Manager extends Employee { -constructor(salary) { - super(salary); -} + constructor(salary) { + super(salary); + } } class Developer extends Employee { -constructor(salary) { - super(salary); -} + constructor(salary) { + super(salary); + } } export { Developer, Manager, bonusPattern };` diff --git a/src/static/patterns/creational_abstractFactory.js b/src/static/patterns/creational_abstractFactory.js index dd8eaff..d34604c 100644 --- a/src/static/patterns/creational_abstractFactory.js +++ b/src/static/patterns/creational_abstractFactory.js @@ -4,52 +4,52 @@ const ABSTRACT_FACTORY = { type: 'creational', hint: 'groups object factories that have a common theme', codeES5: `function droidProducer(kind) { -if (kind === 'battle') return battleDroidPattern; -return pilotDroidPattern; + if (kind === 'battle') return battleDroidPattern; + return pilotDroidPattern; } function battleDroidPattern() { -return new B1(); + return new B1(); } function pilotDroidPattern() { -return new Rx24(); + return new Rx24(); } function B1() {} -B1.prototype.info = function() { -return 'B1, Battle Droid'; + B1.prototype.info = function() { + return 'B1, Battle Droid'; }; function Rx24() {} -Rx24.prototype.info = function() { -return 'Rx24, Pilot Droid'; + Rx24.prototype.info = function() { + return 'Rx24, Pilot Droid'; }; module.exports = droidProducer;`, codeES6: `function droidProducer(kind) { -if (kind === 'battle') return battleDroidPattern; -return pilotDroidPattern; + if (kind === 'battle') return battleDroidPattern; + return pilotDroidPattern; } function battleDroidPattern() { -return new B1(); + return new B1(); } function pilotDroidPattern() { -return new Rx24(); + return new Rx24(); } class B1 { -info() { - return 'B1, Battle Droid'; -} + info() { + return 'B1, Battle Droid'; + } } class Rx24 { -info() { - return 'Rx24, Pilot Droid'; -} + info() { + return 'Rx24, Pilot Droid'; + } } export default droidProducer;` diff --git a/src/static/patterns/creational_builder.js b/src/static/patterns/creational_builder.js index 4a5ec31..aa805bc 100644 --- a/src/static/patterns/creational_builder.js +++ b/src/static/patterns/creational_builder.js @@ -4,66 +4,66 @@ const BUILDER = { type: 'creational', hint: 'constructs complex objects by separating construction and representation', codeES5: `function Request() { -this.url = ''; -this.method = ''; -this.payload = {}; + this.url = ''; + this.method = ''; + this.payload = {}; } function RequestPattern() { -this.request = new Request(); + this.request = new Request(); -this.forUrl = function(url) { - this.request.url = url; - return this; -}; + this.forUrl = function(url) { + this.request.url = url; + return this; + }; -this.useMethod = function(method) { - this.request.method = method; - return this; -}; + this.useMethod = function(method) { + this.request.method = method; + return this; + }; -this.payload = function(payload) { - this.request.payload = payload; - return this; -}; + this.payload = function(payload) { + this.request.payload = payload; + return this; + }; -this.build = function() { - return this.request; -}; + this.build = function() { + return this.request; + }; } module.exports = RequestPattern;`, codeES6: `class Request { -constructor() { - this.url = ''; - this.method = ''; - this.payload = {}; -} + constructor() { + this.url = ''; + this.method = ''; + this.payload = {}; + } } class RequestPattern { -constructor() { - this.request = new Request(); -} + constructor() { + this.request = new Request(); + } -forUrl(url) { - this.request.url = url; - return this; -} + forUrl(url) { + this.request.url = url; + return this; + } -useMethod(method) { - this.request.method = method; - return this; -} + useMethod(method) { + this.request.method = method; + return this; + } -payload(payload) { - this.request.payload = payload; - return this; -} + payload(payload) { + this.request.payload = payload; + return this; + } -build() { - return this.request; -} + build() { + return this.request; + } } export default RequestPattern;` diff --git a/src/static/patterns/creational_factory.js b/src/static/patterns/creational_factory.js index f56d807..9f9c2db 100644 --- a/src/static/patterns/creational_factory.js +++ b/src/static/patterns/creational_factory.js @@ -4,30 +4,30 @@ const FACTORY = { type: 'creational', hint: 'creates objects without specifying the exact class to create', codeES5: `function teslaPattern(type) { -if (type === 'ModelX') return new Tesla(type, 108000, 300); -if (type === 'ModelS') return new Tesla(type, 111000, 320); + if (type === 'ModelX') return new Tesla(type, 108000, 300); + if (type === 'ModelS') return new Tesla(type, 111000, 320); } function Tesla(model, price, maxSpeed) { -this.model = model; -this.price = price; -this.maxSpeed = maxSpeed; + this.model = model; + this.price = price; + this.maxSpeed = maxSpeed; } module.exports = teslaPattern;`, codeES6: `class TeslaPattern { -create(type) { - if (type === 'ModelX') return new Tesla(type, 108000, 300); - if (type === 'ModelS') return new Tesla(type, 111000, 320); -} + create(type) { + if (type === 'ModelX') return new Tesla(type, 108000, 300); + if (type === 'ModelS') return new Tesla(type, 111000, 320); + } } class Tesla { -constructor(model, price, maxSpeed) { - this.model = model; - this.price = price; - this.maxSpeed = maxSpeed; -} + constructor(model, price, maxSpeed) { + this.model = model; + this.price = price; + this.maxSpeed = maxSpeed; + } } export default TeslaPattern;` diff --git a/src/static/patterns/creational_prototype.js b/src/static/patterns/creational_prototype.js index c6e5437..b3e2c2d 100644 --- a/src/static/patterns/creational_prototype.js +++ b/src/static/patterns/creational_prototype.js @@ -4,24 +4,24 @@ const PROTOTYPE = { type: 'creational', hint: 'creates objects by cloning an existing object', codeES5: `function Sheep(name, weight) { -this.name = name; -this.weight = weight; + this.name = name; + this.weight = weight; } Sheep.prototype.clone = function() { -return new Sheep(this.name, this.weight); + return new Sheep(this.name, this.weight); }; module.exports = Sheep;`, codeES6: `class Sheep { -constructor(name, weight) { - this.name = name; - this.weight = weight; -} + constructor(name, weight) { + this.name = name; + this.weight = weight; + } -clone() { - return new Sheep(this.name, this.weight); -} + clone() { + return new Sheep(this.name, this.weight); + } } export default Sheep;` diff --git a/src/static/patterns/creational_singleton.js b/src/static/patterns/creational_singleton.js index dfaa7dd..b4aeaa8 100644 --- a/src/static/patterns/creational_singleton.js +++ b/src/static/patterns/creational_singleton.js @@ -4,22 +4,24 @@ const SINGLETON = { type: 'creational', hint: 'restricts object creation for a class to only one instance', codeES5: `function Person() { -if (typeof Person.instance === 'object') return Person.instance; + if (typeof Person.instance === 'object') return Person.instance; -Person.instance = this; + Person.instance = this; -return this; + return this; } module.exports = Person;`, codeES6: `class Person { -constructor() { - if (typeof Person.instance === 'object') { - return Person.instance; + constructor() { + if (typeof Person.instance === 'object') { + return Person.instance; + } + + Person.instance = this; + + return this; } - Person.instance = this; - return this; -} } export default Person;` diff --git a/src/static/patterns/structural_adapter.js b/src/static/patterns/structural_adapter.js index 87cfc25..6ff8842 100644 --- a/src/static/patterns/structural_adapter.js +++ b/src/static/patterns/structural_adapter.js @@ -5,58 +5,58 @@ const ADAPTER = { hint: `allows classes with incompatible interfaces to work together by wrapping its own interface around that of an already existing class`, codeES5: `function Soldier(lvl) { -this.lvl = lvl; + this.lvl = lvl; } Soldier.prototype.attack = function() { -return this.lvl * 1; + return this.lvl * 1; }; function Jedi(lvl) { -this.lvl = lvl; + this.lvl = lvl; } Jedi.prototype.attackWithSaber = function() { -return this.lvl * 100; + return this.lvl * 100; }; function JediPattern(jedi) { -this.jedi = jedi; + this.jedi = jedi; } JediPattern.prototype.attack = function() { -return this.jedi.attackWithSaber(); + return this.jedi.attackWithSaber(); }; module.exports = [Soldier, Jedi, JediPattern];`, codeES6: `class Soldier { -constructor(level) { - this.level = level; -} + constructor(level) { + this.level = level; + } -attack() { - return this.level * 1; -} + attack() { + return this.level * 1; + } } class Jedi { -constructor(level) { - this.level = level; -} + constructor(level) { + this.level = level; + } -attackWithSaber() { - return this.level * 100; -} + attackWithSaber() { + return this.level * 100; + } } class JediPattern { -constructor(jedi) { - this.jedi = jedi; -} + constructor(jedi) { + this.jedi = jedi; + } -attack() { - return this.jedi.attackWithSaber(); -} + attack() { + return this.jedi.attackWithSaber(); + } } export { Soldier, Jedi, JediPattern };` diff --git a/src/static/patterns/structural_bridge.js b/src/static/patterns/structural_bridge.js index 9268f97..2e07900 100644 --- a/src/static/patterns/structural_bridge.js +++ b/src/static/patterns/structural_bridge.js @@ -4,73 +4,76 @@ const BRIDGE = { type: 'structural', hint: 'decouples an abstraction from its implementation so that the two can vary independently', codeES5: `function EpsonPrinter(ink) { -this.ink = ink(); + this.ink = ink(); } + EpsonPrinter.prototype.print = function() { -return 'Printer: Epson, Ink: ' + this.ink; + return 'Printer: Epson, Ink: ' + this.ink; }; function HPprinter(ink) { -this.ink = ink(); + this.ink = ink(); } + HPprinter.prototype.print = function() { -return 'Printer: HP, Ink: ' + this.ink; + return 'Printer: HP, Ink: ' + this.ink; }; function acrylicInk() { -return 'acrylic-based'; + return 'acrylic-based'; } function alcoholInk() { -return 'alcohol-based'; + return 'alcohol-based'; } module.exports = [EpsonPrinter, HPprinter, acrylicInk, alcoholInk];`, codeES6: `class Printer { -constructor(ink) { - this.ink = ink; -} + constructor(ink) { + this.ink = ink; + } } class EpsonPrinter extends Printer { -constructor(ink) { - super(ink); -} + constructor(ink) { + super(ink); + } -print() { - return 'Printer: Epson, Ink: ' + this.ink.get(); -} + print() { + return 'Printer: Epson, Ink: ' + this.ink.get(); + } } class HPprinter extends Printer { -constructor(ink) { - super(ink); -} + constructor(ink) { + super(ink); + } -print() { - return 'Printer: HP, Ink: ' + this.ink.get(); -} + print() { + return 'Printer: HP, Ink: ' + this.ink.get(); + } } class Ink { -constructor(type) { - this.type = type; -} -get() { - return this.type; -} + constructor(type) { + this.type = type; + } + + get() { + return this.type; + } } class AcrylicInk extends Ink { -constructor() { - super('acrylic-based'); -} + constructor() { + super('acrylic-based'); + } } class AlcoholInk extends Ink { -constructor() { - super('alcohol-based'); -} + constructor() { + super('alcohol-based'); + } } export { EpsonPrinter, HPprinter, AcrylicInk, AlcoholInk };` diff --git a/src/static/patterns/structural_composite.js b/src/static/patterns/structural_composite.js index 9fad8bf..1cf4215 100644 --- a/src/static/patterns/structural_composite.js +++ b/src/static/patterns/structural_composite.js @@ -4,116 +4,116 @@ const COMPOSITE = { type: 'structural', hint: 'composes zero-or-more similar objects so that they can be manipulated as one object', codeES5: `function EquipmentPattern(name) { -this.equipments = []; -this.name = name; + this.equipments = []; + this.name = name; } EquipmentPattern.prototype.add = function(equipment) { -this.equipments.push(equipment); + this.equipments.push(equipment); }; EquipmentPattern.prototype.getPrice = function() { -return this.equipments - .map(function(equipment) { - return equipment.getPrice(); - }) - .reduce(function(a, b) { - return a + b; - }); + return this.equipments + .map(function(equipment) { + return equipment.getPrice(); + }) + .reduce(function(a, b) { + return a + b; + }); }; function Equipment() {} Equipment.prototype.getPrice = function() { -return this.price; + return this.price; }; // -- leafs function FloppyDisk() { -this.name = 'Floppy Disk'; -this.price = 70; + this.name = 'Floppy Disk'; + this.price = 70; } FloppyDisk.prototype = Object.create(Equipment.prototype); function HardDrive() { -this.name = 'Hard Drive'; -this.price = 250; + this.name = 'Hard Drive'; + this.price = 250; } HardDrive.prototype = Object.create(Equipment.prototype); function Memory() { -this.name = '8gb memomry'; -this.price = 280; + this.name = '8gb memomry'; + this.price = 280; } Memory.prototype = Object.create(Equipment.prototype); module.exports = [EquipmentPattern, FloppyDisk, HardDrive, Memory];`, codeES6: `//Equipment class Equipment { -getPrice() { - return this.price || 0; -} + getPrice() { + return this.price || 0; + } -getName() { - return this.name; -} + getName() { + return this.name; + } -setName(name) { - this.name = name; -} + setName(name) { + this.name = name; + } } class Pattern extends Equipment { -constructor() { - super(); - this.equipments = []; -} - -add(equipment) { - this.equipments.push(equipment); -} - -getPrice() { - return this.equipments - .map(equipment => { - return equipment.getPrice(); - }) - .reduce((a, b) => { - return a + b; - }); -} + constructor() { + super(); + this.equipments = []; + } + + add(equipment) { + this.equipments.push(equipment); + } + + getPrice() { + return this.equipments + .map(equipment => { + return equipment.getPrice(); + }) + .reduce((a, b) => { + return a + b; + }); + } } class Cabbinet extends Pattern { -constructor() { - super(); - this.setName('cabbinet'); -} + constructor() { + super(); + this.setName('cabbinet'); + } } // --- leafs --- class FloppyDisk extends Equipment { -constructor() { - super(); - this.setName('Floppy Disk'); - this.price = 70; -} + constructor() { + super(); + this.setName('Floppy Disk'); + this.price = 70; + } } class HardDrive extends Equipment { -constructor() { - super(); - this.setName('Hard Drive'); - this.price = 250; -} + constructor() { + super(); + this.setName('Hard Drive'); + this.price = 250; + } } class Memory extends Equipment { -constructor() { - super(); - this.setName('Memory'); - this.price = 280; -} + constructor() { + super(); + this.setName('Memory'); + this.price = 280; + } } export { Cabbinet, FloppyDisk, HardDrive, Memory };` diff --git a/src/static/patterns/structural_decorator.js b/src/static/patterns/structural_decorator.js index 10249dd..c492e7c 100644 --- a/src/static/patterns/structural_decorator.js +++ b/src/static/patterns/structural_decorator.js @@ -4,79 +4,82 @@ const DECORATOR = { type: 'structural', hint: 'dynamically adds/overrides behaviour in an existing method of an object', codeES5: `function Pasta() { -this.price = 0; + this.price = 0; } + Pasta.prototype.getPrice = function() { -return this.price; + return this.price; }; function Penne() { -this.price = 8; + this.price = 8; } + Penne.prototype = Object.create(Pasta.prototype); function SaucePattern(pasta) { -this.pasta = pasta; + this.pasta = pasta; } SaucePattern.prototype.getPrice = function() { -return this.pasta.getPrice() + 5; + return this.pasta.getPrice() + 5; }; function CheesePattern(pasta) { -this.pasta = pasta; + this.pasta = pasta; } CheesePattern.prototype.getPrice = function() { -return this.pasta.getPrice() + 3; + return this.pasta.getPrice() + 3; }; module.exports = [Penne, SaucePattern, CheesePattern];`, codeES6: `class Pasta { -constructor() { - this.price = 0; -} -getPrice() { - return this.price; -} + constructor() { + this.price = 0; + } + + getPrice() { + return this.price; + } } class Penne extends Pasta { -constructor() { - super(); - this.price = 8; -} + constructor() { + super(); + this.price = 8; + } } class PastaPattern extends Pasta { -constructor(pasta) { - super(); - this.pasta = pasta; -} + constructor(pasta) { + super(); + this.pasta = pasta; + } -getPrice() { - return this.pasta.getPrice(); -} + getPrice() { + return this.pasta.getPrice(); + } } class SaucePattern extends PastaPattern { -constructor(pasta) { - super(pasta); -} + constructor(pasta) { + super(pasta); + } -getPrice() { - return super.getPrice() + 5; -} + getPrice() { + return super.getPrice() + 5; + } } class CheesePattern extends PastaPattern { -constructor(pasta) { - super(pasta); -} + constructor(pasta) { + super(pasta); + } -getPrice() { - return super.getPrice() + 3; -} + getPrice() { + return super.getPrice() + 3; + } } export { Penne, SaucePattern, CheesePattern };` diff --git a/src/static/patterns/structural_facade.js b/src/static/patterns/structural_facade.js index 40c1f84..809105d 100644 --- a/src/static/patterns/structural_facade.js +++ b/src/static/patterns/structural_facade.js @@ -4,58 +4,60 @@ const FACADE = { type: 'structural', hint: 'provides a simplified interface to a large body of code', codeES5: `var shopPattern = { -calc: function(price) { - price = discount(price); - price = fees(price); - price += shipping(); - return price; -} + calc: function(price) { + price = discount(price); + price = fees(price); + price += shipping(); + + return price; + } }; function discount(value) { -return value * 0.9; + return value * 0.9; } function shipping() { -return 5; + return 5; } function fees(value) { -return value * 1.05; + return value * 1.05; } module.exports = shopPattern;`, codeES6: `class ShopPattern { -constructor() { - this.discount = new Discount(); - this.shipping = new Shipping(); - this.fees = new Fees(); -} + constructor() { + this.discount = new Discount(); + this.shipping = new Shipping(); + this.fees = new Fees(); + } -calc(price) { - price = this.discount.calc(price); - price = this.fees.calc(price); - price += this.shipping.calc(); - return price; -} + calc(price) { + price = this.discount.calc(price); + price = this.fees.calc(price); + price += this.shipping.calc(); + + return price; + } } class Discount { -calc(value) { - return value * 0.9; -} + calc(value) { + return value * 0.9; + } } class Shipping { -calc() { - return 5; -} + calc() { + return 5; + } } class Fees { -calc(value) { - return value * 1.05; -} + calc(value) { + return value * 1.05; + } } export default ShopPattern;` diff --git a/src/static/patterns/structural_flyweight.js b/src/static/patterns/structural_flyweight.js index 3adb6c6..f547607 100644 --- a/src/static/patterns/structural_flyweight.js +++ b/src/static/patterns/structural_flyweight.js @@ -4,37 +4,41 @@ const FLYWEIGHT = { type: 'structural', hint: 'reduces the cost of creating and manipulating a large number of similar objects', codeES5: `function Color(name) { -this.name = name; + this.name = name; } var colorCreator = { -colors: {}, -create: function(name) { - var color = this.colors[name]; - if (color) return color; + colors: {}, + create: function(name) { + var color = this.colors[name]; + if (color) return color; - this.colors[name] = new Color(name); - return this.colors[name]; -} + this.colors[name] = new Color(name); + + return this.colors[name]; + } }; module.exports = colorCreator;`, codeES6: `class Color { -constructor(name) { - this.name = name; -} + constructor(name) { + this.name = name; + } } class colorCreator { -constructor(name) { - this.colors = {}; -} -create(name) { - let color = this.colors[name]; - if (color) return color; - this.colors[name] = new Color(name); - return this.colors[name]; -} + constructor(name) { + this.colors = {}; + } + + create(name) { + let color = this.colors[name]; + if (color) return color; + + this.colors[name] = new Color(name); + + return this.colors[name]; + } } export { colorCreator };` diff --git a/src/static/patterns/structural_proxy.js b/src/static/patterns/structural_proxy.js index 91b76e2..c1831b7 100644 --- a/src/static/patterns/structural_proxy.js +++ b/src/static/patterns/structural_proxy.js @@ -5,43 +5,45 @@ const PROXY = { hint: 'provides a placeholder for another object to control access, reduce cost, and reduce complexity', codeES5: `function Car() { -this.drive = function() { - return 'driving'; -}; + this.drive = function() { + return 'driving'; + }; } function CarPattern(driver) { -this.driver = driver; -this.drive = function() { - if (driver.age < 18) return 'too young to drive'; - return new Car().drive(); -}; + this.driver = driver; + this.drive = function() { + if (driver.age < 18) return 'too young to drive'; + + return new Car().drive(); + }; } function Driver(age) { -this.age = age; + this.age = age; } module.exports = [Car, CarPattern, Driver];`, codeES6: `class Car { -drive() { - return 'driving'; -} + drive() { + return 'driving'; + } } class CarPattern { -constructor(driver) { - this.driver = driver; -} -drive() { - return this.driver.age < 18 ? 'too young to drive' : new Car().drive(); -} + constructor(driver) { + this.driver = driver; + } + + drive() { + return this.driver.age < 18 ? 'too young to drive' : new Car().drive(); + } } class Driver { -constructor(age) { - this.age = age; -} + constructor(age) { + this.age = age; + } } export { Car, CarPattern, Driver };` From aeebcd241f9e8c8d7f849cb89d8caf95551cd662 Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Thu, 7 Mar 2019 13:28:12 -0500 Subject: [PATCH 03/16] Setup correct routing for patterns list and each pattern --- src/Layout.jsx | 11 ++++++--- src/components/Header.jsx | 6 ++--- src/components/Pattern.jsx | 16 ++++++++++++ src/components/PatternsList.jsx | 18 ++++++++++++++ src/pages/Patterns.jsx | 43 ++++++++------------------------- 5 files changed, 54 insertions(+), 40 deletions(-) create mode 100644 src/components/Pattern.jsx create mode 100644 src/components/PatternsList.jsx diff --git a/src/Layout.jsx b/src/Layout.jsx index 23a3bfe..6d5fdc2 100644 --- a/src/Layout.jsx +++ b/src/Layout.jsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Route, withRouter } from 'react-router-dom'; +import { Switch, Route, Redirect, withRouter } from 'react-router-dom'; import { ThemeProvider } from 'styled-components'; import { connect } from 'react-redux'; import styleLight from './styles/hljs/hljs.light'; @@ -32,9 +32,12 @@ const Layout = props => {
- } /> - - + + } /> + + + + ); diff --git a/src/components/Header.jsx b/src/components/Header.jsx index ff51622..f4644e3 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import styled, { css } from 'styled-components'; -import { Route, withRouter, Link } from 'react-router-dom'; +import { Route, withRouter, NavLink as Link } from 'react-router-dom'; import Toggle from './Toggle'; import Title from './Title'; @@ -63,7 +63,7 @@ const Header = props => { page: 'About' }, { - path: '/patterns/memento', + path: '/patterns', page: 'Patterns' } ]; @@ -72,7 +72,7 @@ const Header = props => { {paths.map(({ path, page }) => - pathname === path ? ( + pathname.includes(path) ? ( {page} ) : ( diff --git a/src/components/Pattern.jsx b/src/components/Pattern.jsx new file mode 100644 index 0000000..2094785 --- /dev/null +++ b/src/components/Pattern.jsx @@ -0,0 +1,16 @@ +import React from 'react'; +import styled from 'styled-components'; +import { Link } from 'react-router-dom'; + +const StyledPattern = styled.div``; + +const Pattern = props => { + return ( + + Back to Patterns List +

{props.match.params.id}

+
+ ); +}; + +export default Pattern; diff --git a/src/components/PatternsList.jsx b/src/components/PatternsList.jsx new file mode 100644 index 0000000..2b98caf --- /dev/null +++ b/src/components/PatternsList.jsx @@ -0,0 +1,18 @@ +import React from 'react'; +import styled from 'styled-components'; +import { Link } from 'react-router-dom'; + +const StyledPatterns = styled.div``; + +const PatternsList = () => { + return ( + +

LIST OF PATTERNS

+ Memento + Singleton + Command +
+ ); +}; + +export default PatternsList; diff --git a/src/pages/Patterns.jsx b/src/pages/Patterns.jsx index 9b91cba..9c1b6e5 100644 --- a/src/pages/Patterns.jsx +++ b/src/pages/Patterns.jsx @@ -1,36 +1,13 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; - -const StyledPatterns = styled.div``; - -const Header = styled.h3` - color: ${props => props.theme.buttonColorHover}; - margin-top: 2rem; -`; - -// const Patterns = ({ match }) => { -// const { pattern } = match.params; - -const Patterns = props => { - console.log(props); - - props.history.listen(location => { - console.log(location); - }); - - const { pattern } = props.match.params; - - return ( - -
{pattern}
-
- ); -}; - -Patterns.propTypes = { - history: PropTypes.object.isRequired, - match: PropTypes.object.isRequired -}; +import { Switch, Route } from 'react-router-dom'; +import PatternsList from '../components/PatternsList'; +import Pattern from '../components/Pattern'; + +const Patterns = () => ( + + + + +); export default Patterns; From de7d67b7bb0b2e9dc0740921bef844212f09fb33 Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Thu, 7 Mar 2019 13:31:46 -0500 Subject: [PATCH 04/16] Fix active page link --- src/components/Header.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Header.jsx b/src/components/Header.jsx index f4644e3..8824c4d 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -72,7 +72,7 @@ const Header = props => { {paths.map(({ path, page }) => - pathname.includes(path) ? ( + pathname === path ? ( {page} ) : ( From 43d7ae2c10b801e86db49620c9ee645a52ce3d63 Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Thu, 7 Mar 2019 13:44:23 -0500 Subject: [PATCH 05/16] Fix active page link for Patterns --- src/components/Header.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Header.jsx b/src/components/Header.jsx index 8824c4d..0a6d5c4 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -72,7 +72,7 @@ const Header = props => { {paths.map(({ path, page }) => - pathname === path ? ( + pathname === path || (path === '/patterns' && pathname.includes(path)) ? ( {page} ) : ( From 7f10c62cea34453f58af9c2ad522017c951cffcb Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Thu, 7 Mar 2019 13:48:39 -0500 Subject: [PATCH 06/16] Generate list of all patterns on Patterns page --- src/components/PatternsList.jsx | 12 +++++++++--- src/static/patterns/index.js | 9 +++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/components/PatternsList.jsx b/src/components/PatternsList.jsx index 2b98caf..74d7033 100644 --- a/src/components/PatternsList.jsx +++ b/src/components/PatternsList.jsx @@ -1,6 +1,7 @@ import React from 'react'; import styled from 'styled-components'; import { Link } from 'react-router-dom'; +import { patterns } from '../static/patterns'; const StyledPatterns = styled.div``; @@ -8,9 +9,14 @@ const PatternsList = () => { return (

LIST OF PATTERNS

- Memento - Singleton - Command + +
    + {patterns.map(pattern => ( +
  • + {pattern.name} +
  • + ))} +
); }; diff --git a/src/static/patterns/index.js b/src/static/patterns/index.js index f5df231..a9591ae 100644 --- a/src/static/patterns/index.js +++ b/src/static/patterns/index.js @@ -22,7 +22,7 @@ import STRATEGY from './behavioral_strategy'; import TEMPLATE from './behavioral_template'; import VISITOR from './behavioral_visitor'; -const patterns = [ +export const patterns = [ ABSTRACT_FACTORY, BUILDER, FACTORY, @@ -50,9 +50,10 @@ const patterns = [ VISITOR ]; -for (let i = patterns.length - 1; i > 0; i--) { +const mixed = [...patterns]; +for (let i = mixed.length - 1; i > 0; i--) { const rand = Math.floor(Math.random() * (i + 1)); - [patterns[i], patterns[rand]] = [patterns[rand], patterns[i]]; + [mixed[i], mixed[rand]] = [mixed[rand], mixed[i]]; } -export default patterns; +export default mixed; From df1f8e7a24601a29b3e8d1e26219a3a0fa3dc6cf Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Thu, 7 Mar 2019 14:47:24 -0500 Subject: [PATCH 07/16] Patterns List page filled with content --- src/components/PatternsList.jsx | 53 +++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/src/components/PatternsList.jsx b/src/components/PatternsList.jsx index 74d7033..fbf0962 100644 --- a/src/components/PatternsList.jsx +++ b/src/components/PatternsList.jsx @@ -6,17 +6,52 @@ import { patterns } from '../static/patterns'; const StyledPatterns = styled.div``; const PatternsList = () => { + const lister = patternType => ( +
    + {patterns.map(({ id, name, type }) => { + if (type === patternType) { + return ( +
  • + {name} +
  • + ); + } + })} +
+ ); + return ( -

LIST OF PATTERNS

- -
    - {patterns.map(pattern => ( -
  • - {pattern.name} -
  • - ))} -
+

DESIGN PATTERNS

+ +

+ In software engineering, a design pattern is a general repeatable solution to a commonly + occurring problem in software design. +

+ +

Creational Design Patterns

+

+ These design patterns are all about class instantiation. This pattern can be further divided + into class-creation patterns and object-creational patterns. While class-creation patterns + use inheritance effectively in the instantiation process, object-creation patterns use + delegation effectively to get the job done. +

+ {lister('creational')} + +

Structural Design Patterns

+

+ These design patterns are all about Class and Object composition. Structural class-creation + patterns use inheritance to compose interfaces. Structural object-patterns define ways to + compose objects to obtain new functionality. +

+ {lister('structural')} + +

Behavioral Design Patterns

+

+ These design patterns are all about Class's objects communication. Behavioral patterns are + those patterns that are most specifically concerned with communication between objects. +

+ {lister('behavioral')}
); }; From f69c4fc492d250c59dadf7425a835b3152b8f06d Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Thu, 7 Mar 2019 15:05:08 -0500 Subject: [PATCH 08/16] Style Patterns List page --- src/components/PatternsList.jsx | 20 +++++++++++++++++++- src/styles/global.js | 4 ++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/components/PatternsList.jsx b/src/components/PatternsList.jsx index fbf0962..d9fd76e 100644 --- a/src/components/PatternsList.jsx +++ b/src/components/PatternsList.jsx @@ -3,7 +3,25 @@ import styled from 'styled-components'; import { Link } from 'react-router-dom'; import { patterns } from '../static/patterns'; -const StyledPatterns = styled.div``; +const StyledPatterns = styled.div` + color: ${props => props.theme.text}; + + a { + border-bottom: 1px solid transparent; + color: ${props => props.theme.CRIMSON}; + text-decoration: none; + + &:hover { + border-bottom: 1px solid ${props => props.theme.CRIMSON}; + } + } + + h1, + h2 { + color: ${props => props.theme.header}; + margin-top: 2.5rem; + } +`; const PatternsList = () => { const lister = patternType => ( diff --git a/src/styles/global.js b/src/styles/global.js index ffec272..36b9836 100644 --- a/src/styles/global.js +++ b/src/styles/global.js @@ -12,11 +12,11 @@ const GlobalStyle = createGlobalStyle` justify-content: start; max-width: 640px; margin: auto; - padding: 0 1rem; + padding: 0 1rem 3rem; @media (min-width: 769px) { justify-content: space-between; - padding: 0; + padding: 0 0 3rem; } } `; From 4565c9ab9e1d2443978d930990b48a7c15d08c06 Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Thu, 7 Mar 2019 20:36:12 -0500 Subject: [PATCH 09/16] Style Patterns List and individual Pattern component --- src/components/Code.jsx | 4 +- src/components/Header.jsx | 8 ++-- src/components/Pattern.jsx | 82 +++++++++++++++++++++++++++++++-- src/components/PatternsList.jsx | 12 ++--- src/styles/global.js | 4 ++ src/styles/hljs/hljs.dark.js | 3 +- src/styles/hljs/hljs.light.js | 3 +- 7 files changed, 95 insertions(+), 21 deletions(-) diff --git a/src/components/Code.jsx b/src/components/Code.jsx index 8dc42b2..558698c 100644 --- a/src/components/Code.jsx +++ b/src/components/Code.jsx @@ -13,13 +13,13 @@ const Code = props => { return ( {js === 'es5' && ( - + {current.codeES5} )} {js === 'es6' && ( - + {current.codeES6} )} diff --git a/src/components/Header.jsx b/src/components/Header.jsx index 0a6d5c4..4de2e2d 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -59,12 +59,12 @@ const Header = props => { page: 'Game' }, { - path: '/about', - page: 'About' + path: '/patterns', + page: 'Pattern Reference' }, { - path: '/patterns', - page: 'Patterns' + path: '/about', + page: 'About' } ]; diff --git a/src/components/Pattern.jsx b/src/components/Pattern.jsx index 2094785..11c5904 100644 --- a/src/components/Pattern.jsx +++ b/src/components/Pattern.jsx @@ -1,16 +1,88 @@ import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; import styled from 'styled-components'; import { Link } from 'react-router-dom'; +import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'; +import js from 'react-syntax-highlighter/dist/languages/hljs/javascript'; +import styleLight from '../styles/hljs/hljs.light'; +import styleDark from '../styles/hljs/hljs.dark'; +import { patterns } from '../static/patterns'; +import { getMode } from '../selectors'; -const StyledPattern = styled.div``; +SyntaxHighlighter.registerLanguage('javascript', js); + +const StyledPattern = styled.div` + color: ${props => props.theme.text}; + + h2, + h3 { + color: ${props => props.theme.header}; + margin-top: 2.5rem; + } +`; + +const Memo = styled.span` + color: ${props => props.theme.ATLANTIS}; + display: block; +`; + +const StyledLink = styled(Link)` + border-bottom: 1px solid ${props => props.theme.CRIMSON}; + color: ${props => props.theme.CRIMSON}; + display: inline-block; + margin-top: 2rem; + text-decoration: none; + + &:hover { + border-bottom: 1px solid transparent; + } +`; + +const Pattern = ({ match, mode }) => { + const { + params: { id } + } = match; + + const pattern = patterns.filter(item => item.id === id)[0]; + + const style = mode === 'dark' ? styleDark : styleLight; -const Pattern = props => { return ( - Back to Patterns List -

{props.match.params.id}

+ ← Back to Patterns List + {pattern && ( + +

{pattern.name}

+

+ Type: + {pattern.type} pattern +

+

+ Description: + {`This pattern ${pattern.hint}.`} +

+ +

ES5

+ + {pattern.codeES5} + + +

ES6

+ + {pattern.codeES6} + +
+ )}
); }; -export default Pattern; +Pattern.propTypes = { + match: PropTypes.object.isRequired, + mode: PropTypes.string.isRequired +}; + +export default connect(state => ({ + mode: getMode(state) +}))(Pattern); diff --git a/src/components/PatternsList.jsx b/src/components/PatternsList.jsx index d9fd76e..2e50978 100644 --- a/src/components/PatternsList.jsx +++ b/src/components/PatternsList.jsx @@ -16,8 +16,8 @@ const StyledPatterns = styled.div` } } - h1, - h2 { + h2, + h3 { color: ${props => props.theme.header}; margin-top: 2.5rem; } @@ -40,14 +40,14 @@ const PatternsList = () => { return ( -

DESIGN PATTERNS

+

Design Patterns

In software engineering, a design pattern is a general repeatable solution to a commonly occurring problem in software design.

-

Creational Design Patterns

+

Creational Design Patterns

These design patterns are all about class instantiation. This pattern can be further divided into class-creation patterns and object-creational patterns. While class-creation patterns @@ -56,7 +56,7 @@ const PatternsList = () => {

{lister('creational')} -

Structural Design Patterns

+

Structural Design Patterns

These design patterns are all about Class and Object composition. Structural class-creation patterns use inheritance to compose interfaces. Structural object-patterns define ways to @@ -64,7 +64,7 @@ const PatternsList = () => {

{lister('structural')} -

Behavioral Design Patterns

+

Behavioral Design Patterns

These design patterns are all about Class's objects communication. Behavioral patterns are those patterns that are most specifically concerned with communication between objects. diff --git a/src/styles/global.js b/src/styles/global.js index 36b9836..4f2a566 100644 --- a/src/styles/global.js +++ b/src/styles/global.js @@ -19,6 +19,10 @@ const GlobalStyle = createGlobalStyle` padding: 0 0 3rem; } } + + .fixed { + height: 375px + } `; export default GlobalStyle; diff --git a/src/styles/hljs/hljs.dark.js b/src/styles/hljs/hljs.dark.js index d520dfd..0bdd897 100644 --- a/src/styles/hljs/hljs.dark.js +++ b/src/styles/hljs/hljs.dark.js @@ -5,8 +5,7 @@ const styles = { overflowX: 'auto', padding: '1em', background: '#282828', - color: '#ebdbb2', - height: 375 + color: '#ebdbb2' }, 'hljs-subst': { color: '#ebdbb2' diff --git a/src/styles/hljs/hljs.light.js b/src/styles/hljs/hljs.light.js index 51300b7..50a2791 100644 --- a/src/styles/hljs/hljs.light.js +++ b/src/styles/hljs/hljs.light.js @@ -5,8 +5,7 @@ const styles = { overflowX: 'auto', padding: '1em', color: '#383a42', - background: '#fafafa', - height: 375 + background: '#fafafa' }, 'hljs-comment': { color: '#a0a1a7', From 9fa168a5a872bbd132a214adf67d0c462daa2f17 Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Thu, 7 Mar 2019 20:37:59 -0500 Subject: [PATCH 10/16] Reset game progress on visiting a pattern reference --- src/components/Pattern.jsx | 88 ++++++++++++++++++++++---------------- 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/src/components/Pattern.jsx b/src/components/Pattern.jsx index 11c5904..eabf552 100644 --- a/src/components/Pattern.jsx +++ b/src/components/Pattern.jsx @@ -8,6 +8,7 @@ import js from 'react-syntax-highlighter/dist/languages/hljs/javascript'; import styleLight from '../styles/hljs/hljs.light'; import styleDark from '../styles/hljs/hljs.dark'; import { patterns } from '../static/patterns'; +import { restart } from '../actions/restart'; import { getMode } from '../selectors'; SyntaxHighlighter.registerLanguage('javascript', js); @@ -39,50 +40,63 @@ const StyledLink = styled(Link)` } `; -const Pattern = ({ match, mode }) => { - const { - params: { id } - } = match; +// const Pattern = ({ match, mode }) => { +class Pattern extends React.Component { + componentDidMount() { + this.props.reset(); + } - const pattern = patterns.filter(item => item.id === id)[0]; + render() { + const { + params: { id } + } = this.props.match; - const style = mode === 'dark' ? styleDark : styleLight; + const pattern = patterns.filter(item => item.id === id)[0]; - return ( - - ← Back to Patterns List - {pattern && ( - -

{pattern.name}

-

- Type: - {pattern.type} pattern -

-

- Description: - {`This pattern ${pattern.hint}.`} -

+ const style = this.props.mode === 'dark' ? styleDark : styleLight; -

ES5

- - {pattern.codeES5} - + return ( + + ← Back to Patterns List + {pattern && ( + +

{pattern.name}

+

+ Type: + {pattern.type} pattern +

+

+ Description: + {`This pattern ${pattern.hint}.`} +

-

ES6

- - {pattern.codeES6} - -
- )} -
- ); -}; +

ES5

+ + {pattern.codeES5} + + +

ES6

+ + {pattern.codeES6} + + + )} + + ); + } +} Pattern.propTypes = { match: PropTypes.object.isRequired, - mode: PropTypes.string.isRequired + mode: PropTypes.string.isRequired, + reset: PropTypes.func.isRequired }; -export default connect(state => ({ - mode: getMode(state) -}))(Pattern); +export default connect( + state => ({ + mode: getMode(state) + }), + { + reset: () => restart() + } +)(Pattern); From 634aea5ac581307c98aeefec0303985caf3f9584 Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Fri, 8 Mar 2019 08:45:47 -0500 Subject: [PATCH 11/16] FInish Pattern component styling in Reference --- src/components/Pattern.jsx | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/components/Pattern.jsx b/src/components/Pattern.jsx index eabf552..12429e2 100644 --- a/src/components/Pattern.jsx +++ b/src/components/Pattern.jsx @@ -23,9 +23,17 @@ const StyledPattern = styled.div` } `; -const Memo = styled.span` - color: ${props => props.theme.ATLANTIS}; +const SubHeader = styled.span` + background-color: ${props => props.theme.titleBackground}; + color: ${props => props.theme.header}; display: block; + margin-bottom: 8px; + padding: 4px; + text-transform: uppercase; +`; + +const Type = styled.span` + text-transform: capitalize; `; const StyledLink = styled(Link)` @@ -40,7 +48,6 @@ const StyledLink = styled(Link)` } `; -// const Pattern = ({ match, mode }) => { class Pattern extends React.Component { componentDidMount() { this.props.reset(); @@ -62,11 +69,11 @@ class Pattern extends React.Component {

{pattern.name}

- Type: - {pattern.type} pattern + Type: + {pattern.type} pattern

- Description: + Description: {`This pattern ${pattern.hint}.`}

From 41e292555d776cc9cddab4634e490784589c46de Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Fri, 8 Mar 2019 08:56:29 -0500 Subject: [PATCH 12/16] Add scroll to top on page change --- index.js | 11 +++++++---- src/components/ScrollToTop.js | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 src/components/ScrollToTop.js diff --git a/index.js b/index.js index db0ec1a..16fadb5 100644 --- a/index.js +++ b/index.js @@ -1,15 +1,18 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; -import { BrowserRouter } from 'react-router-dom'; +import { BrowserRouter as Router } from 'react-router-dom'; import store from './src/store'; import Layout from './src/Layout'; +import ScrollToTop from './src/components/ScrollToTop'; const App = () => ( - - - + + + + + ); diff --git a/src/components/ScrollToTop.js b/src/components/ScrollToTop.js new file mode 100644 index 0000000..e4ca817 --- /dev/null +++ b/src/components/ScrollToTop.js @@ -0,0 +1,22 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { withRouter } from 'react-router-dom'; + +class ScrollToTop extends Component { + componentDidUpdate(prevProps) { + if (this.props.location.pathname !== prevProps.location.pathname) { + window.scrollTo(0, 0); + } + } + + render() { + return this.props.children; + } +} + +ScrollToTop.propTypes = { + location: PropTypes.object.isRequired, + children: PropTypes.object.isRequired +}; + +export default withRouter(ScrollToTop); From 817d1fe673d0f0ef76f422113559c9f2b574a745 Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Fri, 8 Mar 2019 09:19:24 -0500 Subject: [PATCH 13/16] Update Layout tests to have 2 links in header --- __tests__/Layout.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/__tests__/Layout.test.js b/__tests__/Layout.test.js index b7a44fe..936fb35 100644 --- a/__tests__/Layout.test.js +++ b/__tests__/Layout.test.js @@ -65,8 +65,8 @@ describe('Layout', () => { expect(tree.find('header h1').text()).toMatch('Design Patterns'); }); - it('renders 1 link', () => { - expect(tree.find('header a')).toHaveLength(1); + it('renders 2 links', () => { + expect(tree.find('header a')).toHaveLength(2); }); it('renders 1 span', () => { @@ -108,8 +108,8 @@ describe('Layout', () => { expect(tree.find('header h1').text()).toMatch('Design Patterns'); }); - it('renders 1 link', () => { - expect(tree.find('header a')).toHaveLength(1); + it('renders 2 links', () => { + expect(tree.find('header a')).toHaveLength(2); }); it('renders 1 span', () => { From fcab10cee47c32688439e348a394cea5397e22ab Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Fri, 8 Mar 2019 09:20:04 -0500 Subject: [PATCH 14/16] Update snapshots --- .../components/__snapshots__/Code.test.js.snap | 4 ++-- .../__snapshots__/Header.test.js.snap | 18 ++++++++++++++++++ .../pages/__snapshots__/Game.test.js.snap | 10 ++++------ .../styles/__snapshots__/global.test.js.snap | 8 ++++---- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/__tests__/components/__snapshots__/Code.test.js.snap b/__tests__/components/__snapshots__/Code.test.js.snap index 34eb48a..627960d 100644 --- a/__tests__/components/__snapshots__/Code.test.js.snap +++ b/__tests__/components/__snapshots__/Code.test.js.snap @@ -2,13 +2,13 @@ exports[` component renders ES5 code in LIGHT mode 1`] = `
 component renders ES5 code in LIGHT mode 1`] = `
 
 exports[` component renders ES6 code in DARK mode 1`] = `
 
 component renders with DARK theme 1`] = `
         Game
       
       
+        Pattern Reference
+      
+       component renders with LIGHT theme 1`] = `
         Game
       
       
+        Pattern Reference
+      
+       component 1`] = `
         "border": "1px solid #555",
         "color": "#ebdbb2",
         "display": "block",
-        "height": 375,
         "overflowX": "auto",
         "padding": "1em",
       },
@@ -165,6 +164,7 @@ exports[`Game page - GAME - DARK style renders a  component 1`] = `
   }
 >
    component 1`] = `
           "border": "1px solid #555",
           "color": "#ebdbb2",
           "display": "block",
-          "height": 375,
           "overflowX": "auto",
           "padding": "1em",
         },
@@ -315,13 +314,13 @@ exports[`Game page - GAME - DARK style renders a  component 1`] = `
     }
   >
     
 component 1`] = `
         "border": "1px solid #d8d8d8",
         "color": "#383a42",
         "display": "block",
-        "height": 375,
         "overflowX": "auto",
         "padding": "1em",
       },
@@ -594,6 +592,7 @@ exports[`Game page - GAME - LIGHT style renders a  component 1`] = `
   }
 >
    component 1`] = `
           "border": "1px solid #d8d8d8",
           "color": "#383a42",
           "display": "block",
-          "height": 375,
           "overflowX": "auto",
           "padding": "1em",
         },
@@ -715,13 +713,13 @@ exports[`Game page - GAME - LIGHT style renders a  component 1`] = `
     }
   >
     
     
     
-/* sc-component-id: sc-global-3505832014 */
-body{background:#222222;font-family:'Karla',sans-serif;margin:0;padding:0;} #root{-webkit-box-pack:start;-webkit-justify-content:start;-ms-flex-pack:start;justify-content:start;max-width:640px;margin:auto;padding:0 1rem;} @media (min-width:769px){#root{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:0;}}
+/* sc-component-id: sc-global-1470103548 */
+body{background:#222222;font-family:'Karla',sans-serif;margin:0;padding:0;} #root{-webkit-box-pack:start;-webkit-justify-content:start;-ms-flex-pack:start;justify-content:start;max-width:640px;margin:auto;padding:0 1rem 3rem;} @media (min-width:769px){#root{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:0 0 3rem;}} .fixed{height:375px;}
   
 
 `;
@@ -22,8 +22,8 @@ exports[`Global style renders with a LIGHT theme 1`] = `
   >
     
     
-/* sc-component-id: sc-global-3505832014 */
-body{background:#FFFFFF;font-family:'Karla',sans-serif;margin:0;padding:0;} #root{-webkit-box-pack:start;-webkit-justify-content:start;-ms-flex-pack:start;justify-content:start;max-width:640px;margin:auto;padding:0 1rem;} @media (min-width:769px){#root{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:0;}}
+/* sc-component-id: sc-global-1470103548 */
+body{background:#FFFFFF;font-family:'Karla',sans-serif;margin:0;padding:0;} #root{-webkit-box-pack:start;-webkit-justify-content:start;-ms-flex-pack:start;justify-content:start;max-width:640px;margin:auto;padding:0 1rem 3rem;} @media (min-width:769px){#root{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:0 0 3rem;}} .fixed{height:375px;}
   
 
 `;

From 25729fa4768ea65cae88e2eb699ea79590ee3e93 Mon Sep 17 00:00:00 2001
From: Zoltan Toth 
Date: Fri, 8 Mar 2019 09:21:19 -0500
Subject: [PATCH 15/16] Add Patterns page snapshot tests

---
 __tests__/pages/Patterns.test.js              |  38 ++
 .../pages/__snapshots__/Patterns.test.js.snap | 605 ++++++++++++++++++
 2 files changed, 643 insertions(+)
 create mode 100644 __tests__/pages/Patterns.test.js
 create mode 100644 __tests__/pages/__snapshots__/Patterns.test.js.snap

diff --git a/__tests__/pages/Patterns.test.js b/__tests__/pages/Patterns.test.js
new file mode 100644
index 0000000..8a02449
--- /dev/null
+++ b/__tests__/pages/Patterns.test.js
@@ -0,0 +1,38 @@
+import React from 'react';
+import { MemoryRouter } from 'react-router-dom';
+import renderer from 'react-test-renderer';
+import { Provider } from 'react-redux';
+import configureMockStore from 'redux-mock-store';
+import 'jest-styled-components';
+import Patterns from '../../src/pages/Patterns';
+
+const mockStore = configureMockStore();
+const store = mockStore({
+  mode: 'dark'
+});
+
+describe('Patterns page', () => {
+  it('renders the Patterns list', () => {
+    const tree = renderer
+      .create(
+        
+          
+        
+      )
+      .toJSON();
+    expect(tree).toMatchSnapshot();
+  });
+
+  it('renders the individual Pattern (Singleton) info', () => {
+    const tree = renderer
+      .create(
+        
+          
+            
+          
+        
+      )
+      .toJSON();
+    expect(tree).toMatchSnapshot();
+  });
+});
diff --git a/__tests__/pages/__snapshots__/Patterns.test.js.snap b/__tests__/pages/__snapshots__/Patterns.test.js.snap
new file mode 100644
index 0000000..034fc87
--- /dev/null
+++ b/__tests__/pages/__snapshots__/Patterns.test.js.snap
@@ -0,0 +1,605 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Patterns page renders the Patterns list 1`] = `
+.c0 a {
+  border-bottom: 1px solid transparent;
+  -webkit-text-decoration: none;
+  text-decoration: none;
+}
+
+.c0 a:hover {
+  border-bottom: 1px solid;
+}
+
+.c0 h2,
+.c0 h3 {
+  margin-top: 2.5rem;
+}
+
+
+

+ Design Patterns +

+

+ In software engineering, a design pattern is a general repeatable solution to a commonly occurring problem in software design. +

+

+ Creational Design Patterns +

+

+ These design patterns are all about class instantiation. This pattern can be further divided into class-creation patterns and object-creational patterns. While class-creation patterns use inheritance effectively in the instantiation process, object-creation patterns use delegation effectively to get the job done. +

+
+

+ Structural Design Patterns +

+

+ These design patterns are all about Class and Object composition. Structural class-creation patterns use inheritance to compose interfaces. Structural object-patterns define ways to compose objects to obtain new functionality. +

+ +

+ Behavioral Design Patterns +

+

+ These design patterns are all about Class's objects communication. Behavioral patterns are those patterns that are most specifically concerned with communication between objects. +

+ +
+`; + +exports[`Patterns page renders the individual Pattern (Singleton) info 1`] = ` +.c0 h2, +.c0 h3 { + margin-top: 2.5rem; +} + +.c2 { + display: block; + margin-bottom: 8px; + padding: 4px; + text-transform: uppercase; +} + +.c3 { + text-transform: capitalize; +} + +.c1 { + border-bottom: 1px solid; + display: inline-block; + margin-top: 2rem; + -webkit-text-decoration: none; + text-decoration: none; +} + +.c1:hover { + border-bottom: 1px solid transparent; +} + +
+ + ← Back to Patterns List + +

+ Singleton +

+

+ + Type: + + + creational + pattern + +

+

+ + Description: + + This pattern restricts object creation for a class to only one instance. +

+

+ ES5 +

+
+    
+      
+        
+          function
+        
+         
+        
+          Person
+        
+        (
+        
+        ) 
+      
+      {
+  
+      
+        if
+      
+       (
+      
+        typeof
+      
+       Person.instance === 
+      
+        'object'
+      
+      ) 
+      
+        return
+      
+       Person.instance;
+
+  Person.instance = 
+      
+        this
+      
+      ;
+
+  
+      
+        return
+      
+       
+      
+        this
+      
+      ;
+}
+
+
+      
+        module
+      
+      .exports = Person;
+    
+  
+

+ ES6 +

+
+    
+      
+        
+          class
+        
+         
+        
+          Person
+        
+         
+      
+      {
+  
+      
+        constructor
+      
+      () {
+    
+      
+        if
+      
+       (
+      
+        typeof
+      
+       Person.instance === 
+      
+        'object'
+      
+      ) {
+      
+      
+        return
+      
+       Person.instance;
+    }
+
+    Person.instance = 
+      
+        this
+      
+      ;
+
+    
+      
+        return
+      
+       
+      
+        this
+      
+      ;
+  }
+}
+
+
+      
+        export
+      
+       
+      
+        default
+      
+       Person;
+    
+  
+
+`; From eb1070a12961f24c23cd29c6d35c76d13e462fae Mon Sep 17 00:00:00 2001 From: Zoltan Toth Date: Fri, 8 Mar 2019 10:31:00 -0500 Subject: [PATCH 16/16] Tests for PatternList and Pattern components --- __tests__/components/Pattern.test.js | 43 ++ __tests__/components/PatternsList.test.js | 18 + .../__snapshots__/Pattern.test.js.snap | 369 ++++++++++++++++++ .../__snapshots__/PatternsList.test.js.snap | 237 +++++++++++ 4 files changed, 667 insertions(+) create mode 100644 __tests__/components/Pattern.test.js create mode 100644 __tests__/components/PatternsList.test.js create mode 100644 __tests__/components/__snapshots__/Pattern.test.js.snap create mode 100644 __tests__/components/__snapshots__/PatternsList.test.js.snap diff --git a/__tests__/components/Pattern.test.js b/__tests__/components/Pattern.test.js new file mode 100644 index 0000000..c401b06 --- /dev/null +++ b/__tests__/components/Pattern.test.js @@ -0,0 +1,43 @@ +import React from 'react'; +import { MemoryRouter } from 'react-router-dom'; +import renderer from 'react-test-renderer'; +import { Provider } from 'react-redux'; +import configureMockStore from 'redux-mock-store'; +import 'jest-styled-components'; +import Pattern from '../../src/components/Pattern'; + +const mockStore = configureMockStore(); + +describe('REFERENCE - Pattern component', () => { + it('renders the individual pattern (Singleton) details in DARK mode', () => { + const store = mockStore({ + mode: 'dark' + }); + const tree = renderer + .create( + + + + + + ) + .toJSON(); + expect(tree).toMatchSnapshot(); + }); + + xit('renders the individual pattern (Singleton) details in LIGHT mode', () => { + const store = mockStore({ + mode: 'light' + }); + const tree = renderer + .create( + + + + + + ) + .toJSON(); + expect(tree).toMatchSnapshot(); + }); +}); diff --git a/__tests__/components/PatternsList.test.js b/__tests__/components/PatternsList.test.js new file mode 100644 index 0000000..b59f189 --- /dev/null +++ b/__tests__/components/PatternsList.test.js @@ -0,0 +1,18 @@ +import React from 'react'; +import renderer from 'react-test-renderer'; +import { MemoryRouter } from 'react-router-dom'; +import 'jest-styled-components'; +import PatternsList from '../../src/components/PatternsList'; + +describe('REFERENCE - Patterns List', () => { + it('renders all the patterns', () => { + const tree = renderer + .create( + + + + ) + .toJSON(); + expect(tree).toMatchSnapshot(); + }); +}); diff --git a/__tests__/components/__snapshots__/Pattern.test.js.snap b/__tests__/components/__snapshots__/Pattern.test.js.snap new file mode 100644 index 0000000..81a3e6e --- /dev/null +++ b/__tests__/components/__snapshots__/Pattern.test.js.snap @@ -0,0 +1,369 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`REFERENCE - Pattern component renders the individual pattern (Singleton) details in DARK mode 1`] = ` +.c0 h2, +.c0 h3 { + margin-top: 2.5rem; +} + +.c2 { + display: block; + margin-bottom: 8px; + padding: 4px; + text-transform: uppercase; +} + +.c3 { + text-transform: capitalize; +} + +.c1 { + border-bottom: 1px solid; + display: inline-block; + margin-top: 2rem; + -webkit-text-decoration: none; + text-decoration: none; +} + +.c1:hover { + border-bottom: 1px solid transparent; +} + +
+ + ← Back to Patterns List + +

+ Singleton +

+

+ + Type: + + + creational + pattern + +

+

+ + Description: + + This pattern restricts object creation for a class to only one instance. +

+

+ ES5 +

+
+    
+      
+        
+          function
+        
+         
+        
+          Person
+        
+        (
+        
+        ) 
+      
+      {
+  
+      
+        if
+      
+       (
+      
+        typeof
+      
+       Person.instance === 
+      
+        'object'
+      
+      ) 
+      
+        return
+      
+       Person.instance;
+
+  Person.instance = 
+      
+        this
+      
+      ;
+
+  
+      
+        return
+      
+       
+      
+        this
+      
+      ;
+}
+
+
+      
+        module
+      
+      .exports = Person;
+    
+  
+

+ ES6 +

+
+    
+      
+        
+          class
+        
+         
+        
+          Person
+        
+         
+      
+      {
+  
+      
+        constructor
+      
+      () {
+    
+      
+        if
+      
+       (
+      
+        typeof
+      
+       Person.instance === 
+      
+        'object'
+      
+      ) {
+      
+      
+        return
+      
+       Person.instance;
+    }
+
+    Person.instance = 
+      
+        this
+      
+      ;
+
+    
+      
+        return
+      
+       
+      
+        this
+      
+      ;
+  }
+}
+
+
+      
+        export
+      
+       
+      
+        default
+      
+       Person;
+    
+  
+
+`; diff --git a/__tests__/components/__snapshots__/PatternsList.test.js.snap b/__tests__/components/__snapshots__/PatternsList.test.js.snap new file mode 100644 index 0000000..b0dac56 --- /dev/null +++ b/__tests__/components/__snapshots__/PatternsList.test.js.snap @@ -0,0 +1,237 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`REFERENCE - Patterns List renders all the patterns 1`] = ` +.c0 a { + border-bottom: 1px solid transparent; + -webkit-text-decoration: none; + text-decoration: none; +} + +.c0 a:hover { + border-bottom: 1px solid; +} + +.c0 h2, +.c0 h3 { + margin-top: 2.5rem; +} + +
+

+ Design Patterns +

+

+ In software engineering, a design pattern is a general repeatable solution to a commonly occurring problem in software design. +

+

+ Creational Design Patterns +

+

+ These design patterns are all about class instantiation. This pattern can be further divided into class-creation patterns and object-creational patterns. While class-creation patterns use inheritance effectively in the instantiation process, object-creation patterns use delegation effectively to get the job done. +

+ +

+ Structural Design Patterns +

+

+ These design patterns are all about Class and Object composition. Structural class-creation patterns use inheritance to compose interfaces. Structural object-patterns define ways to compose objects to obtain new functionality. +

+ +

+ Behavioral Design Patterns +

+

+ These design patterns are all about Class's objects communication. Behavioral patterns are those patterns that are most specifically concerned with communication between objects. +

+ +
+`;