Skip to content

Commit d470546

Browse files
authored
Merge pull request #7 from lppjunior/develop
Add pipeline pattern
2 parents fc1c917 + da72eac commit d470546

16 files changed

+163
-42
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [1.2.0] - 2020-08-25
11+
### Feature
12+
- Added pipeline pattern
13+
1014
## [1.1.0] - 2020-08-24
1115
### Feature
1216
- Added middleware pattern

README.md

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,39 @@ See many characteristics of this library:
88

99
| Available Patterns |
1010
|--------------------------|
11-
| [Observer](Observer) |
12-
| [Middleware](Middleware) |
11+
| [Middleware](#Middleware) |
12+
| [Observer](#Observer) |
13+
| [Pipeline](#Pipeline) |
14+
15+
## Middleware
16+
A single implementation of Middleware pattern
17+
18+
**Class structure**
19+
```js
20+
class Middleware() {
21+
use(callback: function)
22+
process(...data: object)
23+
}
24+
```
25+
26+
## Example
27+
28+
```js
29+
const middleware = new Middleware()
30+
31+
middleware.use((param1, param2, param3, next) => {
32+
param1 = 'param 1 UPDATED'
33+
console.log('Execution 1', param1, param2, param3)
34+
next()
35+
})
36+
37+
middleware.use((param1, param2, param3, next) => {
38+
console.log('Execution 2', param1, param2, param3) // param1 = 'param 1 UPDATED'
39+
next()
40+
})
41+
42+
middleware.process('param 1', 'param 2', 'param 3')
43+
```
1344
1445
## Observer
1546
The instance (or model) maintains a collection of objects (observers) and will notify them of any changes in their state.
@@ -33,34 +64,26 @@ class Observer() {
3364
observer.emit('test', { status: 'Observer emit successful' })
3465
```
3566
36-
## Middleware
37-
A single implementation of Middleware pattern
67+
## Pipeline
68+
A Pipeline pattern implementation
3869
3970
**Class structure**
4071
```js
41-
class Middleware() {
42-
use(callback: function)
43-
process(...data: object)
72+
class Pipeline() {
73+
pipe(callback: function)
74+
process(data: object)
4475
}
4576
```
4677
4778
## Example
4879
4980
```js
50-
const middleware = new Middleware()
81+
const result = (new Pipeline())
82+
.pipe((data) => data + 5)
83+
.pipe((data) => data * 20)
84+
.pipe((data) => data / 2)
85+
.process(5) // result 100
5186

52-
middleware.use((param1, param2, param3, next) => {
53-
param1 = 'param 1 UPDATED'
54-
console.log('Execution 1', param1, param2, param3)
55-
next()
56-
})
57-
58-
middleware.use((param1, param2, param3, next) => {
59-
console.log('Execution 2', param1, param2, param3) // param1 = 'param 1 UPDATED'
60-
next()
61-
})
62-
63-
middleware.process('param 1', 'param 2', 'param 3')
6487
```
6588
6689
## Versioning

dist/favicon.png

-552 Bytes
Binary file not shown.

dist/index.html

Lines changed: 0 additions & 1 deletion
This file was deleted.

dist/main.js

Lines changed: 0 additions & 12 deletions
This file was deleted.

dist/patterns.min.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

dist/patterns.min.js.map

Lines changed: 0 additions & 1 deletion
This file was deleted.

src-example/index.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
<h1>Patter JS</h1>
1212
<p>Open you inspection to see result</p>
1313

14-
<script src="main.js"></script>
14+
<script src="middleware.js"></script>
15+
<script src="observer.js"></script>
16+
<script src="pipeline.js"></script>
1517
</body>
1618
</html>

src-example/src/middleware.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
function testMiddleware () {
2+
const middleware = new Middleware()
3+
middleware.use((param1, param2, next) => {
4+
param1.test += ' UPDATED'
5+
console.log('[middleware] ', param1, param2)
6+
next(param1, param2)
7+
})
8+
9+
middleware.use((param1, param2, next) => {
10+
param2 = param2 + ' UPDATED'
11+
console.log('[middleware] ', param1, param2)
12+
next(param1, param2)
13+
})
14+
15+
middleware.use((param1, param2, next) => {
16+
console.log('[middleware] ', param1, param2)
17+
next(param1, param2)
18+
})
19+
20+
middleware.process({ test: 123, value: 'aaa' }, 'test')
21+
}
22+
23+
document.addEventListener('DOMContentLoaded', testMiddleware, false)

src-example/main.js renamed to src-example/src/observer.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ function runExample () {
33
}
44

55
function testObserver () {
6+
console.log('[observer] ', 'test')
67
const observer = new Observer()
7-
observer.on('test', (data) => console.log(data))
8-
observer.on('test', (data) => console.log('Test 2 > ', data))
8+
observer.on('test', (data) => console.log('[observer] ', data))
9+
observer.on('test', (data) => console.log('[observer] ', 'Test 2 > ', data))
910
observer.emit('test', { status: 'Observer emit successful' })
1011
}
1112

src-example/src/pipeline.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
function testPipeline () {
2+
const result = (new Pipeline())
3+
.pipe((data) => {
4+
console.log('[pipeline] ', data + ' + ' + 5)
5+
return data + 5
6+
})
7+
.pipe((data) => {
8+
console.log('[pipeline] ', data + ' * ' + 3)
9+
return data * 3
10+
})
11+
.pipe((data) => {
12+
console.log('[pipeline] ', data + ' + ' + 150)
13+
return data + 150
14+
})
15+
.process(5)
16+
17+
console.log('[pipeline] result: ', result)
18+
}
19+
20+
document.addEventListener('DOMContentLoaded', testPipeline, false)

src/index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
import Middleware from './pattern/middleware'
12
import Observer from './pattern/observer'
3+
import Pipeline from './pattern/pipeline'
24

35
export {
4-
Observer
6+
Middleware,
7+
Observer,
8+
Pipeline
59
}

src/pattern/pipeline/Pipeline.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Pipeline {
2+
constructor () {
3+
this.pipelines = []
4+
}
5+
6+
pipe (callback) {
7+
this.pipelines.push(callback)
8+
return this
9+
}
10+
11+
process (data) {
12+
let result = data
13+
return this.pipelines.map(fn => (result = fn(result))).pop()
14+
}
15+
}
16+
17+
export default Pipeline
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import Pipeline from '../Pipeline'
2+
3+
describe('Test Pipeline call all methods', () => {
4+
const pipeline = new Pipeline()
5+
6+
test('should assert method pipeline.pipe was called', () => {
7+
jest.spyOn(pipeline, 'pipe')
8+
pipeline.pipe(() => {})
9+
expect(pipeline.pipe).toHaveBeenCalled()
10+
})
11+
12+
test('should assert method pipeline.process was called', () => {
13+
jest.spyOn(pipeline, 'process')
14+
pipeline.process(() => {})
15+
expect(pipeline.process).toHaveBeenCalled()
16+
})
17+
})
18+
19+
describe('Test Pipeline call perfect scenaries', () => {
20+
const result = (new Pipeline())
21+
.pipe((data) => {
22+
test('Data should be 5', () => {
23+
expect(data).toBe(5)
24+
})
25+
26+
return data + 5
27+
})
28+
.pipe((data) => {
29+
test('Data should be 10', () => {
30+
expect(data).toBe(10)
31+
})
32+
33+
return data * 2
34+
})
35+
.process(5)
36+
37+
test('Result should be 20', () => {
38+
expect(result).toBe(20)
39+
})
40+
})

src/pattern/pipeline/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import Pipeline from './Pipeline'
2+
3+
export default Pipeline

webpack.config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ module.exports = {
88
patterns: './src'
99
},
1010
output: {
11-
filename: '[name].min.js',
11+
filename: 'src/[name].min.js',
1212
path: path.resolve(__dirname, 'dist'),
1313
libraryTarget: 'umd'
1414
},
@@ -22,7 +22,7 @@ module.exports = {
2222
}),
2323
new CopyPlugin({
2424
patterns: [
25-
{ from: 'src-example/main.js', to: '' }
25+
path.resolve(__dirname, 'src-example', 'src')
2626
]
2727
})
2828
],

0 commit comments

Comments
 (0)