Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
table-builder
Advanced tools
Create HTML tables from a JSON in a both Node.js (0.10+) and browsers enviroments.
yarn add --production table-builder
or
npm i --production table-builder
--production
flag skips devDependencies of the table-builder (testing framework).
import TableBuilder from 'table-builder'
Copy built UMD module:
cp node_modules/table-builder/tablebuilder.js dist/tablebuilder.js
Insert tag:
<script src="/dist/tablebuilder.js"></script>
Each object represents one row in the data array.
[
{ "name":"Larry Wall", "age":57, "link": "<a href='http://www.wall.org/~larry/'>www.wall.org/~larry/</a>" },
{ "name":"Bill Gates", "age":56, "link": "<a href='http://www.microsoft.com'>www.microsoft.com</a>" },
{ "name":"Daffy Duck", "age":75, "link": "" }
]
var data = [/* see data section above */];
// You can put key-value pairs if you strongly want keep headers order:
// [['name', 'User name'], ['age', 'User age'], ['link', 'Homepage']]
var headers = { "name" : "User name", "age": "User age", "link": "Homepage" };
var Table = require('table-builder');
console.log(
(new Table({'class': 'some-table'}))
.setHeaders(headers) // see above json headers section
.setData(data) // see above json data section
.render()
);
Rendered to:
<table class='some-table'>
<thead> <tr> <th>User name</th> <th>User age</th> <th>Homepage</th> </tr> </thead>
<tbody>
<tr>
<td class="name-td">Larry Wall</td>
<td class="age-td">57</td>
<td class="link-td"><a href="http://www.wall.org/~larry/">www.wall.org/~larry/</a></td>
</tr>
<tr>
<td class="name-td">Bill Gates</td>
<td class="age-td">56</td>
<td class="link-td"><a href="http://www.microsoft.com">www.microsoft.com</a></td>
</tr>
<tr>
<td class="name-td">Daffy Duck</td>
<td class="age-td">75</td>
<td class="link-td"></td>
</tr>
</tbody>
</table>
const process = require('process')
const TableBuilder = require('table-builder')
const table = new TableBuilder({class: 'avito'})
const headers = {price: 'Price', title: 'Title'}
const thrw = require('throw')
const fetch = require('isomorphic-fetch')
const getHttp = (uri) => fetch(uri).then(r => r.status >= 400 ? thrw (r.status) : r.text())
const parseHtml = html => require('jsdom').jsdom(html)
const uri = process.argv[2] || 'https://www.avito.ru/moskva/telefony/iphone?q=iphone+se'
const retreiveData = (document) => Array.from(document.querySelectorAll('.js-catalog_after-ads .item')).map(i=>({title:i.querySelector('.title'), price:i.querySelector('.about')})).map(({title,price})=>({title:title.textContent.trim(),price:price.textContent.trim()}))
const main = () =>
getHttp(uri)
.then(html => parseHtml(html))
.then(document => retreiveData(document))
.then(data => table.setHeaders(headers).setData(data).render())
const style = `<style>body { text-align: center; } .avito {width: 100%;} thead { text-align: left; } .price-td { text-align: right; }</style>`
main().then(r=>console.log(style, r))
Prism are callbacks-preprocessors for specified fields.
var data = [ // Look the previous case differences: link format changed and name splitted into firstname and surname
{ "firstname":"Larry", "surname":"Wall", "age":57, "link": "www.wall.org/~larry/" },
{ "firstname":"Bill", "surname":"Gates", "age":56, "link": "www.microsoft.com" },
{ "firstname":"Daffy", "surname":"Duck", "age":75, "link": "" }
];
(new Table({'class': 'some-table'}))
.setPrism('link', function (cellData) {
return cellData && '<a href="http://'+cellData+'">'+cellData+'</a>' || 'N/A';
})
.setPrism('name', function (cellData, row) {
return row.surname + ' ' + row.firstname;
})
.setHeaders({ "name": "User name", "age": "User age", "link": "Homepage" })
.setData(data)
.render()
Render output is equal the previous case.
Also, prism callback may return {presentation: '...', raw: '...'}
object
for splitting html wrapped cell values and raw values.
For example, raw values uses in totals.
See following code:
table.setTotal('age', function (columnCellsCollection, rowsCollection) {
// Calc average age
return Math.round(
columnCellsCollection
.reduce(function (prev, val) { return +prev + val; })
/ columnCellsCollection.length
);
});
It adds tfoot
in the table with average age:
<tfoot><tr><td></td><td></td><td>62</td></tr></tfoot>
Grouping fields util (setGroup
).
// ...
table
.setGroup('product_category', function (value, recordsCount, totals) {
// ...
})
// ...
.render();
Group removes the field (product_category
) from the table
and adds row-separators with the field's values (group names). and referenced items.
Body of the setGroup callback may contains processor of group name.
Additionaly processor may use the group's recordsCount
and totals
collection for group
if setTotal
for whole table have installed.
If callback is not defined then tableBuilder uses group name without processing, as is.
// Show table replacer block if data set is empty
// ...
table
// ...
.render()
|| 'Data collection is empty!';
You can use list.js with table builder.
tagBuilder
as a dependency injection (for compatibility with either: innerHTML
, createElement
, React.Component
)setPrisms
, setTotals
React based:
Framework agnostic:
FAQs
Create HTML-tables from JSON
The npm package table-builder receives a total of 901 weekly downloads. As such, table-builder popularity was classified as not popular.
We found that table-builder demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.