forked from sheetjs/sheetjs
		
	[ci skip] Fixed functions demos (#2025)
* Added test for CRLF newlines * Initialized firebase functions app * Updated gitignore * Implemented csv file conversion * CSV conversion * Modified README to include firebase * Added init-azure script to makefile * Updated Azure demo * Updated README
This commit is contained in:
		
							parent
							
								
									d0457b77c8
								
							
						
					
					
						commit
						0c7e809e9c
					
				| @ -26,9 +26,8 @@ module.exports = (context, req) => { | ||||
| 		if(!f) { | ||||
| 			context.res = { status: 400, body: "Must submit a file for processing!" }; | ||||
| 		} else { | ||||
| 			/* since the file is Base64-encoded, read the file and parse as "base64" */ | ||||
| 			const b64 = fs.readFileSync(f.path).toString(); | ||||
| 			const wb = XLSX.read(b64, {type:"base64"}); | ||||
| 			/* file is stored in a temp directory, so we can point to that and read it */ | ||||
| 			const wb = XLSX.read(f.path, {type:"file"}); | ||||
| 
 | ||||
| 			/* convert to specified output type -- default CSV */ | ||||
| 			const ext = (fields.bookType || "csv").toLowerCase(); | ||||
|  | ||||
							
								
								
									
										65
									
								
								demos/function/Firebase/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										65
									
								
								demos/function/Firebase/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,65 @@ | ||||
| # Logs | ||||
| logs | ||||
| *.log | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| firebase-debug.log* | ||||
| 
 | ||||
| # Firebase cache | ||||
| .firebase/ | ||||
| 
 | ||||
| # Firebase config | ||||
| 
 | ||||
| # Uncomment this if you'd like others to create their own Firebase project. | ||||
| # For a team working on the same Firebase project(s), it is recommended to leave | ||||
| # it commented so all members can deploy to the same project(s) in .firebaserc. | ||||
| .firebaserc | ||||
| 
 | ||||
| # Runtime data | ||||
| pids | ||||
| *.pid | ||||
| *.seed | ||||
| *.pid.lock | ||||
| 
 | ||||
| # Directory for instrumented libs generated by jscoverage/JSCover | ||||
| lib-cov | ||||
| 
 | ||||
| # Coverage directory used by tools like istanbul | ||||
| coverage | ||||
| 
 | ||||
| # nyc test coverage | ||||
| .nyc_output | ||||
| 
 | ||||
| # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) | ||||
| .grunt | ||||
| 
 | ||||
| # Bower dependency directory (https://bower.io/) | ||||
| bower_components | ||||
| 
 | ||||
| # node-waf configuration | ||||
| .lock-wscript | ||||
| 
 | ||||
| # Compiled binary addons (http://nodejs.org/api/addons.html) | ||||
| build/Release | ||||
| 
 | ||||
| # Dependency directories | ||||
| node_modules/ | ||||
| 
 | ||||
| # Optional npm cache directory | ||||
| .npm | ||||
| 
 | ||||
| # Optional eslint cache | ||||
| .eslintcache | ||||
| 
 | ||||
| # Optional REPL history | ||||
| .node_repl_history | ||||
| 
 | ||||
| # Output of 'npm pack' | ||||
| *.tgz | ||||
| 
 | ||||
| # Yarn Integrity file | ||||
| .yarn-integrity | ||||
| 
 | ||||
| # dotenv environment variables file | ||||
| .env | ||||
							
								
								
									
										1
									
								
								demos/function/Firebase/firebase.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/function/Firebase/firebase.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| {} | ||||
							
								
								
									
										1
									
								
								demos/function/Firebase/functions/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/function/Firebase/functions/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| node_modules/ | ||||
							
								
								
									
										39
									
								
								demos/function/Firebase/functions/index.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										39
									
								
								demos/function/Firebase/functions/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| const functions = require('firebase-functions'); | ||||
| const Busboy = require('busboy'); | ||||
| const XLSX = require('xlsx'); | ||||
| 
 | ||||
| // // Create and Deploy Your First Cloud Functions
 | ||||
| // // https://firebase.google.com/docs/functions/write-firebase-functions
 | ||||
| //
 | ||||
| exports.helloWorld = functions.https.onRequest((request, response) => { | ||||
|  response.send("Hello from Firebase!"); | ||||
| }); | ||||
| 
 | ||||
| exports.main = functions.https.onRequest((req, res) => { | ||||
|   var bb = new Busboy({ | ||||
|     headers: { | ||||
|       'content-type': req.headers['content-type'] | ||||
|     } | ||||
|   }); | ||||
|   let fields = {}; | ||||
|   let files = {}; | ||||
|   bb.on('field', (fieldname, val) => { | ||||
|     fields[fieldname] = val; | ||||
|   }); | ||||
|   bb.on('file', (fieldname, file, filename) => { | ||||
|     var buffers = []; | ||||
|     file.on('data', (data) => { | ||||
|       buffers.push(data); | ||||
|     }); | ||||
|     file.on('end', () => { | ||||
|       files[fieldname] = [Buffer.concat(buffers), filename]; | ||||
|     }); | ||||
|   }); | ||||
|   bb.on('finish', () => { | ||||
|     let f = files[Object.keys(files)[0]]; | ||||
|     const wb = XLSX.read(f[0], { type: "buffer" }); | ||||
|     // Convert to CSV
 | ||||
|     res.send(XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]])); | ||||
|   }); | ||||
|   bb.end(req.body) | ||||
| }); | ||||
							
								
								
									
										24
									
								
								demos/function/Firebase/functions/package.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										24
									
								
								demos/function/Firebase/functions/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| { | ||||
|   "name": "functions", | ||||
|   "description": "Cloud Functions for Firebase", | ||||
|   "scripts": { | ||||
|     "serve": "firebase emulators:start --only functions", | ||||
|     "shell": "firebase functions:shell", | ||||
|     "start": "npm run shell", | ||||
|     "deploy": "firebase deploy --only functions", | ||||
|     "logs": "firebase functions:log" | ||||
|   }, | ||||
|   "engines": { | ||||
|     "node": "8" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "busboy": "^0.3.1", | ||||
|     "firebase-admin": "^8.6.0", | ||||
|     "firebase-functions": "^3.3.0", | ||||
|     "xlsx": "^0.16.2" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "firebase-functions-test": "^0.1.6" | ||||
|   }, | ||||
|   "private": true | ||||
| } | ||||
| @ -9,8 +9,12 @@ aws: lambda-proxy | ||||
| lambda-proxy: | ||||
| 	cd LambdaProxy; mkdir -p node_modules; npm install xlsx busboy; sam local start-api; cd - | ||||
| 
 | ||||
