├── .gitignore ├── functions ├── createBlogPostCover.js ├── lqCover.js ├── recentYTVideos.js └── utils │ ├── BlogUtils.js │ ├── StreamUtils.js │ ├── cloudinary.js │ └── sanity.js ├── netlify.toml ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Local Netlify folder 2 | .netlify 3 | 4 | node_modules 5 | .env 6 | -------------------------------------------------------------------------------- /functions/createBlogPostCover.js: -------------------------------------------------------------------------------- 1 | const { generateBlogPostCover } = require('./utils/BlogUtils'); 2 | const simpleReturn = require('netlify-functions-simple-return'); 3 | const fetch = require('node-fetch'); 4 | const { client: sanityClient } = require('./utils/sanity'); 5 | exports.handler = async (event) => { 6 | const headers = { 7 | 'access-control-allow-origin': '*', 8 | 'access-control-allow-headers': '*', 9 | 'access-control-allow-methods': 'GET, POST, PUT, DELETE', 10 | }; 11 | 12 | const { title, id } = JSON.parse(event.body); 13 | 14 | if (!title || !id) { 15 | return { 16 | statusCode: 500, 17 | headers, 18 | body: JSON.stringify({ msg: 'Invalid parameters' }), 19 | }; 20 | } 21 | 22 | try { 23 | const url = generateBlogPostCover(title); 24 | console.log(url); 25 | const res = await fetch(url); 26 | 27 | const imageAsset = await sanityClient.assets.upload('image', res.body, { 28 | filename: title, 29 | }); 30 | 31 | const updatedRecord = await sanityClient 32 | .patch(id) 33 | .set({ 34 | coverImage: { 35 | _type: 'image', 36 | asset: { 37 | _type: 'reference', 38 | _ref: imageAsset._id, 39 | }, 40 | }, 41 | }) 42 | .commit(); 43 | 44 | return { statusCode: 200, body: JSON.stringify({ url }), headers }; 45 | } catch (error) { 46 | console.error(error); 47 | return { 48 | statusCode: 500, 49 | body: JSON.stringify({ msg: 'Something went wrong' }), 50 | }; 51 | } 52 | }; 53 | -------------------------------------------------------------------------------- /functions/lqCover.js: -------------------------------------------------------------------------------- 1 | const { generateLearningQuickCoverURL } = require('./utils/StreamUtils'); 2 | const simpleReturn = require('netlify-functions-simple-return'); 3 | const fetch = require('node-fetch'); 4 | const { client: sanityClient } = require('./utils/sanity'); 5 | exports.handler = async (event) => { 6 | const headers = { 7 | 'access-control-allow-origin': '*', 8 | 'access-control-allow-headers': '*', 9 | 'access-control-allow-methods': 'GET, POST, PUT, DELETE', 10 | }; 11 | 12 | if (event.httpMethod !== 'POST') { 13 | // To enable CORS 14 | console.log('preflight'); 15 | return { 16 | statusCode: 200, // <-- Important! 17 | headers, 18 | body: 'This was not a POST request!', 19 | }; 20 | } 21 | const body = JSON.parse(event.body); 22 | const { title, guestName, guestTitle, guestImage, time, id } = body; 23 | 24 | try { 25 | const url = generateLearningQuickCoverURL( 26 | title, 27 | guestName, 28 | guestTitle, 29 | guestImage, 30 | time, 31 | id 32 | ); 33 | const res = await fetch(url); 34 | 35 | const imageAsset = await sanityClient.assets.upload('image', res.body, { 36 | filename: title, 37 | }); 38 | 39 | const updatedRecord = await sanityClient 40 | .patch(id) 41 | .set({ 42 | coverImage: { 43 | _type: 'image', 44 | asset: { 45 | _type: 'reference', 46 | _ref: imageAsset._id, 47 | }, 48 | }, 49 | }) 50 | .commit(); 51 | 52 | return { statusCode: 200, body: JSON.stringify({ url }), headers }; 53 | } catch (err) { 54 | console.error(err); 55 | return { 56 | statusCode: 500, 57 | body: JSON.stringify({ msg: 'Something went wrong' }), 58 | }; 59 | } 60 | }; 61 | -------------------------------------------------------------------------------- /functions/recentYTVideos.js: -------------------------------------------------------------------------------- 1 | const fetch = require('node-fetch'); 2 | exports.handler = async (event) => { 3 | const count = Math.min(event.queryStringParameters.count || 10, 20); 4 | 5 | try { 6 | const url = `https://www.googleapis.com/youtube/v3/search?key=${process.env.GOOGLE_API_KEY}&channelId=${process.env.YOUTUBE_CHANNEL_ID}&part=snippet,id&order=date&maxResults=${count}`; 7 | const res = await fetch(url); 8 | const data = await res.json(); 9 | const minifiedData = data.items.map((item) => ({ 10 | ...item.snippet, 11 | videoId: item.id.videoId, 12 | })); 13 | return { 14 | statusCode: 200, 15 | headers: { 16 | 'Access-Control-Allow-Origin': '*', 17 | 'Content-Type': 'application/json', 18 | }, 19 | body: JSON.stringify(minifiedData), 20 | }; 21 | } catch (err) { 22 | console.error(err); 23 | return { 24 | statusCode: 500, 25 | body: JSON.stringify({ msg: 'Something went wrong' }), 26 | }; 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /functions/utils/BlogUtils.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | const { cloudinary } = require('./cloudinary'); 3 | const generateBlogPostCover = (title) => { 4 | const url = cloudinary.url('learning_quick/blog_cover', { 5 | transformation: [ 6 | { 7 | overlay: { 8 | font_family: 'Poppins', 9 | font_size: 100, 10 | font_weight: 'bold', 11 | text: title, 12 | }, 13 | color: '#333', 14 | effect: 'colorize', 15 | y: '0', 16 | width: '1000', 17 | }, 18 | { 19 | overlay: { 20 | font_family: 'Poppins', 21 | font_size: 42, 22 | text: '@jamesqquick', 23 | }, 24 | color: '#555', 25 | effect: 'colorize', 26 | y: '300', 27 | x: '400', 28 | }, 29 | ], 30 | }); 31 | return url; 32 | }; 33 | 34 | module.exports = { generateBlogPostCover }; 35 | -------------------------------------------------------------------------------- /functions/utils/StreamUtils.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | const { cloudinary } = require('./cloudinary'); 3 | const generateLearningQuickCoverURL = ( 4 | title, 5 | guestName, 6 | guestTitle, 7 | guestImage, 8 | time 9 | ) => { 10 | const url = cloudinary.url('learning_quick/lq-bg', { 11 | transformation: [ 12 | { 13 | overlay: { 14 | font_family: 'Poppins', 15 | font_size: 100, 16 | font_weight: 'bold', 17 | text: title, 18 | }, 19 | color: '#ffffff', 20 | effect: 'colorize', 21 | y: '-150', 22 | }, 23 | { 24 | overlay: { 25 | font_family: 'Poppins', 26 | font_size: 70, 27 | text: guestName, 28 | }, 29 | color: '#ffffff', 30 | effect: 'colorize', 31 | y: '400', 32 | x: '1000', 33 | width: '600', 34 | gravity: 'south_west', 35 | }, 36 | { 37 | overlay: { 38 | font_family: 'Poppins', 39 | font_size: 54, 40 | text: guestTitle, 41 | }, 42 | color: '#ffffff', 43 | effect: 'colorize', 44 | y: '300', 45 | x: '1000', 46 | gravity: 'south_west', 47 | }, 48 | { 49 | overlay: { 50 | font_family: 'Poppins', 51 | font_size: 60, 52 | text: time, 53 | }, 54 | color: '#de5254', 55 | effect: 'colorize', 56 | y: '50', 57 | width: '600', 58 | gravity: 'south', 59 | }, 60 | { 61 | overlay: 'learning_quick:me.png', 62 | height: '300', 63 | width: '300', 64 | y: '150', 65 | x: '-525', 66 | radius: 'max', 67 | border: '6px_solid_rgb:c7d0d9', 68 | }, 69 | { 70 | overlay: `learning_quick:${guestImage}`, 71 | height: '360', 72 | width: '360', 73 | y: '150', 74 | x: '-260', 75 | radius: 'max', 76 | border: '10px_solid_rgb:de5254', 77 | crop: 'fill', 78 | }, 79 | ], 80 | }); 81 | return url; 82 | }; 83 | 84 | module.exports = { generateLearningQuickCoverURL }; 85 | -------------------------------------------------------------------------------- /functions/utils/cloudinary.js: -------------------------------------------------------------------------------- 1 | const cloudinary = require('cloudinary').v2; 2 | cloudinary.config({ 3 | cloud_name: process.env.CLOUDINARY_CLOUD_NAME, 4 | api_key: process.env.CLOUDINARY_API_KEY, 5 | api_secret: process.env.CLOUDINARY_API_SECRET, 6 | }); 7 | 8 | module.exports = { cloudinary }; 9 | -------------------------------------------------------------------------------- /functions/utils/sanity.js: -------------------------------------------------------------------------------- 1 | const sanityClient = require('@sanity/client'); 2 | require('dotenv').config(); 3 | 4 | const client = sanityClient({ 5 | projectId: process.env.SANITY_PROJECT_ID, 6 | dataset: process.env.SANITY_DATASET_NAME, 7 | token: process.env.SANITY_TOKEN, 8 | }); 9 | 10 | module.exports = { client }; 11 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | functions = "functions" 3 | [[redirects]] 4 | from = "/api/*" 5 | to= "/.netlify/functions/:splat" 6 | status = 200 7 | [[headers]] 8 | for = "/*" 9 | [headers.values] 10 | Access-Control-Allow-Origin = "*" -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jqq-util-functions", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@rexxars/eventsource-polyfill": { 8 | "version": "1.0.0", 9 | "resolved": "https://registry.npmjs.org/@rexxars/eventsource-polyfill/-/eventsource-polyfill-1.0.0.tgz", 10 | "integrity": "sha512-YnrybIoM9WFqmeK1D8p/gutqjJnmXCVFWAU3ucka9M7Dzpen3f2Dy4KsC6k1wDHrCtHQuUHHwZovh3i5UPDaZw==" 11 | }, 12 | "@sanity/client": { 13 | "version": "1.150.7", 14 | "resolved": "https://registry.npmjs.org/@sanity/client/-/client-1.150.7.tgz", 15 | "integrity": "sha512-tqIi2MDE8MTJU6N2su0Ct7n+fioYe+tI9ZM2xVrvIUxU1wPxlBEs4f01rRdCttLRp6CoXUmRC7F0j68ZQWMcdA==", 16 | "requires": { 17 | "@sanity/eventsource": "1.150.1", 18 | "@sanity/generate-help-url": "1.150.1", 19 | "@sanity/observable": "1.150.1", 20 | "deep-assign": "^2.0.0", 21 | "get-it": "^5.0.3", 22 | "make-error": "^1.3.0", 23 | "object-assign": "^4.1.1" 24 | } 25 | }, 26 | "@sanity/eventsource": { 27 | "version": "1.150.1", 28 | "resolved": "https://registry.npmjs.org/@sanity/eventsource/-/eventsource-1.150.1.tgz", 29 | "integrity": "sha512-Sqkfr1+X5aJvDYnE6i0ZO5FlFw/wOxLwlSLbWEBWq/l3fvArj2qQp5rH6YNRsg2Dl4hQHOPajUlHbnFPM6SUfA==", 30 | "requires": { 31 | "@rexxars/eventsource-polyfill": "^1.0.0", 32 | "eventsource": "^1.0.6" 33 | } 34 | }, 35 | "@sanity/generate-help-url": { 36 | "version": "1.150.1", 37 | "resolved": "https://registry.npmjs.org/@sanity/generate-help-url/-/generate-help-url-1.150.1.tgz", 38 | "integrity": "sha512-IK54U7j161Ks6l/4eIg8d9LV4UW968vZr+SsYTa2pzXb3ktDPKcerCx12eDX6HkWGsETZsp0J48QHP3ocVzo9A==" 39 | }, 40 | "@sanity/observable": { 41 | "version": "1.150.1", 42 | "resolved": "https://registry.npmjs.org/@sanity/observable/-/observable-1.150.1.tgz", 43 | "integrity": "sha512-GXlXsNOJZ6p4aoMManRQnaL9qy1uXEcS5X1bGZCpKgcX5Rbyku6vYvxNFSGyrRRJRJKLwtUBrLNAjm92jpHFMQ==", 44 | "requires": { 45 | "object-assign": "^4.1.1", 46 | "rxjs": "^6.5.3" 47 | } 48 | }, 49 | "@sanity/timed-out": { 50 | "version": "4.0.2", 51 | "resolved": "https://registry.npmjs.org/@sanity/timed-out/-/timed-out-4.0.2.tgz", 52 | "integrity": "sha512-NBDKGj14g9Z+bopIvZcQKWCzJq5JSrdmzRR1CS+iyA3Gm8SnIWBfZa7I3mTg2X6Nu8LQXG0EPKXdOGozLS4i3w==" 53 | }, 54 | "capture-stack-trace": { 55 | "version": "1.0.1", 56 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", 57 | "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" 58 | }, 59 | "cloudinary": { 60 | "version": "1.22.0", 61 | "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.22.0.tgz", 62 | "integrity": "sha512-qQhSVqGyOWtGbPc3JrwyUXJEZpdqsEzBFSf5+gTo7gbKbXdzEysLagigoSlp6JYI7YW2oEbz4aeZlgN2ucOkzQ==", 63 | "requires": { 64 | "core-js": "^3.6.5", 65 | "lodash": "^4.17.11", 66 | "q": "^1.5.1" 67 | } 68 | }, 69 | "core-js": { 70 | "version": "3.6.5", 71 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", 72 | "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" 73 | }, 74 | "core-util-is": { 75 | "version": "1.0.2", 76 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 77 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 78 | }, 79 | "create-error-class": { 80 | "version": "3.0.2", 81 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 82 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 83 | "requires": { 84 | "capture-stack-trace": "^1.0.0" 85 | } 86 | }, 87 | "debug": { 88 | "version": "2.6.9", 89 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 90 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 91 | "requires": { 92 | "ms": "2.0.0" 93 | } 94 | }, 95 | "decompress-response": { 96 | "version": "3.3.0", 97 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 98 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 99 | "requires": { 100 | "mimic-response": "^1.0.0" 101 | } 102 | }, 103 | "deep-assign": { 104 | "version": "2.0.0", 105 | "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-2.0.0.tgz", 106 | "integrity": "sha1-6+BrHwfwja5ZdiDj3RYi83GhxXI=", 107 | "requires": { 108 | "is-obj": "^1.0.0" 109 | } 110 | }, 111 | "dotenv": { 112 | "version": "8.2.0", 113 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 114 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 115 | }, 116 | "eventsource": { 117 | "version": "1.0.7", 118 | "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", 119 | "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", 120 | "requires": { 121 | "original": "^1.0.0" 122 | } 123 | }, 124 | "follow-redirects": { 125 | "version": "1.13.0", 126 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", 127 | "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" 128 | }, 129 | "form-urlencoded": { 130 | "version": "2.0.9", 131 | "resolved": "https://registry.npmjs.org/form-urlencoded/-/form-urlencoded-2.0.9.tgz", 132 | "integrity": "sha512-fWUzNiOnYa126vFAT6TFXd1mhJrvD8IqmQ9ilZPjkLYQfaRreBr5fIUoOpPlWtqaAG64nzoE7u5zSetifab9IA==" 133 | }, 134 | "from2": { 135 | "version": "2.3.0", 136 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 137 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 138 | "requires": { 139 | "inherits": "^2.0.1", 140 | "readable-stream": "^2.0.0" 141 | } 142 | }, 143 | "get-it": { 144 | "version": "5.0.3", 145 | "resolved": "https://registry.npmjs.org/get-it/-/get-it-5.0.3.tgz", 146 | "integrity": "sha512-S/QxA9/P4e0tHPILIdf92FVYrE0vre7ChXXMZoILuU4/keatMqnW1KAzCEOH8toJVbj+hgrOnZdUxd9ruG7lsQ==", 147 | "requires": { 148 | "@sanity/timed-out": "^4.0.2", 149 | "create-error-class": "^3.0.2", 150 | "debug": "^2.6.8", 151 | "decompress-response": "^3.3.0", 152 | "follow-redirects": "^1.2.4", 153 | "form-urlencoded": "^2.0.7", 154 | "in-publish": "^2.0.0", 155 | "into-stream": "^3.1.0", 156 | "is-plain-object": "^2.0.4", 157 | "is-retry-allowed": "^1.1.0", 158 | "is-stream": "^1.1.0", 159 | "nano-pubsub": "^1.0.2", 160 | "object-assign": "^4.1.1", 161 | "parse-headers": "^2.0.1", 162 | "progress-stream": "^2.0.0", 163 | "same-origin": "^0.1.1", 164 | "simple-concat": "^1.0.0", 165 | "tunnel-agent": "^0.6.0", 166 | "url-parse": "^1.1.9" 167 | } 168 | }, 169 | "in-publish": { 170 | "version": "2.0.1", 171 | "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", 172 | "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" 173 | }, 174 | "inherits": { 175 | "version": "2.0.4", 176 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 177 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 178 | }, 179 | "into-stream": { 180 | "version": "3.1.0", 181 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", 182 | "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", 183 | "requires": { 184 | "from2": "^2.1.1", 185 | "p-is-promise": "^1.1.0" 186 | } 187 | }, 188 | "is-obj": { 189 | "version": "1.0.1", 190 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 191 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" 192 | }, 193 | "is-plain-object": { 194 | "version": "2.0.4", 195 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 196 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 197 | "requires": { 198 | "isobject": "^3.0.1" 199 | } 200 | }, 201 | "is-retry-allowed": { 202 | "version": "1.2.0", 203 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", 204 | "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" 205 | }, 206 | "is-stream": { 207 | "version": "1.1.0", 208 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 209 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 210 | }, 211 | "isarray": { 212 | "version": "1.0.0", 213 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 214 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 215 | }, 216 | "isobject": { 217 | "version": "3.0.1", 218 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 219 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 220 | }, 221 | "lodash": { 222 | "version": "4.17.20", 223 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 224 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 225 | }, 226 | "make-error": { 227 | "version": "1.3.6", 228 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 229 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" 230 | }, 231 | "mimic-response": { 232 | "version": "1.0.1", 233 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 234 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 235 | }, 236 | "ms": { 237 | "version": "2.0.0", 238 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 239 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 240 | }, 241 | "nano-pubsub": { 242 | "version": "1.0.2", 243 | "resolved": "https://registry.npmjs.org/nano-pubsub/-/nano-pubsub-1.0.2.tgz", 244 | "integrity": "sha1-NM53b3r5WZFbj3rP6N1rnGbzvek=" 245 | }, 246 | "netlify-functions-simple-return": { 247 | "version": "1.0.0", 248 | "resolved": "https://registry.npmjs.org/netlify-functions-simple-return/-/netlify-functions-simple-return-1.0.0.tgz", 249 | "integrity": "sha512-0WUa43pp/AYXkvuMrMVava3JF0ddv7uLxMrscqp8gOtZ1vs6VTU6daX6USwo52orGEbC6Yk2pXE+aBjTDuqY7g==" 250 | }, 251 | "node-fetch": { 252 | "version": "2.6.1", 253 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 254 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 255 | }, 256 | "object-assign": { 257 | "version": "4.1.1", 258 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 259 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 260 | }, 261 | "original": { 262 | "version": "1.0.2", 263 | "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", 264 | "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", 265 | "requires": { 266 | "url-parse": "^1.4.3" 267 | } 268 | }, 269 | "p-is-promise": { 270 | "version": "1.1.0", 271 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", 272 | "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" 273 | }, 274 | "parse-headers": { 275 | "version": "2.0.3", 276 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", 277 | "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" 278 | }, 279 | "process-nextick-args": { 280 | "version": "2.0.1", 281 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 282 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 283 | }, 284 | "progress-stream": { 285 | "version": "2.0.0", 286 | "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-2.0.0.tgz", 287 | "integrity": "sha1-+sY6Cz0R3qy7CWmrzJOyFLzhntU=", 288 | "requires": { 289 | "speedometer": "~1.0.0", 290 | "through2": "~2.0.3" 291 | } 292 | }, 293 | "q": { 294 | "version": "1.5.1", 295 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 296 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" 297 | }, 298 | "querystringify": { 299 | "version": "2.2.0", 300 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", 301 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" 302 | }, 303 | "readable-stream": { 304 | "version": "2.3.7", 305 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 306 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 307 | "requires": { 308 | "core-util-is": "~1.0.0", 309 | "inherits": "~2.0.3", 310 | "isarray": "~1.0.0", 311 | "process-nextick-args": "~2.0.0", 312 | "safe-buffer": "~5.1.1", 313 | "string_decoder": "~1.1.1", 314 | "util-deprecate": "~1.0.1" 315 | } 316 | }, 317 | "requires-port": { 318 | "version": "1.0.0", 319 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 320 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" 321 | }, 322 | "rxjs": { 323 | "version": "6.6.3", 324 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", 325 | "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", 326 | "requires": { 327 | "tslib": "^1.9.0" 328 | } 329 | }, 330 | "safe-buffer": { 331 | "version": "5.1.2", 332 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 333 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 334 | }, 335 | "same-origin": { 336 | "version": "0.1.1", 337 | "resolved": "https://registry.npmjs.org/same-origin/-/same-origin-0.1.1.tgz", 338 | "integrity": "sha1-wih9MZJXffUXrLvW0UUanDw5FPU=" 339 | }, 340 | "simple-concat": { 341 | "version": "1.0.1", 342 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 343 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" 344 | }, 345 | "speedometer": { 346 | "version": "1.0.0", 347 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.0.0.tgz", 348 | "integrity": "sha1-zWccsGdSwivKM3Di8zREC+T8YuI=" 349 | }, 350 | "string_decoder": { 351 | "version": "1.1.1", 352 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 353 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 354 | "requires": { 355 | "safe-buffer": "~5.1.0" 356 | } 357 | }, 358 | "through2": { 359 | "version": "2.0.5", 360 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 361 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 362 | "requires": { 363 | "readable-stream": "~2.3.6", 364 | "xtend": "~4.0.1" 365 | } 366 | }, 367 | "tslib": { 368 | "version": "1.13.0", 369 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 370 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" 371 | }, 372 | "tunnel-agent": { 373 | "version": "0.6.0", 374 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 375 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 376 | "requires": { 377 | "safe-buffer": "^5.0.1" 378 | } 379 | }, 380 | "url-parse": { 381 | "version": "1.4.7", 382 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", 383 | "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", 384 | "requires": { 385 | "querystringify": "^2.1.1", 386 | "requires-port": "^1.0.0" 387 | } 388 | }, 389 | "util-deprecate": { 390 | "version": "1.0.2", 391 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 392 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 393 | }, 394 | "xtend": { 395 | "version": "4.0.2", 396 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 397 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 398 | } 399 | } 400 | } 401 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jqq-util-functions", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/jamesqquick/jqq-util-functions.git" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "bugs": { 16 | "url": "https://github.com/jamesqquick/jqq-util-functions/issues" 17 | }, 18 | "homepage": "https://github.com/jamesqquick/jqq-util-functions#readme", 19 | "dependencies": { 20 | "@sanity/client": "^1.150.7", 21 | "cloudinary": "^1.22.0", 22 | "dotenv": "^8.2.0", 23 | "netlify-functions-simple-return": "^1.0.0", 24 | "node-fetch": "^2.6.1" 25 | } 26 | } 27 | --------------------------------------------------------------------------------