bundle-wizard
Version:
Analyze the JavaScript loaded by a website
116 lines (95 loc) • 3.15 kB
JavaScript
const fs = require('fs-extra')
const path = require('path')
const sourceMap = require('source-map')
const getFileName = url => (url ? url.split(/\//g).slice(-1)[0] : '')
const longTasksWithStackTraces = longTasks
.map(t => {
const children = []
const processChildren = async c => {
if (c.event && c.event.args.beginData) {
children.push(c)
}
if (c.children) c.children.forEach(processChildren)
}
t.children.forEach(processChildren)
return { ...t, children }
})
.filter(t => t.children.length)
const tasksWithTraces = await Promise.all(
longTasksWithStackTraces.map(async task => {
return await Promise.all(
task.children.map(async child => {
const trace = child.event.args.beginData.stackTrace[0]
try {
const map = fs.readFileSync(
path.join(
__dirname,
'..',
'..',
'temp/downloads',
`${getFileName(trace.url)}.map`
),
'utf8'
)
const consumer = await new sourceMap.SourceMapConsumer(
JSON.parse(map)
)
const data = consumer.originalPositionFor({
line: trace.lineNumber,
column: trace.columNumber
})
return {
trace: child.event.args.beginData.stackTrace,
selfTime: child.selfTime,
duration: child.duration,
data
}
} catch (e) {}
})
)
})
)
// const beginData = tasks
// .filter(t => t.event.args.beginData && t.event.args.beginData.stackTrace)
// .map(t => [t.duration, t.event.args.beginData.stackTrace[0]])
// const stacks = tasks
// .filter(t => t.event.args.data && t.event.args.data.columnNumber)
// .map(t => [t.duration, t.event.args.data])
// .concat(beginData)
// .sort((a, b) => b[0] - a[0])
// const urls = [...new Set(stacks.map(s => s[1].url))]
// const results = []
// const promises = urls.map(async url => {
// try {
// const map = fs.readFileSync(
// path.join(
// __dirname,
// '..',
// '..',
// 'temp/downloads',
// `${getFileName(url)}.map`
// ),
// 'utf8'
// )
// const consumer = await new sourceMap.SourceMapConsumer(JSON.parse(map))
// consumer.computeColumnSpans()
// const tracesWithUrl = stacks.filter(([duration, data]) => {
// return data.url === url
// })
// tracesWithUrl.forEach(trace => {
// const og = consumer.originalPositionFor({
// line: trace[1].lineNumber,
// column: trace[1].columnNumber
// })
// if (og && og.source !== null) results.push([trace[0], og])
// })
// consumer.destroy()
// } catch (e) {}
// })
// await Promise.all(promises)
// const collated = results.reduce((acc, curr) => {
// if (!acc[curr[1].source]) acc[curr[1].source] = curr[0]
// acc[curr[1].source] += curr[0]
// return acc
// }, {})
// fs.writeFileSync(`${__dirname}/test.json`, JSON.stringify(collated))