Make tests work again. New utility structure

This commit is contained in:
Christian Kaisermann 2018-08-08 02:17:09 -03:00
parent 255547914b
commit 1e8597150c
5 changed files with 1006 additions and 128 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
node_modules node_modules
*.log *.log
dist/ dist/
coverage/

1006
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -17,7 +17,34 @@
"format": "prettier --loglevel silent --write \"*.js\" \"src/**/*.js\" && eslint --fix \"*.js\" \"src/**/*.js\"", "format": "prettier --loglevel silent --write \"*.js\" \"src/**/*.js\" && eslint --fix \"*.js\" \"src/**/*.js\"",
"prepublishOnly": "npm run format && npm run test" "prepublishOnly": "npm run format && npm run test"
}, },
"jest": {
"verbose": true,
"testURL": "http://localhost/",
"transform": {
"^.+\\.jsx?$": "babel-jest"
},
"testRegex": "(/test/.*|\\.(test|spec))\\.js$",
"moduleFileExtensions": [
"js"
],
"coveragePathIgnorePatterns": [
"/node_modules/",
"/test/"
],
"coverageThreshold": {
"global": {
"branches": 90,
"functions": 95,
"lines": 95,
"statements": 95
}
},
"collectCoverage": true
},
"devDependencies": { "devDependencies": {
"@babel/core": "^7.0.0-beta.56",
"babel-core": "^7.0.0-bridge.0",
"babel-jest": "^23.4.2",
"eslint": "^4.19.1", "eslint": "^4.19.1",
"eslint-config-prettier": "^2.9.0", "eslint-config-prettier": "^2.9.0",
"eslint-config-standard": "^11.0.0", "eslint-config-standard": "^11.0.0",
@ -28,9 +55,14 @@
"eslint-plugin-standard": "^3.1.0", "eslint-plugin-standard": "^3.1.0",
"jest": "^22.4.3", "jest": "^22.4.3",
"microbundle": "^0.4.4", "microbundle": "^0.4.4",
"prettier": "^1.12.1" "prettier": "^1.12.1",
"svelte": "^2.9.10"
},
"peerDependencies": {
"svelte": "^2.9.10"
}, },
"dependencies": { "dependencies": {
"@babel/preset-env": "^7.0.0-beta.56",
"deepmerge": "^2.1.1", "deepmerge": "^2.1.1",
"object-resolve-path": "^1.1.1" "object-resolve-path": "^1.1.1"
} }

View File

@ -1,56 +1,65 @@
import deepmerge from 'deepmerge'
import resolvePath from 'object-resolve-path'
import { capital, title, upper, lower } from './utils'
import Formatter from './formatter' import Formatter from './formatter'
const resolvePath = a => a
export function i18n(store, localesList) { export function i18n(store, localesList) {
const formatter = new Formatter() const formatter = new Formatter()
const locales = deepmerge.all(localesList) const locales = {} // deepmerge.all(localesList)
let currentLocale: string let currentLocale
const plural = ( const getLocalizedMessage = (
path, path,
counter,
interpolations, interpolations,
locale = currentLocale locale = currentLocale,
transformers = undefined,
) => { ) => {
let message = resolvePath(locales[locale], path) let message = resolvePath(locales[locale], path)
if (!message) return path if (!message) return path
const choice = Math.min(Math.abs(counter), 2) if (transformers) {
message = message.split('|')[choice] for (let i = 0, len = transformers.length; i < len; i++) {
message = transformers[i](message)
}
}
if (!message) return path if (interpolations) {
message = formatter.interpolate(message, interpolations).join('')
message = formatter.interpolate(message, interpolations).join('') }
return message.trim() return message.trim()
} }
const changeLocale = (newLocale) => { const utilities = {
currentLocale = newLocale capital(...args) {
const _ = ( return capital(getLocalizedMessage(...args))
function(path, interpolations, locale = currentLocale) { },
let message = resolvePath(locales[locale], path) title(...args) {
return title(getLocalizedMessage(...args))
if (!message) return path },
upper(...args) {
message = formatter.interpolate(message, interpolations).join('') return upper(getLocalizedMessage(...args))
},
return message lower(...args) {
} return lower(getLocalizedMessage(...args))
) },
plural(path, counter, interpolations, locale) {
_.plural = plural return getLocalizedMessage(path, interpolations, locale, [
message => message.split('|')[Math.min(Math.abs(counter), 2)],
store.set({ locale: newLocale, _ }) ])
},
} }
store.setLocale = (locale) => store.fire('locale', locale) store.setLocale = locale => store.fire('locale', locale)
store.on('locale', changeLocale) store.on('locale', newLocale => {
currentLocale = newLocale
const _ = getLocalizedMessage
Object.assign(_, utilities)
store.set({ locale: newLocale, _ })
})
return store return store
} }
export { capital, title, upper, lower } from './utils'

View File

@ -1,4 +1,4 @@
import { i18n } from '../src/svelte-i18n' import { i18n } from '../src/index'
import { Store } from 'svelte/store.umd' import { Store } from 'svelte/store.umd'
import { capital, title, upper, lower, isObject } from '../src/utils' import { capital, title, upper, lower, isObject } from '../src/utils'
@ -16,7 +16,7 @@ const locales = {
wow: { wow: {
much: { much: {
deep: { deep: {
list: [, 'muito profundo'] list: ['Muito', 'muito profundo']
} }
} }
}, },
@ -137,27 +137,31 @@ describe('Localization utilities', () => {
store.setLocale('pt-br') store.setLocale('pt-br')
const { _ } = store.get() const { _ } = store.get()
expect(capital(_('phrase'))).toBe('Adoro banana') expect(capital('Adoro banana')).toBe('Adoro banana')
expect(_.capital('phrase')).toBe('Adoro banana')
}) })
it('should title a translated message', () => { it('should title a translated message', () => {
store.setLocale('pt-br') store.setLocale('pt-br')
const { _ } = store.get() const { _ } = store.get()
expect(title(_('phrase'))).toBe('Adoro Banana') expect(title('Adoro Banana')).toBe('Adoro Banana')
expect(_.title('phrase')).toBe('Adoro Banana')
}) })
it('should lowercase a translated message', () => { it('should lowercase a translated message', () => {
store.setLocale('pt-br') store.setLocale('pt-br')
const { _ } = store.get() const { _ } = store.get()
expect(lower(_('phrase'))).toBe('adoro banana') expect(lower('adoro banana')).toBe('adoro banana')
expect(_.lower('phrase')).toBe('adoro banana')
}) })
it('should uppercase a translated message', () => { it('should uppercase a translated message', () => {
store.setLocale('pt-br') store.setLocale('pt-br')
const { _ } = store.get() const { _ } = store.get()
expect(upper(_('phrase'))).toBe('ADORO BANANA') expect(upper('ADORO BANANA')).toBe('ADORO BANANA')
expect(_.upper('phrase')).toBe('ADORO BANANA')
}) })
}) })