| .PHONY: init-azure | ||||
| init-azure: | ||||
| 	cd AzureHTTPTrigger; mkdir -p node_modules; npm install xlsx formidable fs | ||||
| 
 | ||||
| .PHONY: azure | ||||
| azure: | ||||
| azure: init-azure | ||||
| 	func start | ||||
| 
 | ||||
| .PHONY: azure-server | ||||
|  | ||||
| @ -121,3 +121,14 @@ HTTP trigger that converts the submitted file to CSV. | ||||
| 
 | ||||
| When deploying on Azure, be sure to install the module from the remote console, | ||||
| as described in the "Azure Functions JavaScript developer guide". | ||||
| 
 | ||||
| #### Firebase Functions | ||||
| 
 | ||||
| Firebase functions can be triggered via HTTP requests, similar to a REST API. | ||||
| In the `Firebase` directory, the example function reads files sent through | ||||
| HTTP and converts it to a CSV and sends the response in the form of a string. | ||||
| 
 | ||||
| To run this demo locally, run `npm i -g firebase-tools` to install the | ||||
| Firebase CLI and `npm i` to install the dependencies, then `firebase use --add` | ||||
| to connect to an existing Firebase project. Run `firebase emulators:start` to | ||||
| start the local server. | ||||
|  | ||||
| @ -1 +1,3 @@ | ||||
| { } | ||||
| { | ||||
|   "version": "2.0" | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user