| 
									
										
										
										
											2024-06-09 03:40:45 +00:00
										 |  |  | #!/bin/bash
 | 
					
						
							|  |  |  | # https://docs.sheetjs.com/docs/demos/frontend/bundler/parcel | 
					
						
							|  |  |  | cd /tmp | 
					
						
							|  |  |  | rm -rf sheetjs-parceljs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | mkdir sheetjs-parceljs | 
					
						
							|  |  |  | cd sheetjs-parceljs | 
					
						
							|  |  |  | npm init -y | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-18 22:19:02 +00:00
										 |  |  | npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz | 
					
						
							| 
									
										
										
										
											2024-06-09 03:40:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | cat >index.html <<EOF | 
					
						
							|  |  |  | <body> | 
					
						
							|  |  |  | <h3>SheetJS <span id="vers"></span> export demo</h3> | 
					
						
							|  |  |  | <button id="xport">Click to Export!</button> | 
					
						
							|  |  |  | <script src="index.js" type="module"></script> | 
					
						
							|  |  |  | <body> | 
					
						
							|  |  |  | EOF | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | cat >index.js <<EOF | 
					
						
							|  |  |  | // ESM-style import from "xlsx" | 
					
						
							|  |  |  | import { utils, version, writeFileXLSX } from 'xlsx'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | document.getElementById("vers").innerText = version; | 
					
						
							|  |  |  | document.getElementById("xport").onclick = async() => { | 
					
						
							|  |  |  |   /* fetch JSON data and parse */ | 
					
						
							|  |  |  |   const url = "https://docs.sheetjs.com/executive.json"; | 
					
						
							|  |  |  |   const raw_data = await (await fetch(url)).json(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* filter for the Presidents */ | 
					
						
							|  |  |  |   const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* sort by first presidential term */ | 
					
						
							|  |  |  |   prez.forEach(row => row.start = row.terms.find(term => term.type === "prez").start); | 
					
						
							|  |  |  |   prez.sort((l,r) => l.start.localeCompare(r.start)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* flatten objects */ | 
					
						
							|  |  |  |   const rows = prez.map(row => ({ | 
					
						
							|  |  |  |     name: row.name.first + " " + row.name.last, | 
					
						
							|  |  |  |     birthday: row.bio.birthday | 
					
						
							|  |  |  |   })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* generate worksheet and workbook */ | 
					
						
							|  |  |  |   const worksheet = utils.json_to_sheet(rows); | 
					
						
							|  |  |  |   const workbook = utils.book_new(); | 
					
						
							|  |  |  |   utils.book_append_sheet(workbook, worksheet, "Dates"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* fix headers */ | 
					
						
							|  |  |  |   utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* calculate column width */ | 
					
						
							|  |  |  |   const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); | 
					
						
							|  |  |  |   worksheet["!cols"] = [ { wch: max_width } ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* create an XLSX file and try to save to Presidents.xlsx */ | 
					
						
							|  |  |  |   writeFileXLSX(workbook, "Presidents.xlsx"); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | EOF | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | cat >test.js <<EOF | 
					
						
							|  |  |  | const puppeteer = require('puppeteer'); | 
					
						
							|  |  |  | const express = require('express'); | 
					
						
							|  |  |  | const app = express(); | 
					
						
							|  |  |  | app.use(express.static('./dist')); | 
					
						
							|  |  |  | app.listen(7262, async() => { | 
					
						
							|  |  |  |   await new Promise((res,rej) => setTimeout(res, 1000)); | 
					
						
							|  |  |  |   const browser = await puppeteer.launch(); | 
					
						
							|  |  |  |   const page = await browser.newPage(); | 
					
						
							|  |  |  |   page.on("console", msg => console.log("PAGE LOG:", msg.text())); | 
					
						
							|  |  |  |   await page.setViewport({width: 1920, height: 1080}); | 
					
						
							|  |  |  |   const client = await page.target().createCDPSession(); | 
					
						
							|  |  |  |   await client.send('Browser.setDownloadBehavior', { | 
					
						
							|  |  |  |     behavior: 'allow', | 
					
						
							|  |  |  |     downloadPath: require("path").resolve('./') | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   page.on('request', req => console.log(req.url())); | 
					
						
							|  |  |  |   await page.goto('http://localhost:7262/'); | 
					
						
							|  |  |  |   await new Promise((res,rej) => setTimeout(res, 1000)); | 
					
						
							|  |  |  |   await page.click("#xport"); | 
					
						
							|  |  |  |   await new Promise((res,rej) => setTimeout(res, 1000)); | 
					
						
							|  |  |  |   await browser.close(); | 
					
						
							|  |  |  |   process.exit(); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | EOF | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | node -e 'var pjson = JSON.parse(fs.readFileSync("./package.json")); console.log(pjson); delete pjson.main; fs.writeFileSync("package.json", JSON.stringify(pjson))' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | for n in 1.12.4 2.12.0; do | 
					
						
							|  |  |  |   npx -y parcel build index.html | 
					
						
							|  |  |  |   node test.js | 
					
						
							|  |  |  |   npx -y xlsx-cli Presidents.xlsx | head -n 3 | 
					
						
							|  |  |  |   rm -f Presidents.xlsx | 
					
						
							|  |  |  | done |