Skip to content

Typescript #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions babel.config.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
module.exports = {
presets: ['@babel/env'],
plugins: ['@babel/plugin-transform-modules-commonjs']
presets: [
[
'@babel/preset-env',
{
targets: {
node: 'current'
}
}
],
'@babel/preset-typescript'
]
}
4 changes: 2 additions & 2 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module.exports = {
rootDir: 'src',
clearMocks: true,
coverageDirectory: 'coverage',
coverageReporters: ['lcov', 'text-summary'],
testMatch: ['<rootDir>/src/(/**/*.spec.(js)|**/__tests__/*.(js))'],
coverageReporters: ['lcov', 'text-summary']
}
10,046 changes: 10,046 additions & 0 deletions package-lock.json

Large diffs are not rendered by default.

40 changes: 21 additions & 19 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,34 @@
"license": "MIT",
"private": true,
"scripts": {
"start": "parcel src/pinchito/index.html",
"test": "jest --coverage",
"lint": "prettier --config ./prettier.config.js --loglevel error --write \"{src,__{tests,mocks}__}/**/*.js\"",
"build": "babel src -d dist"
"lint": "prettier --config ./prettier.config.js --loglevel error --list-different \"{src,__{tests,mocks}__}/**/*.ts\"",
"lint:fix": "npm run lint -- --write",
"build": "babel src -d dist",
"compile": "tsc --pretty"
},
"devDependencies": {
"@babel/cli": "7.2.3",
"@babel/core": "7.2.2",
"@babel/plugin-transform-modules-commonjs": "7.2.0",
"@babel/polyfill": "7.2.5",
"@babel/preset-env": "7.2.3",
"@types/jest": "23.3.12",
"babel-core": "7.0.0-bridge.0",
"babel-jest": "23.6.0",
"eslint": "5.12.0",
"eslint-config-prettier": "3.4.0",
"eslint-plugin-jest": "22.1.3",
"eslint-plugin-prettier": "3.0.1",
"husky": "1.3.1",
"jest": "23.6.0",
"prettier": "1.15.3",
"pretty-quick": "1.8.1"
"@babel/core": "7.7.2",
"@babel/preset-env": "7.7.1",
"@babel/preset-typescript": "7.7.2",
"@types/jest": "24.0.23",
"@types/node": "12.12.8",
"eslint": "6.6.0",
"eslint-config-prettier": "6.6.0",
"eslint-plugin-jest": "23.0.4",
"eslint-plugin-prettier": "3.1.1",
"husky": "3.1.0",
"jest": "24.9.0",
"parcel-bundler": "1.12.4",
"prettier": "1.19.1",
"pretty-quick": "2.0.1",
"typescript": "3.7.2"
},
"husky": {
"hooks": {
"pre-commit": "pretty-quick --staged",
"pre-push": "prettier --list-different --config ./prettier.config.js \"{src,__{tests,mocks}__}/**/*.js\" && yarn test",
"pre-push": "npm run lint && yarn test",
"post-commit": "git update-index -g"
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ export function multiply(a = 1, b = 1) {
return a * b
}

export function priceAfterTaxes(price, tax = multiply(21, 0.01)) {
export function priceAfterTaxes(price: number, tax = multiply(21, 0.01)) {
return price + price * tax
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
export function isRequired() {
export function isRequired(): never {
throw new TypeError('Argument is required')
}

export function capitalize(string = isRequired()) {
export function capitalize(string: string = isRequired()) {
return string.toUpperCase().slice(0, 1) + string.slice(1)
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,38 +7,36 @@ import { mockDate } from '../../../tests/utils/mockDate'

describe('pipe', () => {
test('debería ejecutar las funciones en orden y con el valor anterior', () => {
const functions = [() => 1, value => value + 2]

const composedFunctions = pipe(...functions)
const composedFunctions = pipe(
() => 1,
(value: number) => value + 2
)
const result = composedFunctions()
expect(result).toBe(3)
})

test('invoca primero a la primera función', () => {
const fnMock = jest.fn()

const functions = [() => fnMock('first'), () => fnMock('second')]

const composedFunctions = pipe(...functions)
const composedFunctions = pipe(
() => fnMock('first'),
() => fnMock('second')
)
composedFunctions()
expect(fnMock).toHaveBeenNthCalledWith(1, 'first')
})

test('debe aplicar las funciones', () => {
const exclamation = string => `${string}!`
const dash = string =>
const exclamation = (string: string) => `${string}!`
const dash = (string: string) =>
string
.split(' ')
.map(word => word.split('').join('-'))
.join(' ')
const upperCase = string => string.toUpperCase()
const upperCase = (string: string) => string.toUpperCase()
const string = 'fus roh dah'

const upperCasedDashedExclamation = pipe(
upperCase,
dash,
exclamation
)
const upperCasedDashedExclamation = pipe(upperCase, dash, exclamation)
const result = upperCasedDashedExclamation(string)
expect(result).toBe('F-U-S R-O-H D-A-H!')
})
Expand All @@ -50,13 +48,11 @@ describe('pipe', () => {
}

const logger = {
log: jest.fn()
log: jest.fn(),
time: jest.fn(),
timeEnd: jest.fn()
}
const safeObservableLogger = pipe(
value => createLogger(value, logger),
createObservable,
createSafe
)
const safeObservableLogger = pipe(value => createLogger(value, logger), createObservable, createSafe)

const safeObservableLoggerObject = safeObservableLogger(person)
safeObservableLoggerObject.name
Expand All @@ -65,17 +61,14 @@ describe('pipe', () => {
})

test('aplica el safe correctamente', () => {
const person = {
const person: any = {
name: 'César',
company: {
name: 'Autentia'
}
}

const safeObservableLogger = pipe(
createObservable,
createSafe
)
const safeObservableLogger = pipe(createObservable, createSafe)
const safeObservableLoggerObject = safeObservableLogger(person)

expect(safeObservableLoggerObject.vehicles.tesla).toBe(notDefined)
Expand All @@ -91,10 +84,7 @@ describe('pipe', () => {
const stub = jest.fn(() => person.twitterFollowers)
observe(stub)

const safeObservable = pipe(
createSafe,
createObservable
)
const safeObservable = pipe(createSafe, createObservable)
const safeObservableObject = safeObservable(person)
safeObservableObject.twitterFollowers *= 10
await flushPromises()
Expand Down
1 change: 0 additions & 1 deletion src/functional/pipe.js

This file was deleted.

7 changes: 7 additions & 0 deletions src/functional/pipe.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export const pipe = <T extends any[], R>(fn1: (...args: T) => R, ...fns: Array<(a: R) => R>) => {
const piped = fns.reduce(
(prevFn, nextFn) => (value: R) => nextFn(prevFn(value)),
value => value
)
return (...args: T) => piped(fn1(...args))
}
14 changes: 0 additions & 14 deletions src/observable/observable.js

This file was deleted.

14 changes: 14 additions & 0 deletions src/observable/observable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const observers = new Set<Function>()

export function observe(fn: Function) {
observers.add(fn)
}

export function createObservable<Observable extends object>(observable: Observable) {
return new Proxy(observable, {
set(target: Observable, p: string | number | symbol, value: any, receiver: any) {
observers.forEach(observer => observer())
return Reflect.set(target, p, value, receiver)
}
})
}
9 changes: 6 additions & 3 deletions src/observer/Observer.js → src/observer/Observer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { Subject } from './Subject'

export class Observer {
constructor(subject) {
this.subject = subject
value: number

constructor(private readonly subject: Subject) {
this.subject.addObserver(this)
this.value = 0
}
Expand All @@ -9,7 +12,7 @@ export class Observer {
return `Observer counter: ${this.value}`
}

notify(subject) {
notify(subject: Subject) {
this.value = subject.counter
}
}
9 changes: 7 additions & 2 deletions src/observer/Subject.js → src/observer/Subject.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import { Observer } from './Observer'

export class Subject {
private _counter: number
private readonly observers: Observer[]

constructor() {
this.observers = []
this._counter = 0
this.observers = []
}

set counter(value) {
Expand All @@ -19,7 +24,7 @@ export class Subject {
this.notifyObservers()
}

addObserver(observer) {
addObserver(observer: Observer) {
this.observers.push(observer)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { Observer } from '../Observer'
import { Subject } from '../Subject'

describe('Observer', () => {
let subject
let observer
let subject: Subject
let observer: Observer

beforeEach(() => {
subject = new Subject()
Expand Down
26 changes: 1 addition & 25 deletions src/pinchito/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,5 @@
<title>PinchitoJS</title>
</head>
<body></body>
<script type="module">
import { Component, mount, html } from './main.js'

class Counter extends Component {
constructor() {
super()
this.data.counter = 0
this.startCount()
}

startCount() {
setInterval(() => {
this.data.counter++
}, 1000)
}

render() {
return html`
<h1>Counter: ${this.data.counter}</h1>
`
}
}

mount(new Counter())
</script>
<script src="main.ts"></script>
</html>
20 changes: 0 additions & 20 deletions src/pinchito/main.js

This file was deleted.

23 changes: 23 additions & 0 deletions src/pinchito/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { Component, mount, html } from './pinchito'

class Counter extends Component {
constructor() {
super()
this.data.counter = 0
this.startCount()
}

startCount() {
setInterval(() => {
this.data.counter++
}, 1000)
}

render() {
return html`
<h1>Counter: ${this.data.counter}</h1>
`
}
}

mount(new Counter())
24 changes: 24 additions & 0 deletions src/pinchito/pinchito.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { tag as html } from '../taggedTemplate/taggedTemplate'
import { createObservable, observe } from '../observable/observable'

export abstract class Component {
data: { [key: string]: any }

protected constructor() {
const observable = createObservable(this)
observe(() => renderTree(this))
this.data = observable
}

abstract render(): string
}

function renderTree(component: Component) {
document.body.innerHTML = component.render()
}

export function mount(component: Component) {
renderTree(component)
}

export { html }
Loading