Skip to content

Commit

Permalink
Merge 9b7f9dc into bb54bea
Browse files Browse the repository at this point in the history
  • Loading branch information
ndaidong committed Jan 4, 2022
2 parents bb54bea + 9b7f9dc commit 7f690a9
Show file tree
Hide file tree
Showing 9 changed files with 206 additions and 54 deletions.
25 changes: 12 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,29 +33,28 @@ Calculate average and scoring based on Wilson Score Equation

### Node.js:

Sync v14, ECMAScript modules [have became the official standard format](https://nodejs.org/docs/latest-v14.x/api/esm.html#esm_modules_ecmascript_modules).

Just [enable](https://nodejs.org/api/packages.html#determining-module-system) and enjoy with ES6 import/export syntax.


```js
import {
score,
rate,
average
} from 'average-rating'
```

For regular CommonJS environment, `require` can be used as below:
// with CommonJS environment
// const { score, rate, average } = require('feed-reader/dist/cjs/average-rating.js')

```js
const {
score,
rate,
average
} = require('average-rating/cjs/average-rating.js')
score(80, 20) // => 0.71
average([134055, 57472, 143135, 365957, 1448459]) // => 4.4
rate([134055, 57472, 143135, 365957, 1448459]) // => 0.84
```


##### Note:

> Since Node.js v14, ECMAScript modules [have became the official standard format](https://nodejs.org/docs/latest-v14.x/api/esm.html#esm_modules_ecmascript_modules).
> Just ensure that you are [using module system](https://nodejs.org/api/packages.html#determining-module-system) and enjoy with ES6 import/export syntax.

### Browsers:

Currently ECMAScript modules work fine on almost browsers:
Expand Down
21 changes: 6 additions & 15 deletions build.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,7 @@ execSync('rm -rf dist')
execSync('mkdir dist')

const buildTime = (new Date()).toISOString()
const longComment = [
'/**',
` * ${pkg.name}@${pkg.version}`,
` * built with esbuild at: ${buildTime}`,
` * repository: ${pkg.repository.url}`,
` * maintainer: ${pkg.author}`,
` * License: ${pkg.license}`,
'**/'
].join('\n')

const shortComment = [
const comment = [
`// ${pkg.name}@${pkg.version}, by ${pkg.author}`,
`built with esbuild at ${buildTime}`,
`published under ${pkg.license} license`
Expand All @@ -35,7 +25,7 @@ const baseOpt = {
bundle: true,
charset: 'utf8',
target: ['es2020', 'node14'],
minify: true,
minify: false,
write: true
}

Expand All @@ -46,7 +36,7 @@ const esmVersion = {
mainFields: ['module'],
outfile: 'dist/average-rating.esm.js',
banner: {
js: longComment
js: comment
}
}
buildSync(esmVersion)
Expand All @@ -58,7 +48,7 @@ const cjsVersion = {
mainFields: ['main'],
outfile: 'dist/cjs/average-rating.js',
banner: {
js: longComment
js: comment
}
}
buildSync(cjsVersion)
Expand All @@ -82,8 +72,9 @@ const iifeVersion = {
target: ['es2020'],
globalName: 'AverageRating',
outfile: 'dist/average-rating.min.js',
minify: true,
banner: {
js: shortComment
js: comment
}
}
buildSync(iifeVersion)
41 changes: 41 additions & 0 deletions build.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// release.test

/* eslint-env jest */

import {
existsSync,
readFileSync
} from 'fs'

const pkg = JSON.parse(readFileSync('./package.json'))

const esmFile = `${pkg.name}.esm.js`
const cjsFile = `cjs/${pkg.name}.js`
const minFile = `${pkg.name}.min.js`

const runtest = (fname) => {
const fpath = `./dist/${fname}`
describe(`Validate ${fname} version output`, () => {
test(`Check if ${fpath} file created`, () => {
expect(existsSync(fpath)).toBeTruthy()
})
const constent = readFileSync(fpath, 'utf8')
const lines = constent.split('\n')
test('Check if file meta contains package info', () => {
expect(lines[0].includes(`${pkg.name}@${pkg.version}`)).toBeTruthy()
expect(lines[0].includes(pkg.author)).toBeTruthy()
expect(lines[0].includes(pkg.license)).toBeTruthy()
})
})
return fpath
}

const arr = [
esmFile,
cjsFile,
minFile
]

arr.forEach((fname) => {
runtest(fname)
})
51 changes: 43 additions & 8 deletions dist/average-rating.esm.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,43 @@
/**
* average-rating@2.0.0
* built with esbuild at: 2022-01-03T14:48:10.361Z
* repository: https://github.com/ndaidong/average-rating
* maintainer: @ndaidong
* License: MIT
**/
var n=(t,e)=>{if(t===0&&e===0)return 0;let o=((t+1.9208)/(t+e)-1.96*Math.sqrt(t*e/(t+e)+.9604)/(t+e))/(1+3.8416/(t+e));return Number(o.toFixed(2))},x=t=>{let e=t.length,o=t[0],c=t[e-1],u=(1/(e-1)).toFixed(2),s=e-1;for(let r=1;r<s;r++){let l=(u*r).toFixed(2);c+=t[r]*l,o+=t[s-r]*l}return n(c,o)},d=t=>{let e=t.reduce((s,r)=>s+r,0);if(e===0)return 0;let o=0,c=1;t.forEach(s=>{o+=s*c,c++});let u=o/e;return Number(u.toFixed(1))};export{d as average,x as rate,n as score};
// average-rating@2.0.1, by @ndaidong - built with esbuild at 2022-01-04T03:58:54.537Z - published under MIT license
// src/main.js
var score = (p, n) => {
if (p === 0 && n === 0) {
return 0;
}
const r = ((p + 1.9208) / (p + n) - 1.96 * Math.sqrt(p * n / (p + n) + 0.9604) / (p + n)) / (1 + 3.8416 / (p + n));
return Number(r.toFixed(2));
};
var rate = (rating) => {
const size = rating.length;
let n = rating[0];
let p = rating[size - 1];
const step = (1 / (size - 1)).toFixed(2);
const totalStep = size - 1;
for (let i = 1; i < totalStep; i++) {
const ep = (step * i).toFixed(2);
p += rating[i] * ep;
n += rating[totalStep - i] * ep;
}
return score(p, n);
};
var average = (rating) => {
const total = rating.reduce((prev, current) => {
return prev + current;
}, 0);
if (total === 0) {
return 0;
}
let sum = 0;
let k = 1;
rating.forEach((item) => {
sum += item * k;
k++;
});
const r = sum / total;
return Number(r.toFixed(1));
};
export {
average,
rate,
score
};
2 changes: 1 addition & 1 deletion dist/average-rating.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

82 changes: 74 additions & 8 deletions dist/cjs/average-rating.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,74 @@
/**
* average-rating@2.0.0
* built with esbuild at: 2022-01-03T14:48:10.361Z
* repository: https://github.com/ndaidong/average-rating
* maintainer: @ndaidong
* License: MIT
**/
var l=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var h=t=>l(t,"__esModule",{value:!0});var i=(t,e)=>{for(var o in e)l(t,o,{get:e[o],enumerable:!0})},m=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of f(e))!F.call(t,r)&&(o||r!=="default")&&l(t,r,{get:()=>e[r],enumerable:!(s=d(e,r))||s.enumerable});return t};var a=(t=>(e,o)=>t&&t.get(e)||(o=m(h({}),e,1),t&&t.set(e,o),o))(typeof WeakMap!="undefined"?new WeakMap:0);var k={};i(k,{average:()=>N,rate:()=>b,score:()=>x});var x=(t,e)=>{if(t===0&&e===0)return 0;let o=((t+1.9208)/(t+e)-1.96*Math.sqrt(t*e/(t+e)+.9604)/(t+e))/(1+3.8416/(t+e));return Number(o.toFixed(2))},b=t=>{let e=t.length,o=t[0],s=t[e-1],r=(1/(e-1)).toFixed(2),u=e-1;for(let c=1;c<u;c++){let n=(r*c).toFixed(2);s+=t[c]*n,o+=t[u-c]*n}return x(s,o)},N=t=>{let e=t.reduce((u,c)=>u+c,0);if(e===0)return 0;let o=0,s=1;t.forEach(u=>{o+=u*s,s++});let r=o/e;return Number(r.toFixed(1))};module.exports=a(k);0&&(module.exports={average,rate,score});
// average-rating@2.0.1, by @ndaidong - built with esbuild at 2022-01-04T03:58:54.537Z - published under MIT license
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, copyDefault, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default"))
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toCommonJS = /* @__PURE__ */ ((cache) => {
return (module2, temp) => {
return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
};
})(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);

// src/main.js
var main_exports = {};
__export(main_exports, {
average: () => average,
rate: () => rate,
score: () => score
});
var score = (p, n) => {
if (p === 0 && n === 0) {
return 0;
}
const r = ((p + 1.9208) / (p + n) - 1.96 * Math.sqrt(p * n / (p + n) + 0.9604) / (p + n)) / (1 + 3.8416 / (p + n));
return Number(r.toFixed(2));
};
var rate = (rating) => {
const size = rating.length;
let n = rating[0];
let p = rating[size - 1];
const step = (1 / (size - 1)).toFixed(2);
const totalStep = size - 1;
for (let i = 1; i < totalStep; i++) {
const ep = (step * i).toFixed(2);
p += rating[i] * ep;
n += rating[totalStep - i] * ep;
}
return score(p, n);
};
var average = (rating) => {
const total = rating.reduce((prev, current) => {
return prev + current;
}, 0);
if (total === 0) {
return 0;
}
let sum = 0;
let k = 1;
rating.forEach((item) => {
sum += item * k;
k++;
});
const r = sum / total;
return Number(r.toFixed(1));
};
module.exports = __toCommonJS(main_exports);
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
average,
rate,
score
});
2 changes: 1 addition & 1 deletion dist/cjs/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "average-rating-cjs",
"version": "2.0.0",
"version": "2.0.1",
"main": "./average-rating.js"
}
14 changes: 14 additions & 0 deletions eval.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// eval.js

import {
score,
rate,
average
} from './src/main.js'

const scoring = [80, 20]
const rating = [134055, 57472, 143135, 365957, 1448459]

console.log(`score(${scoring.join(', ')}) // => ${score(...scoring)}`)
console.log(`average([${rating.join(', ')}]) // => ${average(rating)}`)
console.log(`rate([${rating.join(', ')}]) // => ${rate(rating)}`)
22 changes: 14 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "2.0.0",
"version": "2.0.1",
"name": "average-rating",
"description": "Calculate average score and rating based on Wilson Score Equation",
"homepage": "https://www.npmjs.com/package/average-rating",
Expand All @@ -16,12 +16,18 @@
"node": ">= 14"
},
"scripts": {
"lint": "standard ./src",
"pretest": "npm run lint && npm run build",
"lint": "standard .",
"pretest": "npm run lint",
"test": "NODE_ENV=test jest --verbose --coverage=true --unhandled-rejections=strict --detectOpenHandles",
"build": "node build.js src/main.js",
"build": "node build src/main.js",
"eval": "node eval",
"reset": "node reset"
},
"devDependencies": {
"@babel/plugin-transform-modules-commonjs": "^7.16.7",
"esbuild": "^0.14.10",
"jest": "^27.3.1"
},
"babel": {
"env": {
"test": {
Expand All @@ -31,10 +37,10 @@
}
}
},
"devDependencies": {
"@babel/plugin-transform-modules-commonjs": "^7.16.7",
"esbuild": "^0.14.10",
"jest": "^27.3.1"
"standard": {
"ignore": [
"/dist"
]
},
"keywords": [
"rating",
Expand Down

0 comments on commit 7f690a9

Please sign in to comment.