From 1a702ddae1e6179eec693a252121a0fe72374892 Mon Sep 17 00:00:00 2001 From: Jeremy Wright Date: Wed, 14 Apr 2021 13:17:44 -0400 Subject: [PATCH 01/14] Added hacked cadquery Dockerfile to ensure it would work --- api/src/docker/cadquery/Dockerfile | 56 ++ api/src/docker/cadquery/entrypoint.sh | 6 + api/src/docker/cadquery/node14source_setup.sh | 349 +++++++ api/src/docker/cadquery/openscad.js | 95 ++ api/src/docker/cadquery/package-lock.json | 944 ++++++++++++++++++ api/src/docker/cadquery/package.json | 16 + api/src/docker/cadquery/runScad.js | 77 ++ api/src/docker/cadquery/shaft_coupler.py | 13 + api/src/docker/cadquery/yarn.lock | 386 +++++++ 9 files changed, 1942 insertions(+) create mode 100644 api/src/docker/cadquery/Dockerfile create mode 100644 api/src/docker/cadquery/entrypoint.sh create mode 100644 api/src/docker/cadquery/node14source_setup.sh create mode 100644 api/src/docker/cadquery/openscad.js create mode 100644 api/src/docker/cadquery/package-lock.json create mode 100644 api/src/docker/cadquery/package.json create mode 100644 api/src/docker/cadquery/runScad.js create mode 100644 api/src/docker/cadquery/shaft_coupler.py create mode 100644 api/src/docker/cadquery/yarn.lock diff --git a/api/src/docker/cadquery/Dockerfile b/api/src/docker/cadquery/Dockerfile new file mode 100644 index 0000000..b48c711 --- /dev/null +++ b/api/src/docker/cadquery/Dockerfile @@ -0,0 +1,56 @@ +FROM public.ecr.aws/lts/ubuntu:20.04_stable + +ARG DEBIAN_FRONTEND=noninteractive + +## install things needed to run openscad (xvfb is an important one) +RUN apt-get update -qq +# double check this below, I'm not sure we need inkscape etc +RUN apt-get -y -qq install software-properties-common dirmngr apt-transport-https lsb-release ca-certificates xvfb imagemagick unzip inkscape +RUN apt-get update -qq +# RUN apt-get install -y -qq openscad +RUN apt-get install -y curl +RUN apt-get install -y git + +# install node14, see comment at the to of node14source_setup.sh +ADD node14source_setup.sh /nodesource_setup.sh +RUN ["chmod", "+x", "/nodesource_setup.sh"] +RUN bash nodesource_setup.sh +RUN apt-get install -y nodejs + +# Install aws-lambda-cpp build dependencies, this is for the post install script in aws-lambda-ric (in package.json) +RUN apt-get update && \ + apt-get install -y \ + g++ \ + make \ + cmake \ + unzip \ + automake autoconf libtool \ + libcurl4-openssl-dev + +# Add the lambda emulator for local dev, (see entrypoint.sh for where it's used), +# I have the file locally (gitignored) to speed up build times (as it downloads everytime), +# but you can use the http version of the below ADD command or download it yourself from that url. +# ADD aws-lambda-rie /usr/local/bin/aws-lambda-rie +ADD https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/download/v1.0/aws-lambda-rie /usr/local/bin/aws-lambda-rie +RUN ["chmod", "+x", "/usr/local/bin/aws-lambda-rie"] + +WORKDIR /var/task/ +COPY package*.json /var/task/ +RUN npm install + +# Install Miniconda and CadQuery +#RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh +RUN curl -sL "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" > "miniconda.sh" +RUN bash miniconda.sh -b -p $HOME/miniconda +RUN . $HOME/miniconda/bin/activate && conda create -n cadquery && conda activate cadquery && conda install -c conda-forge -c cadquery cadquery=master python=3.8 + +# Grab a copy of cq-cli to convert the provided script +RUN git clone https://github.com/CadQuery/cq-cli.git + +COPY *.js /var/task/ +COPY entrypoint.sh /entrypoint.sh +RUN ["chmod", "+x", "/entrypoint.sh"] +ENTRYPOINT ["sh", "/entrypoint.sh"] +COPY shaft_coupler.py /shaft_coupler.py +RUN . $HOME/miniconda/bin/activate && conda activate cadquery && python cq-cli/cq-cli.py --codec svg --infile /shaft_coupler.py +# CMD [ "openscad.render" ] diff --git a/api/src/docker/cadquery/entrypoint.sh b/api/src/docker/cadquery/entrypoint.sh new file mode 100644 index 0000000..53643f2 --- /dev/null +++ b/api/src/docker/cadquery/entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/sh +if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then + /usr/local/bin/aws-lambda-rie /usr/bin/npx aws-lambda-ric $1 +else + /usr/bin/npx aws-lambda-ric $1 +fi diff --git a/api/src/docker/cadquery/node14source_setup.sh b/api/src/docker/cadquery/node14source_setup.sh new file mode 100644 index 0000000..16a777d --- /dev/null +++ b/api/src/docker/cadquery/node14source_setup.sh @@ -0,0 +1,349 @@ +#!/bin/bash + +# CADHUB COMMENT +# This was fetch on the fly in the dockerfile "RUN curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh" +# Because we rely on the bash script to install node 14 it make sense to have it in version control +# incase it disapears, plus will speed up build time a little. +# If we upgrade node versions for the lambdas we replace this file + +# Discussion, issues and change requests at: +# https://github.com/nodesource/distributions +# +# Script to install the NodeSource Node.js 14.x repo onto a +# Debian or Ubuntu system. +# +# Run as root or insert `sudo -E` before `bash`: +# +# curl -sL https://deb.nodesource.com/setup_14.x | bash - +# or +# wget -qO- https://deb.nodesource.com/setup_14.x | bash - +# +# CONTRIBUTIONS TO THIS SCRIPT +# +# This script is built from a template in +# https://github.com/nodesource/distributions/tree/master/deb/src +# please don't submit pull requests against the built scripts. +# + + +export DEBIAN_FRONTEND=noninteractive +SCRSUFFIX="_14.x" +NODENAME="Node.js 14.x" +NODEREPO="node_14.x" +NODEPKG="nodejs" + +print_status() { + echo + echo "## $1" + echo +} + +if test -t 1; then # if terminal + ncolors=$(which tput > /dev/null && tput colors) # supports color + if test -n "$ncolors" && test $ncolors -ge 8; then + termcols=$(tput cols) + bold="$(tput bold)" + underline="$(tput smul)" + standout="$(tput smso)" + normal="$(tput sgr0)" + black="$(tput setaf 0)" + red="$(tput setaf 1)" + green="$(tput setaf 2)" + yellow="$(tput setaf 3)" + blue="$(tput setaf 4)" + magenta="$(tput setaf 5)" + cyan="$(tput setaf 6)" + white="$(tput setaf 7)" + fi +fi + +print_bold() { + title="$1" + text="$2" + + echo + echo "${red}================================================================================${normal}" + echo "${red}================================================================================${normal}" + echo + echo -e " ${bold}${yellow}${title}${normal}" + echo + echo -en " ${text}" + echo + echo "${red}================================================================================${normal}" + echo "${red}================================================================================${normal}" +} + +bail() { + echo 'Error executing command, exiting' + exit 1 +} + +exec_cmd_nobail() { + echo "+ $1" + bash -c "$1" +} + +exec_cmd() { + exec_cmd_nobail "$1" || bail +} + +node_deprecation_warning() { + if [[ "X${NODENAME}" == "Xio.js 1.x" || + "X${NODENAME}" == "Xio.js 2.x" || + "X${NODENAME}" == "Xio.js 3.x" || + "X${NODENAME}" == "XNode.js 0.10" || + "X${NODENAME}" == "XNode.js 0.12" || + "X${NODENAME}" == "XNode.js 4.x LTS Argon" || + "X${NODENAME}" == "XNode.js 5.x" || + "X${NODENAME}" == "XNode.js 6.x LTS Boron" || + "X${NODENAME}" == "XNode.js 7.x" || + "X${NODENAME}" == "XNode.js 8.x LTS Carbon" || + "X${NODENAME}" == "XNode.js 9.x" || + "X${NODENAME}" == "XNode.js 11.x" || + "X${NODENAME}" == "XNode.js 13.x" ]]; then + + print_bold \ +" DEPRECATION WARNING " "\ +${bold}${NODENAME} is no longer actively supported!${normal} + + ${bold}You will not receive security or critical stability updates${normal} for this version. + + You should migrate to a supported version of Node.js as soon as possible. + Use the installation script that corresponds to the version of Node.js you + wish to install. e.g. + + * ${green}https://deb.nodesource.com/setup_10.x — Node.js 10 LTS \"Dubnium\"${normal} + * ${green}https://deb.nodesource.com/setup_12.x — Node.js 12 LTS \"Erbium\"${normal} (recommended) + * ${green}https://deb.nodesource.com/setup_14.x — Node.js 14 LTS \"Fermium\"${normal} + * ${green}https://deb.nodesource.com/setup_15.x — Node.js 15 \"Fifteen\"${normal} + + Please see ${bold}https://github.com/nodejs/Release${normal} for details about which + version may be appropriate for you. + + The ${bold}NodeSource${normal} Node.js distributions repository contains + information both about supported versions of Node.js and supported Linux + distributions. To learn more about usage, see the repository: + ${bold}https://github.com/nodesource/distributions${normal} +" + echo + echo "Continuing in 20 seconds ..." + echo + sleep 20 + fi +} + +script_deprecation_warning() { + if [ "X${SCRSUFFIX}" == "X" ]; then + print_bold \ +" SCRIPT DEPRECATION WARNING " "\ +This script, located at ${bold}https://deb.nodesource.com/setup${normal}, used to + install Node.js 0.10, is deprecated and will eventually be made inactive. + + You should use the script that corresponds to the version of Node.js you + wish to install. e.g. + + * ${green}https://deb.nodesource.com/setup_10.x — Node.js 10 LTS \"Dubnium\"${normal} + * ${green}https://deb.nodesource.com/setup_12.x — Node.js 12 LTS \"Erbium\"${normal} (recommended) + * ${green}https://deb.nodesource.com/setup_14.x — Node.js 14 LTS \"Fermium\"${normal} + * ${green}https://deb.nodesource.com/setup_15.x — Node.js 15 \"Fifteen\"${normal} + Please see ${bold}https://github.com/nodejs/Release${normal} for details about which + version may be appropriate for you. + + The ${bold}NodeSource${normal} Node.js Linux distributions GitHub repository contains + information about which versions of Node.js and which Linux distributions + are supported and how to use the install scripts. + ${bold}https://github.com/nodesource/distributions${normal} +" + + echo + echo "Continuing in 20 seconds (press Ctrl-C to abort) ..." + echo + sleep 20 + fi +} + +setup() { + +script_deprecation_warning +node_deprecation_warning + +print_status "Installing the NodeSource ${NODENAME} repo..." + +if $(uname -m | grep -Eq ^armv6); then + print_status "You appear to be running on ARMv6 hardware. Unfortunately this is not currently supported by the NodeSource Linux distributions. Please use the 'linux-armv6l' binary tarballs available directly from nodejs.org for Node.js 4 and later." + exit 1 +fi + +PRE_INSTALL_PKGS="" + +# Check that HTTPS transport is available to APT +# (Check snaked from: https://get.docker.io/ubuntu/) + +if [ ! -e /usr/lib/apt/methods/https ]; then + PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} apt-transport-https" +fi + +if [ ! -x /usr/bin/lsb_release ]; then + PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} lsb-release" +fi + +if [ ! -x /usr/bin/curl ] && [ ! -x /usr/bin/wget ]; then + PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} curl" +fi + +# Used by apt-key to add new keys + +if [ ! -x /usr/bin/gpg ]; then + PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} gnupg" +fi + +# Populating Cache +print_status "Populating apt-get cache..." +exec_cmd 'apt-get update' + +if [ "X${PRE_INSTALL_PKGS}" != "X" ]; then + print_status "Installing packages required for setup:${PRE_INSTALL_PKGS}..." + # This next command needs to be redirected to /dev/null or the script will bork + # in some environments + exec_cmd "apt-get install -y${PRE_INSTALL_PKGS} > /dev/null 2>&1" +fi + +IS_PRERELEASE=$(lsb_release -d | grep 'Ubuntu .*development' >& /dev/null; echo $?) +if [[ $IS_PRERELEASE -eq 0 ]]; then + print_status "Your distribution, identified as \"$(lsb_release -d -s)\", is a pre-release version of Ubuntu. NodeSource does not maintain official support for Ubuntu versions until they are formally released. You can try using the manual installation instructions available at https://github.com/nodesource/distributions and use the latest supported Ubuntu version name as the distribution identifier, although this is not guaranteed to work." + exit 1 +fi + +DISTRO=$(lsb_release -c -s) + +check_alt() { + if [ "X${DISTRO}" == "X${2}" ]; then + echo + echo "## You seem to be using ${1} version ${DISTRO}." + echo "## This maps to ${3} \"${4}\"... Adjusting for you..." + DISTRO="${4}" + fi +} + +check_alt "SolydXK" "solydxk-9" "Debian" "stretch" +check_alt "Kali" "sana" "Debian" "jessie" +check_alt "Kali" "kali-rolling" "Debian" "bullseye" +check_alt "Sparky Linux" "Tyche" "Debian" "stretch" +check_alt "Sparky Linux" "Nibiru" "Debian" "buster" +check_alt "MX Linux 17" "Horizon" "Debian" "stretch" +check_alt "MX Linux 18" "Continuum" "Debian" "stretch" +check_alt "MX Linux 19" "patito feo" "Debian" "buster" +check_alt "Linux Mint" "maya" "Ubuntu" "precise" +check_alt "Linux Mint" "qiana" "Ubuntu" "trusty" +check_alt "Linux Mint" "rafaela" "Ubuntu" "trusty" +check_alt "Linux Mint" "rebecca" "Ubuntu" "trusty" +check_alt "Linux Mint" "rosa" "Ubuntu" "trusty" +check_alt "Linux Mint" "sarah" "Ubuntu" "xenial" +check_alt "Linux Mint" "serena" "Ubuntu" "xenial" +check_alt "Linux Mint" "sonya" "Ubuntu" "xenial" +check_alt "Linux Mint" "sylvia" "Ubuntu" "xenial" +check_alt "Linux Mint" "tara" "Ubuntu" "bionic" +check_alt "Linux Mint" "tessa" "Ubuntu" "bionic" +check_alt "Linux Mint" "tina" "Ubuntu" "bionic" +check_alt "Linux Mint" "tricia" "Ubuntu" "bionic" +check_alt "Linux Mint" "ulyana" "Ubuntu" "focal" +check_alt "Linux Mint" "ulyssa" "Ubuntu" "focal" +check_alt "LMDE" "betsy" "Debian" "jessie" +check_alt "LMDE" "cindy" "Debian" "stretch" +check_alt "LMDE" "debbie" "Debian" "buster" +check_alt "elementaryOS" "luna" "Ubuntu" "precise" +check_alt "elementaryOS" "freya" "Ubuntu" "trusty" +check_alt "elementaryOS" "loki" "Ubuntu" "xenial" +check_alt "elementaryOS" "juno" "Ubuntu" "bionic" +check_alt "elementaryOS" "hera" "Ubuntu" "bionic" +check_alt "elementaryOS" "odin" "Ubuntu" "focal" +check_alt "Trisquel" "toutatis" "Ubuntu" "precise" +check_alt "Trisquel" "belenos" "Ubuntu" "trusty" +check_alt "Trisquel" "flidas" "Ubuntu" "xenial" +check_alt "Trisquel" "etiona" "Ubuntu" "bionic" +check_alt "Uruk GNU/Linux" "lugalbanda" "Ubuntu" "xenial" +check_alt "BOSS" "anokha" "Debian" "wheezy" +check_alt "BOSS" "anoop" "Debian" "jessie" +check_alt "BOSS" "drishti" "Debian" "stretch" +check_alt "BOSS" "unnati" "Debian" "buster" +check_alt "bunsenlabs" "bunsen-hydrogen" "Debian" "jessie" +check_alt "bunsenlabs" "helium" "Debian" "stretch" +check_alt "bunsenlabs" "lithium" "Debian" "buster" +check_alt "Tanglu" "chromodoris" "Debian" "jessie" +check_alt "PureOS" "green" "Debian" "sid" +check_alt "PureOS" "amber" "Debian" "buster" +check_alt "Devuan" "jessie" "Debian" "jessie" +check_alt "Devuan" "ascii" "Debian" "stretch" +check_alt "Devuan" "beowulf" "Debian" "buster" +check_alt "Devuan" "ceres" "Debian" "sid" +check_alt "Deepin" "panda" "Debian" "sid" +check_alt "Deepin" "unstable" "Debian" "sid" +check_alt "Deepin" "stable" "Debian" "buster" +check_alt "Pardus" "onyedi" "Debian" "stretch" +check_alt "Liquid Lemur" "lemur-3" "Debian" "stretch" +check_alt "Astra Linux" "orel" "Debian" "stretch" +check_alt "Ubilinux" "dolcetto" "Debian" "stretch" + +if [ "X${DISTRO}" == "Xdebian" ]; then + print_status "Unknown Debian-based distribution, checking /etc/debian_version..." + NEWDISTRO=$([ -e /etc/debian_version ] && cut -d/ -f1 < /etc/debian_version) + if [ "X${NEWDISTRO}" == "X" ]; then + print_status "Could not determine distribution from /etc/debian_version..." + else + DISTRO=$NEWDISTRO + print_status "Found \"${DISTRO}\" in /etc/debian_version..." + fi +fi + +print_status "Confirming \"${DISTRO}\" is supported..." + +if [ -x /usr/bin/curl ]; then + exec_cmd_nobail "curl -sLf -o /dev/null 'https://deb.nodesource.com/${NODEREPO}/dists/${DISTRO}/Release'" + RC=$? +else + exec_cmd_nobail "wget -qO /dev/null -o /dev/null 'https://deb.nodesource.com/${NODEREPO}/dists/${DISTRO}/Release'" + RC=$? +fi + +if [[ $RC != 0 ]]; then + print_status "Your distribution, identified as \"${DISTRO}\", is not currently supported, please contact NodeSource at https://github.com/nodesource/distributions/issues if you think this is incorrect or would like your distribution to be considered for support" + exit 1 +fi + +if [ -f "/etc/apt/sources.list.d/chris-lea-node_js-$DISTRO.list" ]; then + print_status 'Removing Launchpad PPA Repository for NodeJS...' + + exec_cmd_nobail 'add-apt-repository -y -r ppa:chris-lea/node.js' + exec_cmd "rm -f /etc/apt/sources.list.d/chris-lea-node_js-${DISTRO}.list" +fi + +print_status 'Adding the NodeSource signing key to your keyring...' + +if [ -x /usr/bin/curl ]; then + exec_cmd 'curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -' +else + exec_cmd 'wget -qO- https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -' +fi + +print_status "Creating apt sources list file for the NodeSource ${NODENAME} repo..." + +exec_cmd "echo 'deb https://deb.nodesource.com/${NODEREPO} ${DISTRO} main' > /etc/apt/sources.list.d/nodesource.list" +exec_cmd "echo 'deb-src https://deb.nodesource.com/${NODEREPO} ${DISTRO} main' >> /etc/apt/sources.list.d/nodesource.list" + +print_status 'Running `apt-get update` for you...' + +exec_cmd 'apt-get update' + +print_status """Run \`${bold}sudo apt-get install -y ${NODEPKG}${normal}\` to install ${NODENAME} and npm +## You may also need development tools to build native addons: + sudo apt-get install gcc g++ make +## To install the Yarn package manager, run: + curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - + echo \"deb https://dl.yarnpkg.com/debian/ stable main\" | sudo tee /etc/apt/sources.list.d/yarn.list + sudo apt-get update && sudo apt-get install yarn +""" + +} + +## Defer setup until we have the complete script +setup diff --git a/api/src/docker/cadquery/openscad.js b/api/src/docker/cadquery/openscad.js new file mode 100644 index 0000000..1edb2ef --- /dev/null +++ b/api/src/docker/cadquery/openscad.js @@ -0,0 +1,95 @@ +const { runScad, stlExport } = require('./runScad') +const middy = require('middy') +const { cors } = require('middy/middlewares') + +const health = async () => { + console.log('Health endpoint') + return { + statusCode: 200, + body: 'ok', + } +} + +// cors true does not seem to work in serverless.yml, perhaps docker lambdas aren't covered by that config +// special lambda just for responding to options requests +const preflightOptions = (req, _context, callback) => { + const response = { + statusCode: 204, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'POST', + 'Access-Control-Allow-Headers': '*', + }, + } + callback(null, response) +} + +const render = async (req, _context, callback) => { + _context.callbackWaitsForEmptyEventLoop = false + const eventBody = Buffer.from(req.body, 'base64').toString('ascii') + console.log(eventBody, 'eventBody') + const { file, settings } = JSON.parse(eventBody) + const { error, result, tempFile } = await runScad({ file, settings }) + if (error) { + const response = { + statusCode: 400, + body: JSON.stringify({ error, tempFile }), + } + callback(null, response) + } else { + console.log(`got result in route: ${result}, file is: ${tempFile}`) + const fs = require('fs') + const image = fs.readFileSync(`/tmp/${tempFile}/output.png`, { + encoding: 'base64', + }) + console.log(image, 'encoded image') + const response = { + statusCode: 200, + body: JSON.stringify({ + imageBase64: image, + result, + tempFile, + }), + } + callback(null, response) + } +} + +const exportstl = async (req, _context, callback) => { + _context.callbackWaitsForEmptyEventLoop = false + const eventBody = Buffer.from(req.body, 'base64').toString('ascii') + console.log(eventBody, 'eventBody') + const { file } = JSON.parse(eventBody) + const { error, result, tempFile } = await stlExport({ file }) + if (error) { + const response = { + statusCode: 400, + body: { error, tempFile }, + } + callback(null, response) + } else { + console.log(`got result in route: ${result}, file is: ${tempFile}`) + const fs = require('fs') + const stl = fs.readFileSync(`/tmp/${tempFile}/output.stl`, { + encoding: 'base64', + }) + console.log('encoded stl', stl) + const response = { + statusCode: 200, + headers: { + 'content-type': 'application/stl', + }, + body: stl, + isBase64Encoded: true, + } + console.log('callback fired') + callback(null, response) + } +} + +module.exports = { + health: middy(health).use(cors()), + exportstl: middy(exportstl).use(cors()), + render: middy(render).use(cors()), + preflightOptions, +} diff --git a/api/src/docker/cadquery/package-lock.json b/api/src/docker/cadquery/package-lock.json new file mode 100644 index 0000000..776fa2d --- /dev/null +++ b/api/src/docker/cadquery/package-lock.json @@ -0,0 +1,944 @@ +{ + "name": "openscad-endpoint", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/aws-lambda": { + "version": "8.10.72", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.72.tgz", + "integrity": "sha512-jOrTwAhSiUtBIN/QsWNKlI4+4aDtpZ0sr2BRvKW6XQZdspgHUSHPcuzxbzCRiHUiDQ+0026u5TSE38VyIhNnfA==" + }, + "@types/http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-i18n": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-3.6.0.tgz", + "integrity": "sha512-F21DzmzYq9aVtY8CGGtlnQDy3rFMaFW2KRlMuCQp76KiPIkvqN+mpq5MI9EsgC0VFwj+jeLIsvVCvPOa1sobBQ==" + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-lambda-ric": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/aws-lambda-ric/-/aws-lambda-ric-1.0.0.tgz", + "integrity": "sha512-1a7oCloj2uIui41RMMRRVlf/bIiRQt7UlmfY7+NpuEyal5bnpj4RMooErq3Q8jOBSmX4pqP6KeRScv7uV2Ep1w==", + "dev": true, + "requires": { + "node-addon-api": "3.0.2", + "node-gyp": "7.1.2" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "busboy": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", + "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", + "requires": { + "dicer": "0.3.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "requires": { + "streamsearch": "0.1.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-mask": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/json-mask/-/json-mask-0.3.9.tgz", + "integrity": "sha512-RRu7bf7vzOohKMrU5pD9+fROMltTegWj2trZlPNr7hXekptFGkOZo4S63Jdx2X1GR7IK6rEVvXkQKY+2TPs0PA==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "middy": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/middy/-/middy-0.36.0.tgz", + "integrity": "sha512-IhIVEZQs8mxcvPHfzAQpwINj4R+aVgeCcUL9KS+OYE5Vy4hKhZtVl/1yfI8dSvDAfRBoRp6N/Gi04pxQM4vAzw==", + "requires": { + "@types/aws-lambda": "^8.10.45", + "@types/http-errors": "^1.6.3", + "ajv": "^6.9.1", + "ajv-i18n": "^3.4.0", + "ajv-keywords": "^3.4.1", + "busboy": "^0.3.1", + "content-type": "^1.0.4", + "http-errors": "^1.7.3", + "json-mask": "^0.3.8", + "negotiator": "^0.6.1", + "once": "^1.4.0", + "qs": "^6.6.0", + "querystring": "^0.2.0" + }, + "dependencies": { + "qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + } + } + }, + "mime-db": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", + "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", + "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "dev": true, + "requires": { + "mime-db": "1.46.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "node-addon-api": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz", + "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==", + "dev": true + }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/api/src/docker/cadquery/package.json b/api/src/docker/cadquery/package.json new file mode 100644 index 0000000..7bf56d7 --- /dev/null +++ b/api/src/docker/cadquery/package.json @@ -0,0 +1,16 @@ +{ + "name": "openscad-endpoint", + "version": "0.0.1", + "description": "endpoint for openscad", + "main": "index.js", + "author": "Kurt Hutten ", + "license": "", + "dependencies": { + "cors": "^2.8.5", + "middy": "^0.36.0", + "nanoid": "^3.1.20" + }, + "devDependencies": { + "aws-lambda-ric": "^1.0.0" + } +} diff --git a/api/src/docker/cadquery/runScad.js b/api/src/docker/cadquery/runScad.js new file mode 100644 index 0000000..c23e0b6 --- /dev/null +++ b/api/src/docker/cadquery/runScad.js @@ -0,0 +1,77 @@ +const { exec } = require('child_process') +const { promises } = require('fs') +const { writeFile } = promises +const { nanoid } = require('nanoid') + +module.exports.runScad = async ({ + file, + settings: { + size: { x = 500, y = 500 } = {}, + camera: { + position = { x: 40, y: 40, z: 40 }, + rotation = { x: 55, y: 0, z: 25 }, + dist = 200, + } = {}, + } = {}, // TODO add view settings +} = {}) => { + const tempFile = await makeFile(file) + const { x: rx, y: ry, z: rz } = rotation + const { x: px, y: py, z: pz } = position + const cameraArg = `--camera=${px},${py},${pz},${rx},${ry},${rz},${dist}` + const command = `xvfb-run --auto-servernum --server-args "-screen 0 1024x768x24" openscad -o /tmp/${tempFile}/output.png ${cameraArg} --imgsize=${x},${y} --colorscheme DeepOcean /tmp/${tempFile}/main.scad` + console.log('command', command) + + try { + const result = await runCommand(command, 10000) + return { result, tempFile } + } catch (error) { + return { error, tempFile } + } +} + +module.exports.stlExport = async ({ file } = {}) => { + const tempFile = await makeFile(file) + + try { + const result = await runCommand( + `openscad -o /tmp/${tempFile}/output.stl /tmp/${tempFile}/main.scad`, + 300000 // lambda will time out before this, we might need to look at background jobs if we do git integration stl generation + ) + return { result, tempFile } + } catch (error) { + return { error, tempFile } + } +} + +async function makeFile(file) { + const tempFile = 'a' + nanoid() // 'a' ensure nothing funny happens if it start with a bad character like "-", maybe I should pick a safer id generator :shrug: + console.log(`file to write: ${file}`) + + await runCommand(`mkdir /tmp/${tempFile}`) + await writeFile(`/tmp/${tempFile}/main.scad`, file) + return tempFile +} + +async function runCommand(command, timeout = 5000) { + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + console.log(`error: ${error.message}`) + console.log(`stderr: ${stderr}`) + console.log(`stdout: ${stdout}`) + reject(stdout || stderr) // it seems random if the message is in stdout or stderr, but not normally both + return + } + if (stderr) { + console.log(`stderr: ${stderr}`) + resolve(stderr) + return + } + console.log(`stdout: ${stdout}`) + resolve(stdout) + }) + setTimeout(() => { + reject('timeout') + }, timeout) + }) +} diff --git a/api/src/docker/cadquery/shaft_coupler.py b/api/src/docker/cadquery/shaft_coupler.py new file mode 100644 index 0000000..467fbf7 --- /dev/null +++ b/api/src/docker/cadquery/shaft_coupler.py @@ -0,0 +1,13 @@ +import cadquery as cq +from cadquery import exporters + +diam = 5.0 + +result = (cq.Workplane().circle(diam).extrude(20.0) + .faces(">Z").workplane(invert=True).circle(1.05).cutBlind(8.0) + .faces("= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +mime-db@1.46.0: + version "1.46.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" + integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== + +mime-types@~2.1.24: + version "2.1.29" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" + integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + dependencies: + mime-db "1.46.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +nanoid@^3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -- 2.39.5 From 2153e5b1bf83dc4a5164c6f117a7f45c83e3524a Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Sun, 18 Apr 2021 12:28:23 +1000 Subject: [PATCH 02/14] Front end changes for cadquery Basic changes to get the proof of concept working. Lots of attention was given to the store/reducer to solve existing problems with async code and stale closures, it seems even today how to handle this with use reducer is not quiet settle, I guess because once an app reaches a certain level of maturity everyone grabs an off the shelf solution to state management. I ended up implementing thunks because they are really rather simple. Interesting thread about it all here: https://gist.github.com/astoilkov/013c513e33fe95fa8846348038d8fe42#gistcomment-3377800 I also move some of settings that were persisted in the openScad controller into the data store as I ulimately thing what I was doing in that file was very confusing, with the fact that it had to be called multiple times with different information before it would be able to render something properly. --- .../components/IdeContainer/IdeContainer.js | 56 ++++++---- web/src/components/IdeEditor/IdeEditor.js | 32 ++++-- .../components/IdeToolbarNew/IdeToolbarNew.js | 33 +++--- web/src/components/IdeViewer/IdeViewer.js | 103 +++++++++++++----- .../helpers/cadPackages/cadQueryController.js | 68 ++++++++++++ web/src/helpers/cadPackages/index.js | 6 +- .../cadPackages/newCascadeController.js | 35 ------ .../helpers/cadPackages/openScadController.js | 25 +---- web/src/helpers/hooks/useIdeState.js | 99 ++++++++++------- 9 files changed, 295 insertions(+), 162 deletions(-) create mode 100644 web/src/helpers/cadPackages/cadQueryController.js delete mode 100644 web/src/helpers/cadPackages/newCascadeController.js diff --git a/web/src/components/IdeContainer/IdeContainer.js b/web/src/components/IdeContainer/IdeContainer.js index e61b426..6f852aa 100644 --- a/web/src/components/IdeContainer/IdeContainer.js +++ b/web/src/components/IdeContainer/IdeContainer.js @@ -1,6 +1,7 @@ import { useContext, useRef, useEffect } from 'react' import { Mosaic, MosaicWindow } from 'react-mosaic-component' import { IdeContext } from 'src/components/IdeToolbarNew' +import { requestRender } from 'src/helpers/hooks/useIdeState' import IdeEditor from 'src/components/IdeEditor' import IdeViewer from 'src/components/IdeViewer' import IdeConsole from 'src/components/IdeConsole' @@ -13,7 +14,7 @@ const ELEMENT_MAP = { } const IdeContainer = () => { - const { state, dispatch } = useContext(IdeContext) + const { state, thunkDispatch } = useContext(IdeContext) const viewerDOM = useRef(null) const debounceTimeoutId = useRef @@ -22,12 +23,22 @@ const IdeContainer = () => { function handleViewerSizeUpdate() { if (viewerDOM !== null && viewerDOM.current) { const { width, height } = viewerDOM.current.getBoundingClientRect() - dispatch({ - type: 'render', - payload: { - code: state.code, - viewerSize: { width, height }, - }, + thunkDispatch({ + type: 'updateViewerSize', + payload: { viewerSize: { width, height } }, + }) + thunkDispatch((dispatch, getState) => { + const state = getState() + if (state.ideType === 'openScad') { + dispatch({ type: 'setLoading' }) + requestRender({ + state, + dispatch, + code: state.code, + viewerSize: { width, height }, + camera: state.camera, + }) + } }) } } @@ -49,20 +60,27 @@ const IdeContainer = () => { return (
( - - {id === 'Viewer' ? ( -
- {ELEMENT_MAP[id]} -
- ) : ( - ELEMENT_MAP[id] - )} -
- )} + renderTile={(id, path) => { + const title = id === 'Editor' ? `${id} (${state.ideType})` : id + return ( + + {id === 'Viewer' ? ( +
+ {ELEMENT_MAP[id]} +
+ ) : ( + ELEMENT_MAP[id] + )} +
+ ) + }} value={state.layout} onChange={(newLayout) => - dispatch({ type: 'setLayout', payload: { message: newLayout } }) + thunkDispatch({ type: 'setLayout', payload: { message: newLayout } }) } onRelease={handleViewerSizeUpdate} /> diff --git a/web/src/components/IdeEditor/IdeEditor.js b/web/src/components/IdeEditor/IdeEditor.js index 7ad5ad5..bbc0edd 100644 --- a/web/src/components/IdeEditor/IdeEditor.js +++ b/web/src/components/IdeEditor/IdeEditor.js @@ -2,10 +2,15 @@ import { useContext, useEffect, Suspense, lazy } from 'react' import { isBrowser } from '@redwoodjs/prerender/browserUtils' import { IdeContext } from 'src/components/IdeToolbarNew' import { codeStorageKey } from 'src/helpers/hooks/useIdeState' +import { requestRender } from 'src/helpers/hooks/useIdeState' const Editor = lazy(() => import('@monaco-editor/react')) const IdeEditor = () => { - const { state, dispatch } = useContext(IdeContext) + const { state, thunkDispatch } = useContext(IdeContext) + const ideTypeToLanguageMap = { + cadQuery: 'python', + openScad: 'cpp', + } const scriptKey = 'encoded_script' useEffect(() => { @@ -17,7 +22,7 @@ const IdeEditor = () => { const [key, scriptBase64] = hash.slice(1).split('=') if (key === scriptKey) { const script = atob(scriptBase64) - dispatch({ type: 'updateCode', payload: script }) + thunkDispatch({ type: 'updateCode', payload: script }) } }, []) useEffect(() => { @@ -27,25 +32,38 @@ const IdeEditor = () => { }, [state.code]) function handleCodeChange(value, _event) { - dispatch({ type: 'updateCode', payload: value }) + thunkDispatch({ type: 'updateCode', payload: value }) } function handleSaveHotkey(event) { //ctrl|meta + s is very intuitive for most devs const { key, ctrlKey, metaKey } = event if (key === 's' && (ctrlKey || metaKey)) { event.preventDefault() - dispatch({ type: 'render', payload: { code: state.code } }) + thunkDispatch((dispatch, getState) => { + const state = getState() + dispatch({ type: 'setLoading' }) + requestRender({ + state, + dispatch, + code: state.code, + viewerSize: state.viewerSize, + camera: state.camera, + }) + }) localStorage.setItem(codeStorageKey, state.code) } } - return ( -
+
. . . loading
}> diff --git a/web/src/components/IdeToolbarNew/IdeToolbarNew.js b/web/src/components/IdeToolbarNew/IdeToolbarNew.js index 4920515..fa10a77 100644 --- a/web/src/components/IdeToolbarNew/IdeToolbarNew.js +++ b/web/src/components/IdeToolbarNew/IdeToolbarNew.js @@ -3,15 +3,26 @@ import IdeContainer from 'src/components/IdeContainer' import { isBrowser } from '@redwoodjs/prerender/browserUtils' import { useIdeState, codeStorageKey } from 'src/helpers/hooks/useIdeState' import { copyTextToClipboard } from 'src/helpers/clipboard' +import { requestRender } from 'src/helpers/hooks/useIdeState' export const IdeContext = createContext() const IdeToolbarNew = () => { - const [state, dispatch] = useIdeState() + const [state, thunkDispatch] = useIdeState() function setIdeType(ide) { - dispatch({ type: 'setIdeType', payload: { message: ide } }) + thunkDispatch({ type: 'setIdeType', payload: { message: ide } }) } function handleRender() { - dispatch({ type: 'render', payload: { code: state.code } }) + thunkDispatch((dispatch, getState) => { + const state = getState() + dispatch({ type: 'setLoading' }) + requestRender({ + state, + dispatch, + code: state.code, + viewerSize: state.viewerSize, + camera: state.camera, + }) + }) localStorage.setItem(codeStorageKey, state.code) } function handleMakeLink() { @@ -23,21 +34,17 @@ const IdeToolbarNew = () => { } return ( - +
)} - {state.isLoading && ( -
-
-
- )} -
setIsDragging(true)} > setIsDragging(true)} - onCameraChange={(camera) => - dispatch({ - type: 'render', - payload: { - code: currentCode, - camera, - }, + onCameraChange={(camera) => { + thunkDispatch({ + type: 'updateCamera', + payload: { camera }, }) - } + thunkDispatch((dispatch, getState) => { + const state = getState() + if (state.ideType === 'openScad') { + dispatch({ type: 'setLoading' }) + requestRender({ + state, + dispatch, + code: state.code, + viewerSize: state.viewerSize, + camera, + }) + } + }) + }} /> - - - - + {state.ideType === 'openScad' && ( + <> + + + + + + )} + {state.ideType === 'cadQuery' && ( + + )}
+ {state.isLoading && ( +
+
+
+ )}
) } diff --git a/web/src/helpers/cadPackages/cadQueryController.js b/web/src/helpers/cadPackages/cadQueryController.js new file mode 100644 index 0000000..b57a7a7 --- /dev/null +++ b/web/src/helpers/cadPackages/cadQueryController.js @@ -0,0 +1,68 @@ +let openScadBaseURL = process.env.CADQUERY_BASE_URL + +export const render = async ({ code }) => { + const body = JSON.stringify({ + settings: {}, + file: code, + }) + try { + const response = await fetch(openScadBaseURL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body, + }) + if (response.status === 400) { + // TODO add proper error messages for CadQuery + const { error } = await response.json() + const cleanedErrorMessage = error.replace( + /["|']\/tmp\/.+\/main.scad["|']/g, + "'main.scad'" + ) + return { + status: 'error', + message: { + type: 'error', + message: addDateToLog(cleanedErrorMessage), + }, + } + } + const data = await response.json() + return { + status: 'healthy', + objectData: { + type: 'stl', + data: data.imageBase64, + }, + message: { + type: 'message', + message: addDateToLog(data.result), + }, + } + } catch (e) { + // TODO handle errors better + // I think we should display something overlayed on the viewer window something like "network issue try again" + // and in future I think we need timeouts differently as they maybe from a user trying to render something too complex + // or something with minkowski in it :/ either way something like "render timed out, try again or here are tips to reduce part complexity" with a link talking about $fn and minkowski etc + return { + status: 'error', + message: { + type: 'error', + message: addDateToLog('network issue'), + }, + } + } +} + +const openScad = { + render, + // more functions to come +} + +export default openScad + +function addDateToLog(message) { + return `-> ${new Date().toLocaleString()} +${message}` +} diff --git a/web/src/helpers/cadPackages/index.js b/web/src/helpers/cadPackages/index.js index ab938ae..19494ad 100644 --- a/web/src/helpers/cadPackages/index.js +++ b/web/src/helpers/cadPackages/index.js @@ -1,7 +1,7 @@ import openScad from './openScadController' -import openCascade from './newCascadeController' +import cadQuery from './cadQueryController' export const cadPackages = { openScad, - openCascade, -} \ No newline at end of file + cadQuery, +} diff --git a/web/src/helpers/cadPackages/newCascadeController.js b/web/src/helpers/cadPackages/newCascadeController.js deleted file mode 100644 index 5367fc3..0000000 --- a/web/src/helpers/cadPackages/newCascadeController.js +++ /dev/null @@ -1,35 +0,0 @@ -// Rename this file to remove "new" once Cascade integration is complete - -export const render = async ({ code, settings }) => { - return new Promise((resolve, reject) => { - setTimeout(() => { - const shouldReject = Math.random() < 0.7 - if (shouldReject) { - resolve({ - objectData: { - type: 'stl', - data: ((Math.random() * 256 + 1) >>> 0).toString(2), // Randomized 8-bit numbers for funzies - }, - message: { - type: 'message', - message: `bodies rendered by: ${code}`, - }, - }) - } else { - reject({ - message: { - type: 'error', - message: 'unable to parse line: x', - }, - }) - } - }, 700) - }) -} - -const openCascade = { - render, - // More functions to come -} - -export default openCascade \ No newline at end of file diff --git a/web/src/helpers/cadPackages/openScadController.js b/web/src/helpers/cadPackages/openScadController.js index 167174b..9672c5d 100644 --- a/web/src/helpers/cadPackages/openScadController.js +++ b/web/src/helpers/cadPackages/openScadController.js @@ -2,33 +2,16 @@ let openScadBaseURL = process.env.OPENSCAD_BASE_URL || 'https://x2wvhihk56.execute-api.us-east-1.amazonaws.com/dev' -let lastViewPortSize = 'INIT' -let lastCameraSettings = 'INIT' - export const render = async ({ code, settings }) => { const pixelRatio = window.devicePixelRatio || 1 - const size = settings.viewerSize - ? { - x: Math.round(settings.viewerSize?.width * pixelRatio), - y: Math.round(settings.viewerSize?.height * pixelRatio), - } - : lastViewPortSize - const camera = settings.camera || lastCameraSettings - if (settings.camera) { - lastCameraSettings = settings.camera - } - if (settings.viewerSize) { - lastViewPortSize = size - } - if ([camera, size].includes('INIT')) { - return { - status: 'insufficient-preview-info', - } + const size = { + x: Math.round(settings.viewerSize?.width * pixelRatio), + y: Math.round(settings.viewerSize?.height * pixelRatio), } const body = JSON.stringify({ settings: { size, - camera, + camera: settings.camera, }, file: code, }) diff --git a/web/src/helpers/hooks/useIdeState.js b/web/src/helpers/hooks/useIdeState.js index a6e123b..971b7ee 100644 --- a/web/src/helpers/hooks/useIdeState.js +++ b/web/src/helpers/hooks/useIdeState.js @@ -1,6 +1,13 @@ import { useReducer } from 'react' import { cadPackages } from 'src/helpers/cadPackages' +function withThunk(dispatch, getState) { + return (actionOrThunk) => + typeof actionOrThunk === 'function' + ? actionOrThunk(dispatch, getState) + : dispatch(actionOrThunk) +} + const donutInitCode = ` color(c="DarkGoldenrod")rotate_extrude()translate([20,0])circle(d=30); donut(); @@ -17,16 +24,17 @@ module stick(basewid, angl){ }` export const codeStorageKey = 'Last-openscad-code' +let mutableState = null export const useIdeState = () => { const code = localStorage.getItem(codeStorageKey) || donutInitCode const initialState = { - ideType: 'openScad', + ideType: 'cadQuery', consoleMessages: [{ type: 'message', message: 'Initialising OpenSCAD' }], code, objectData: { type: 'stl', - data: 'some binary', + data: null, }, layout: { direction: 'row', @@ -38,6 +46,8 @@ export const useIdeState = () => { splitPercentage: 70, }, }, + camera: {}, + viewerSize: { width: 0, height: 0 }, isLoading: false, } const reducer = (state, { type, payload }) => { @@ -74,51 +84,64 @@ export const useIdeState = () => { ...state, layout: payload.message, } + case 'updateCamera': + return { + ...state, + camera: payload.camera, + } + case 'updateViewerSize': + return { + ...state, + viewerSize: payload.viewerSize, + } case 'setLoading': return { ...state, isLoading: true, } + case 'resetLoading': + return { + ...state, + isLoading: false, + } default: return state } } - function dispatchMiddleware(dispatch, state) { - return ({ type, payload }) => { - switch (type) { - case 'render': - cadPackages[state.ideType] - .render({ - code: payload.code, - settings: { - camera: payload.camera, - viewerSize: payload.viewerSize, - }, - }) - .then(({ objectData, message, status }) => { - if (status === 'insufficient-preview-info') return - if (status === 'error') { - dispatch({ - type: 'errorRender', - payload: { message }, - }) - } else { - dispatch({ - type: 'healthyRender', - payload: { objectData, message }, - }) - } - }) - dispatch({ type: 'setLoading' }) - break - - default: - return dispatch({ type, payload }) - } - } - } - const [state, dispatch] = useReducer(reducer, initialState) - return [state, dispatchMiddleware(dispatch, state)] + mutableState = state + const getState = () => mutableState + return [state, withThunk(dispatch, getState)] +} + +export const requestRender = ({ + state, + dispatch, + code, + camera, + viewerSize, +}) => { + cadPackages[state.ideType] + .render({ + code, + settings: { + camera, + viewerSize, + }, + }) + .then(({ objectData, message, status }) => { + if (status === 'error') { + dispatch({ + type: 'errorRender', + payload: { message }, + }) + } else { + dispatch({ + type: 'healthyRender', + payload: { objectData, message }, + }) + } + }) + .catch(() => dispatch({ type: 'resetLoading' })) // TODO should probably display something to the user here } -- 2.39.5 From 7733694032c9b549eef9fa93b0ae0d83a1c88bbc Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Sun, 18 Apr 2021 13:43:44 +1000 Subject: [PATCH 03/14] Initial cadQuery backend POC lost of clean up work still needed. --- .gitignore | 4 +++ api/src/docker/aws-emulator.js | 8 ++++++ api/src/docker/cadquery/Dockerfile | 42 ++++++++++++++++++++++++----- api/src/docker/cadquery/openscad.js | 2 +- api/src/docker/cadquery/runScad.js | 10 +++---- api/src/docker/docker-compose.yml | 6 +++++ 6 files changed, 59 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 3e5e8d1..1110f69 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,7 @@ yarn-error.log # serverless related ignores, see api/src/docker/openscad/Dockerfile for aws-lambda-rie info .serverless aws-lambda-rie + +# docs +docs/.docusaurus +docs/build diff --git a/api/src/docker/aws-emulator.js b/api/src/docker/aws-emulator.js index 4c722e2..510aebb 100644 --- a/api/src/docker/aws-emulator.js +++ b/api/src/docker/aws-emulator.js @@ -17,6 +17,14 @@ app.post('/render', async (req, res) => { res.status(data.statusCode) res.send(data.body) }) +app.post('/cadquery', async (req, res) => { + console.log('making post request to 5060') + const { data } = await axios.post(invocationURL(5060), { + body: Buffer.from(JSON.stringify(req.body)).toString('base64'), + }) + res.status(data.statusCode) + res.send(data.body) +}) app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`) diff --git a/api/src/docker/cadquery/Dockerfile b/api/src/docker/cadquery/Dockerfile index b48c711..f9772ac 100644 --- a/api/src/docker/cadquery/Dockerfile +++ b/api/src/docker/cadquery/Dockerfile @@ -8,7 +8,8 @@ RUN apt-get update -qq RUN apt-get -y -qq install software-properties-common dirmngr apt-transport-https lsb-release ca-certificates xvfb imagemagick unzip inkscape RUN apt-get update -qq # RUN apt-get install -y -qq openscad -RUN apt-get install -y curl +# RUN apt-get install -y curl +RUN apt-get install -y wget RUN apt-get install -y git # install node14, see comment at the to of node14source_setup.sh @@ -40,17 +41,44 @@ RUN npm install # Install Miniconda and CadQuery #RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh -RUN curl -sL "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" > "miniconda.sh" -RUN bash miniconda.sh -b -p $HOME/miniconda -RUN . $HOME/miniconda/bin/activate && conda create -n cadquery && conda activate cadquery && conda install -c conda-forge -c cadquery cadquery=master python=3.8 +# RUN curl -sL "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" > "miniconda.sh" +# RUN bash miniconda.sh -b -p /var/task/miniconda +# # RUN . /var/task/miniconda/bin/activate && conda create -n cadquery && conda activate cadquery && conda install -c conda-forge -c cadquery cadquery=master python=3.8 +# RUN . /var/task/miniconda/bin/activate +# # RUN export PATH="/var/task/miniconda/bin:$PATH" + +# ENV PATH="/var/task/miniconda/bin:${PATH}" +# ARG PATH="/var/task/miniconda/bin:${PATH}" +# RUN conda activate cadquery && conda install -c conda-forge -c cadquery cadquery=master python=3.8 + +ENV PATH="/root/miniconda3/bin:${PATH}" +ARG PATH="/root/miniconda3/bin:${PATH}" +RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \ + && mkdir /root/.conda \ + && bash Miniconda3-latest-Linux-x86_64.sh -b \ + && rm -f Miniconda3-latest-Linux-x86_64.sh \ + && echo "Running $(conda --version)" && \ + conda init bash && \ + . /root/.bashrc && \ + conda update conda && \ + conda create -n cadquery && \ + conda activate cadquery && \ + conda install -c conda-forge -c cadquery cadquery=master python=3.8 && \ + # conda create -n python-app && \ + # conda activate python-app && \ + # conda install python=3.8 pip && \ + git clone https://github.com/CadQuery/cq-cli.git + + + # Grab a copy of cq-cli to convert the provided script -RUN git clone https://github.com/CadQuery/cq-cli.git +# RUN git clone https://github.com/CadQuery/cq-cli.git COPY *.js /var/task/ COPY entrypoint.sh /entrypoint.sh RUN ["chmod", "+x", "/entrypoint.sh"] ENTRYPOINT ["sh", "/entrypoint.sh"] COPY shaft_coupler.py /shaft_coupler.py -RUN . $HOME/miniconda/bin/activate && conda activate cadquery && python cq-cli/cq-cli.py --codec svg --infile /shaft_coupler.py -# CMD [ "openscad.render" ] +# RUN . $HOME/miniconda/bin/activate && conda activate cadquery && python cq-cli/cq-cli.py --codec svg --infile /shaft_coupler.py +CMD [ "openscad.render" ] diff --git a/api/src/docker/cadquery/openscad.js b/api/src/docker/cadquery/openscad.js index 1edb2ef..cb1068f 100644 --- a/api/src/docker/cadquery/openscad.js +++ b/api/src/docker/cadquery/openscad.js @@ -39,7 +39,7 @@ const render = async (req, _context, callback) => { } else { console.log(`got result in route: ${result}, file is: ${tempFile}`) const fs = require('fs') - const image = fs.readFileSync(`/tmp/${tempFile}/output.png`, { + const image = fs.readFileSync(`/tmp/${tempFile}/output.stl`, { encoding: 'base64', }) console.log(image, 'encoded image') diff --git a/api/src/docker/cadquery/runScad.js b/api/src/docker/cadquery/runScad.js index c23e0b6..788e9ef 100644 --- a/api/src/docker/cadquery/runScad.js +++ b/api/src/docker/cadquery/runScad.js @@ -15,10 +15,10 @@ module.exports.runScad = async ({ } = {}, // TODO add view settings } = {}) => { const tempFile = await makeFile(file) - const { x: rx, y: ry, z: rz } = rotation - const { x: px, y: py, z: pz } = position - const cameraArg = `--camera=${px},${py},${pz},${rx},${ry},${rz},${dist}` - const command = `xvfb-run --auto-servernum --server-args "-screen 0 1024x768x24" openscad -o /tmp/${tempFile}/output.png ${cameraArg} --imgsize=${x},${y} --colorscheme DeepOcean /tmp/${tempFile}/main.scad` + // this one worked + // const command = `conda run -n cadquery python ./cq-cli/cq-cli.py --codec svg --infile /tmp/${tempFile}/main.py --outfile /tmp/${tempFile}/output.svg` + + const command = `conda run -n cadquery python ./cq-cli/cq-cli.py --codec stl --infile /tmp/${tempFile}/main.py --outfile /tmp/${tempFile}/output.stl` console.log('command', command) try { @@ -48,7 +48,7 @@ async function makeFile(file) { console.log(`file to write: ${file}`) await runCommand(`mkdir /tmp/${tempFile}`) - await writeFile(`/tmp/${tempFile}/main.scad`, file) + await writeFile(`/tmp/${tempFile}/main.py`, file) return tempFile } diff --git a/api/src/docker/docker-compose.yml b/api/src/docker/docker-compose.yml index c797a3c..11ddbd5 100644 --- a/api/src/docker/docker-compose.yml +++ b/api/src/docker/docker-compose.yml @@ -29,6 +29,12 @@ services: ports: - "5053:8080" + cadquery-render: + build: ./cadquery/. + command: openscad.render + ports: + - 5060:8080 + # networks: # awsland: # name: awsland -- 2.39.5 From 35d5c02f963f51514cde677bd0ae87b0df9c860d Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Sun, 18 Apr 2021 17:46:03 +1000 Subject: [PATCH 04/14] OpenSCAD and CadQuery working together in dev Still clean up of the backend/lamdas, and there's a conda permission issue when deploying the Cadquery image --- api/src/docker/aws-emulator.js | 5 +- .../cadquery/{openscad.js => cadquery.js} | 50 ++----------------- .../docker/cadquery/{runScad.js => runCQ.js} | 16 +----- api/src/docker/docker-compose.yml | 12 ++--- api/src/docker/openscad/openscad.js | 8 +-- api/src/docker/serverless.yml | 46 +++++++++++++---- .../helpers/cadPackages/cadQueryController.js | 4 +- web/src/helpers/cadPackages/common.js | 3 ++ .../helpers/cadPackages/openScadController.js | 6 +-- 9 files changed, 60 insertions(+), 90 deletions(-) rename api/src/docker/cadquery/{openscad.js => cadquery.js} (50%) rename api/src/docker/cadquery/{runScad.js => runCQ.js} (80%) create mode 100644 web/src/helpers/cadPackages/common.js diff --git a/api/src/docker/aws-emulator.js b/api/src/docker/aws-emulator.js index 510aebb..9885cc1 100644 --- a/api/src/docker/aws-emulator.js +++ b/api/src/docker/aws-emulator.js @@ -1,7 +1,6 @@ const express = require('express') var cors = require('cors') const axios = require('axios') -const stream = require('stream') const app = express() const port = 8080 app.use(express.json()) @@ -10,14 +9,14 @@ app.use(cors()) const invocationURL = (port) => `http://localhost:${port}/2015-03-31/functions/function/invocations` -app.post('/render', async (req, res) => { +app.post('/openscad/preview', async (req, res) => { const { data } = await axios.post(invocationURL(5052), { body: Buffer.from(JSON.stringify(req.body)).toString('base64'), }) res.status(data.statusCode) res.send(data.body) }) -app.post('/cadquery', async (req, res) => { +app.post('/cadquery/stl', async (req, res) => { console.log('making post request to 5060') const { data } = await axios.post(invocationURL(5060), { body: Buffer.from(JSON.stringify(req.body)).toString('base64'), diff --git a/api/src/docker/cadquery/openscad.js b/api/src/docker/cadquery/cadquery.js similarity index 50% rename from api/src/docker/cadquery/openscad.js rename to api/src/docker/cadquery/cadquery.js index cb1068f..e5f65fd 100644 --- a/api/src/docker/cadquery/openscad.js +++ b/api/src/docker/cadquery/cadquery.js @@ -1,15 +1,7 @@ -const { runScad, stlExport } = require('./runScad') +const { runCQ } = require('./runCQ') const middy = require('middy') const { cors } = require('middy/middlewares') -const health = async () => { - console.log('Health endpoint') - return { - statusCode: 200, - body: 'ok', - } -} - // cors true does not seem to work in serverless.yml, perhaps docker lambdas aren't covered by that config // special lambda just for responding to options requests const preflightOptions = (req, _context, callback) => { @@ -24,12 +16,12 @@ const preflightOptions = (req, _context, callback) => { callback(null, response) } -const render = async (req, _context, callback) => { +const stl = async (req, _context, callback) => { _context.callbackWaitsForEmptyEventLoop = false const eventBody = Buffer.from(req.body, 'base64').toString('ascii') console.log(eventBody, 'eventBody') const { file, settings } = JSON.parse(eventBody) - const { error, result, tempFile } = await runScad({ file, settings }) + const { error, result, tempFile } = await runCQ({ file, settings }) if (error) { const response = { statusCode: 400, @@ -55,41 +47,7 @@ const render = async (req, _context, callback) => { } } -const exportstl = async (req, _context, callback) => { - _context.callbackWaitsForEmptyEventLoop = false - const eventBody = Buffer.from(req.body, 'base64').toString('ascii') - console.log(eventBody, 'eventBody') - const { file } = JSON.parse(eventBody) - const { error, result, tempFile } = await stlExport({ file }) - if (error) { - const response = { - statusCode: 400, - body: { error, tempFile }, - } - callback(null, response) - } else { - console.log(`got result in route: ${result}, file is: ${tempFile}`) - const fs = require('fs') - const stl = fs.readFileSync(`/tmp/${tempFile}/output.stl`, { - encoding: 'base64', - }) - console.log('encoded stl', stl) - const response = { - statusCode: 200, - headers: { - 'content-type': 'application/stl', - }, - body: stl, - isBase64Encoded: true, - } - console.log('callback fired') - callback(null, response) - } -} - module.exports = { - health: middy(health).use(cors()), - exportstl: middy(exportstl).use(cors()), - render: middy(render).use(cors()), + stl: middy(stl).use(cors()), preflightOptions, } diff --git a/api/src/docker/cadquery/runScad.js b/api/src/docker/cadquery/runCQ.js similarity index 80% rename from api/src/docker/cadquery/runScad.js rename to api/src/docker/cadquery/runCQ.js index 788e9ef..ffd5ab2 100644 --- a/api/src/docker/cadquery/runScad.js +++ b/api/src/docker/cadquery/runCQ.js @@ -3,7 +3,7 @@ const { promises } = require('fs') const { writeFile } = promises const { nanoid } = require('nanoid') -module.exports.runScad = async ({ +module.exports.runCQ = async ({ file, settings: { size: { x = 500, y = 500 } = {}, @@ -29,20 +29,6 @@ module.exports.runScad = async ({ } } -module.exports.stlExport = async ({ file } = {}) => { - const tempFile = await makeFile(file) - - try { - const result = await runCommand( - `openscad -o /tmp/${tempFile}/output.stl /tmp/${tempFile}/main.scad`, - 300000 // lambda will time out before this, we might need to look at background jobs if we do git integration stl generation - ) - return { result, tempFile } - } catch (error) { - return { error, tempFile } - } -} - async function makeFile(file) { const tempFile = 'a' + nanoid() // 'a' ensure nothing funny happens if it start with a bad character like "-", maybe I should pick a safer id generator :shrug: console.log(`file to write: ${file}`) diff --git a/api/src/docker/docker-compose.yml b/api/src/docker/docker-compose.yml index 11ddbd5..5602f41 100644 --- a/api/src/docker/docker-compose.yml +++ b/api/src/docker/docker-compose.yml @@ -13,25 +13,25 @@ services: ports: - "5051:8080" - openscad-render: + openscad-preview: image: openscad # build: ./openscad/. - command: openscad.render + command: openscad.preview # networks: # - awsland ports: - "5052:8080" - openscad-export: + openscad-stl: image: openscad # build: ./openscad/. - command: openscad.exportstl + command: openscad.stl ports: - "5053:8080" - cadquery-render: + cadquery-stl: build: ./cadquery/. - command: openscad.render + command: cadquery.stl ports: - 5060:8080 diff --git a/api/src/docker/openscad/openscad.js b/api/src/docker/openscad/openscad.js index 1edb2ef..980b9ad 100644 --- a/api/src/docker/openscad/openscad.js +++ b/api/src/docker/openscad/openscad.js @@ -24,7 +24,7 @@ const preflightOptions = (req, _context, callback) => { callback(null, response) } -const render = async (req, _context, callback) => { +const preview = async (req, _context, callback) => { _context.callbackWaitsForEmptyEventLoop = false const eventBody = Buffer.from(req.body, 'base64').toString('ascii') console.log(eventBody, 'eventBody') @@ -55,7 +55,7 @@ const render = async (req, _context, callback) => { } } -const exportstl = async (req, _context, callback) => { +const stl = async (req, _context, callback) => { _context.callbackWaitsForEmptyEventLoop = false const eventBody = Buffer.from(req.body, 'base64').toString('ascii') console.log(eventBody, 'eventBody') @@ -89,7 +89,7 @@ const exportstl = async (req, _context, callback) => { module.exports = { health: middy(health).use(cors()), - exportstl: middy(exportstl).use(cors()), - render: middy(render).use(cors()), + stl: middy(stl).use(cors()), + preview: middy(preview).use(cors()), preflightOptions, } diff --git a/api/src/docker/serverless.yml b/api/src/docker/serverless.yml index 62892d0..821e9fb 100644 --- a/api/src/docker/serverless.yml +++ b/api/src/docker/serverless.yml @@ -18,6 +18,8 @@ provider: # this image is built locally and push to ECR openscadimage: path: ./openscad/ + cadqueryimage: + path: ./cadquery/ apiGateway: metrics: true binaryMediaTypes: @@ -52,7 +54,7 @@ provider: functions: # see preflightoptions comment in openscad.js - preflightrender: + preflightopenscadpreview: image: name: openscadimage command: @@ -61,9 +63,9 @@ functions: - '/entrypoint.sh' events: - http: - path: render + path: openscad/preview method: options - preflightexport: + preflightopenscadstl: image: name: openscadimage command: @@ -72,30 +74,54 @@ functions: - '/entrypoint.sh' events: - http: - path: export + path: openscad/stl method: options - render: + openscadpreview: image: name: openscadimage command: - - openscad.render + - openscad.preview entryPoint: - '/entrypoint.sh' events: - http: - path: render + path: openscad/preview method: post timeout: 15 - exportStl: + openscadstl: image: name: openscadimage command: - - openscad.exportstl + - openscad.stl entryPoint: - '/entrypoint.sh' events: - http: - path: export + path: openscad/stl + method: post + timeout: 30 + + preflightcadquerystl: + image: + name: cadqueryimage + command: + - cadquery.preflightOptions + entryPoint: + - '/entrypoint.sh' + events: + - http: + path: cadquery/stl + method: options + cadquerystl: + image: + name: cadqueryimage + command: + - cadquery.stl + entryPoint: + - '/entrypoint.sh' + events: + - http: + path: cadquery/stl method: post timeout: 30 # The following are a few example events you can configure diff --git a/web/src/helpers/cadPackages/cadQueryController.js b/web/src/helpers/cadPackages/cadQueryController.js index b57a7a7..743448d 100644 --- a/web/src/helpers/cadPackages/cadQueryController.js +++ b/web/src/helpers/cadPackages/cadQueryController.js @@ -1,4 +1,4 @@ -let openScadBaseURL = process.env.CADQUERY_BASE_URL +import { lambdaBaseURL } from './common' export const render = async ({ code }) => { const body = JSON.stringify({ @@ -6,7 +6,7 @@ export const render = async ({ code }) => { file: code, }) try { - const response = await fetch(openScadBaseURL, { + const response = await fetch(lambdaBaseURL + '/cadquery/stl', { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/web/src/helpers/cadPackages/common.js b/web/src/helpers/cadPackages/common.js new file mode 100644 index 0000000..7b14c0f --- /dev/null +++ b/web/src/helpers/cadPackages/common.js @@ -0,0 +1,3 @@ +export const lambdaBaseURL = + process.env.CAD_LAMBDA_BASE_URL || + 'https://t7wdlz8ztf.execute-api.us-east-1.amazonaws.com/dev2' diff --git a/web/src/helpers/cadPackages/openScadController.js b/web/src/helpers/cadPackages/openScadController.js index 9672c5d..570752c 100644 --- a/web/src/helpers/cadPackages/openScadController.js +++ b/web/src/helpers/cadPackages/openScadController.js @@ -1,6 +1,4 @@ -let openScadBaseURL = - process.env.OPENSCAD_BASE_URL || - 'https://x2wvhihk56.execute-api.us-east-1.amazonaws.com/dev' +import { lambdaBaseURL } from './common' export const render = async ({ code, settings }) => { const pixelRatio = window.devicePixelRatio || 1 @@ -16,7 +14,7 @@ export const render = async ({ code, settings }) => { file: code, }) try { - const response = await fetch(openScadBaseURL + '/render', { + const response = await fetch(lambdaBaseURL + '/openscad/preview', { method: 'POST', headers: { 'Content-Type': 'application/json', -- 2.39.5 From 9cf02980cc248f693829076582a3213564b47128 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Fri, 23 Apr 2021 07:41:55 +1000 Subject: [PATCH 05/14] Use release package instead to avoid conda permission issues conda permission issue would arise only when deployed. Side stepped this issue by using the release package instead. Also cleaned up the docker file. Still need to remove duplication between openscad and cadquery apis --- api/src/docker/cadquery/Dockerfile | 60 +++++------------------- api/src/docker/cadquery/runCQ.js | 19 ++------ api/src/docker/cadquery/shaft_coupler.py | 13 ----- api/src/docker/openscad/runScad.js | 2 +- 4 files changed, 16 insertions(+), 78 deletions(-) delete mode 100644 api/src/docker/cadquery/shaft_coupler.py diff --git a/api/src/docker/cadquery/Dockerfile b/api/src/docker/cadquery/Dockerfile index f9772ac..d2735a4 100644 --- a/api/src/docker/cadquery/Dockerfile +++ b/api/src/docker/cadquery/Dockerfile @@ -2,15 +2,10 @@ FROM public.ecr.aws/lts/ubuntu:20.04_stable ARG DEBIAN_FRONTEND=noninteractive -## install things needed to run openscad (xvfb is an important one) RUN apt-get update -qq -# double check this below, I'm not sure we need inkscape etc -RUN apt-get -y -qq install software-properties-common dirmngr apt-transport-https lsb-release ca-certificates xvfb imagemagick unzip inkscape +RUN apt-get -y -qq install software-properties-common dirmngr apt-transport-https lsb-release ca-certificates xvfb RUN apt-get update -qq -# RUN apt-get install -y -qq openscad -# RUN apt-get install -y curl RUN apt-get install -y wget -RUN apt-get install -y git # install node14, see comment at the to of node14source_setup.sh ADD node14source_setup.sh /nodesource_setup.sh @@ -20,13 +15,13 @@ RUN apt-get install -y nodejs # Install aws-lambda-cpp build dependencies, this is for the post install script in aws-lambda-ric (in package.json) RUN apt-get update && \ - apt-get install -y \ - g++ \ - make \ - cmake \ - unzip \ - automake autoconf libtool \ - libcurl4-openssl-dev + apt-get install -y \ + g++ \ + make \ + cmake \ + unzip \ + automake autoconf libtool \ + libcurl4-openssl-dev # Add the lambda emulator for local dev, (see entrypoint.sh for where it's used), # I have the file locally (gitignored) to speed up build times (as it downloads everytime), @@ -39,46 +34,15 @@ WORKDIR /var/task/ COPY package*.json /var/task/ RUN npm install -# Install Miniconda and CadQuery -#RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh -# RUN curl -sL "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" > "miniconda.sh" -# RUN bash miniconda.sh -b -p /var/task/miniconda -# # RUN . /var/task/miniconda/bin/activate && conda create -n cadquery && conda activate cadquery && conda install -c conda-forge -c cadquery cadquery=master python=3.8 -# RUN . /var/task/miniconda/bin/activate -# # RUN export PATH="/var/task/miniconda/bin:$PATH" -# ENV PATH="/var/task/miniconda/bin:${PATH}" -# ARG PATH="/var/task/miniconda/bin:${PATH}" -# RUN conda activate cadquery && conda install -c conda-forge -c cadquery cadquery=master python=3.8 +# Get the distribution copy of cq-cli +RUN wget https://github.com/CadQuery/cq-cli/releases/download/v2.1.0/cq-cli-Linux-x86_64.zip +RUN unzip cq-cli-Linux-x86_64.zip -ENV PATH="/root/miniconda3/bin:${PATH}" -ARG PATH="/root/miniconda3/bin:${PATH}" -RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \ - && mkdir /root/.conda \ - && bash Miniconda3-latest-Linux-x86_64.sh -b \ - && rm -f Miniconda3-latest-Linux-x86_64.sh \ - && echo "Running $(conda --version)" && \ - conda init bash && \ - . /root/.bashrc && \ - conda update conda && \ - conda create -n cadquery && \ - conda activate cadquery && \ - conda install -c conda-forge -c cadquery cadquery=master python=3.8 && \ - # conda create -n python-app && \ - # conda activate python-app && \ - # conda install python=3.8 pip && \ - git clone https://github.com/CadQuery/cq-cli.git - - - - -# Grab a copy of cq-cli to convert the provided script -# RUN git clone https://github.com/CadQuery/cq-cli.git +RUN chmod +x cq-cli/cq-cli COPY *.js /var/task/ COPY entrypoint.sh /entrypoint.sh RUN ["chmod", "+x", "/entrypoint.sh"] ENTRYPOINT ["sh", "/entrypoint.sh"] -COPY shaft_coupler.py /shaft_coupler.py -# RUN . $HOME/miniconda/bin/activate && conda activate cadquery && python cq-cli/cq-cli.py --codec svg --infile /shaft_coupler.py CMD [ "openscad.render" ] diff --git a/api/src/docker/cadquery/runCQ.js b/api/src/docker/cadquery/runCQ.js index ffd5ab2..d0a2941 100644 --- a/api/src/docker/cadquery/runCQ.js +++ b/api/src/docker/cadquery/runCQ.js @@ -3,26 +3,13 @@ const { promises } = require('fs') const { writeFile } = promises const { nanoid } = require('nanoid') -module.exports.runCQ = async ({ - file, - settings: { - size: { x = 500, y = 500 } = {}, - camera: { - position = { x: 40, y: 40, z: 40 }, - rotation = { x: 55, y: 0, z: 25 }, - dist = 200, - } = {}, - } = {}, // TODO add view settings -} = {}) => { +module.exports.runCQ = async ({ file, settings = {} } = {}) => { const tempFile = await makeFile(file) - // this one worked - // const command = `conda run -n cadquery python ./cq-cli/cq-cli.py --codec svg --infile /tmp/${tempFile}/main.py --outfile /tmp/${tempFile}/output.svg` - - const command = `conda run -n cadquery python ./cq-cli/cq-cli.py --codec stl --infile /tmp/${tempFile}/main.py --outfile /tmp/${tempFile}/output.stl` + const command = `cq-cli/cq-cli --codec stl --infile /tmp/${tempFile}/main.py --outfile /tmp/${tempFile}/output.stl` console.log('command', command) try { - const result = await runCommand(command, 10000) + const result = await runCommand(command, 30000) return { result, tempFile } } catch (error) { return { error, tempFile } diff --git a/api/src/docker/cadquery/shaft_coupler.py b/api/src/docker/cadquery/shaft_coupler.py deleted file mode 100644 index 467fbf7..0000000 --- a/api/src/docker/cadquery/shaft_coupler.py +++ /dev/null @@ -1,13 +0,0 @@ -import cadquery as cq -from cadquery import exporters - -diam = 5.0 - -result = (cq.Workplane().circle(diam).extrude(20.0) - .faces(">Z").workplane(invert=True).circle(1.05).cutBlind(8.0) - .faces(" Date: Fri, 23 Apr 2021 16:24:51 +1000 Subject: [PATCH 06/14] Get cadquery and openscad working with more reuse on the backend --- api/src/docker/cadquery/Dockerfile | 15 +- api/src/docker/cadquery/runCQ.js | 39 +- .../docker/{cadquery => common}/entrypoint.sh | 0 .../node14source_setup.sh | 0 api/src/docker/common/utils.js | 41 ++ api/src/docker/docker-compose.yml | 8 +- api/src/docker/openscad/Dockerfile | 11 +- api/src/docker/openscad/entrypoint.sh | 6 - api/src/docker/openscad/node14source_setup.sh | 349 ------------------ api/src/docker/openscad/runScad.js | 41 +- 10 files changed, 66 insertions(+), 444 deletions(-) rename api/src/docker/{cadquery => common}/entrypoint.sh (100%) rename api/src/docker/{cadquery => common}/node14source_setup.sh (100%) create mode 100644 api/src/docker/common/utils.js delete mode 100644 api/src/docker/openscad/entrypoint.sh delete mode 100644 api/src/docker/openscad/node14source_setup.sh diff --git a/api/src/docker/cadquery/Dockerfile b/api/src/docker/cadquery/Dockerfile index d2735a4..d44bb13 100644 --- a/api/src/docker/cadquery/Dockerfile +++ b/api/src/docker/cadquery/Dockerfile @@ -8,7 +8,7 @@ RUN apt-get update -qq RUN apt-get install -y wget # install node14, see comment at the to of node14source_setup.sh -ADD node14source_setup.sh /nodesource_setup.sh +ADD common/node14source_setup.sh /nodesource_setup.sh RUN ["chmod", "+x", "/nodesource_setup.sh"] RUN bash nodesource_setup.sh RUN apt-get install -y nodejs @@ -26,12 +26,12 @@ RUN apt-get update && \ # Add the lambda emulator for local dev, (see entrypoint.sh for where it's used), # I have the file locally (gitignored) to speed up build times (as it downloads everytime), # but you can use the http version of the below ADD command or download it yourself from that url. -# ADD aws-lambda-rie /usr/local/bin/aws-lambda-rie -ADD https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/download/v1.0/aws-lambda-rie /usr/local/bin/aws-lambda-rie +ADD common/aws-lambda-rie /usr/local/bin/aws-lambda-rie +# ADD https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/download/v1.0/aws-lambda-rie /usr/local/bin/aws-lambda-rie RUN ["chmod", "+x", "/usr/local/bin/aws-lambda-rie"] WORKDIR /var/task/ -COPY package*.json /var/task/ +COPY cadquery/package*.json /var/task/ RUN npm install @@ -41,8 +41,9 @@ RUN unzip cq-cli-Linux-x86_64.zip RUN chmod +x cq-cli/cq-cli -COPY *.js /var/task/ -COPY entrypoint.sh /entrypoint.sh +COPY cadquery/*.js /var/task/ +COPY common/*.js /var/common/ +COPY common/entrypoint.sh /entrypoint.sh RUN ["chmod", "+x", "/entrypoint.sh"] ENTRYPOINT ["sh", "/entrypoint.sh"] -CMD [ "openscad.render" ] +CMD [ "cadquery.stl" ] diff --git a/api/src/docker/cadquery/runCQ.js b/api/src/docker/cadquery/runCQ.js index d0a2941..8b85930 100644 --- a/api/src/docker/cadquery/runCQ.js +++ b/api/src/docker/cadquery/runCQ.js @@ -1,10 +1,8 @@ -const { exec } = require('child_process') -const { promises } = require('fs') -const { writeFile } = promises +const { makeFile, runCommand } = require('../common/utils') const { nanoid } = require('nanoid') module.exports.runCQ = async ({ file, settings = {} } = {}) => { - const tempFile = await makeFile(file) + const tempFile = await makeFile(file, '.py', nanoid) const command = `cq-cli/cq-cli --codec stl --infile /tmp/${tempFile}/main.py --outfile /tmp/${tempFile}/output.stl` console.log('command', command) @@ -15,36 +13,3 @@ module.exports.runCQ = async ({ file, settings = {} } = {}) => { return { error, tempFile } } } - -async function makeFile(file) { - const tempFile = 'a' + nanoid() // 'a' ensure nothing funny happens if it start with a bad character like "-", maybe I should pick a safer id generator :shrug: - console.log(`file to write: ${file}`) - - await runCommand(`mkdir /tmp/${tempFile}`) - await writeFile(`/tmp/${tempFile}/main.py`, file) - return tempFile -} - -async function runCommand(command, timeout = 5000) { - return new Promise((resolve, reject) => { - exec(command, (error, stdout, stderr) => { - if (error) { - console.log(`error: ${error.message}`) - console.log(`stderr: ${stderr}`) - console.log(`stdout: ${stdout}`) - reject(stdout || stderr) // it seems random if the message is in stdout or stderr, but not normally both - return - } - if (stderr) { - console.log(`stderr: ${stderr}`) - resolve(stderr) - return - } - console.log(`stdout: ${stdout}`) - resolve(stdout) - }) - setTimeout(() => { - reject('timeout') - }, timeout) - }) -} diff --git a/api/src/docker/cadquery/entrypoint.sh b/api/src/docker/common/entrypoint.sh similarity index 100% rename from api/src/docker/cadquery/entrypoint.sh rename to api/src/docker/common/entrypoint.sh diff --git a/api/src/docker/cadquery/node14source_setup.sh b/api/src/docker/common/node14source_setup.sh similarity index 100% rename from api/src/docker/cadquery/node14source_setup.sh rename to api/src/docker/common/node14source_setup.sh diff --git a/api/src/docker/common/utils.js b/api/src/docker/common/utils.js new file mode 100644 index 0000000..80f0539 --- /dev/null +++ b/api/src/docker/common/utils.js @@ -0,0 +1,41 @@ +const { exec } = require('child_process') +const { promises } = require('fs') +const { writeFile } = promises + +async function makeFile(file, extension = '.scad', makeHash) { + const tempFile = 'a' + makeHash() // 'a' ensure nothing funny happens if it start with a bad character like "-", maybe I should pick a safer id generator :shrug: + console.log(`file to write: ${file}`) + + await runCommand(`mkdir /tmp/${tempFile}`) + await writeFile(`/tmp/${tempFile}/main${extension}`, file) + return tempFile +} + +async function runCommand(command, timeout = 5000) { + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + console.log(`error: ${error.message}`) + console.log(`stderr: ${stderr}`) + console.log(`stdout: ${stdout}`) + reject(stdout || stderr) // it seems random if the message is in stdout or stderr, but not normally both + return + } + if (stderr) { + console.log(`stderr: ${stderr}`) + resolve(stderr) + return + } + console.log(`stdout: ${stdout}`) + resolve(stdout) + }) + setTimeout(() => { + reject('timeout') + }, timeout) + }) +} + +module.exports = { + runCommand, + makeFile, +} diff --git a/api/src/docker/docker-compose.yml b/api/src/docker/docker-compose.yml index 5602f41..0cad72e 100644 --- a/api/src/docker/docker-compose.yml +++ b/api/src/docker/docker-compose.yml @@ -7,7 +7,9 @@ services: # - "5050:8080" openscad-health: - build: ./openscad/. + build: + context: ./ + dockerfile: ./openscad/. image: openscad command: openscad.health ports: @@ -30,7 +32,9 @@ services: - "5053:8080" cadquery-stl: - build: ./cadquery/. + build: + context: ./ + dockerfile: ./cadquery/. command: cadquery.stl ports: - 5060:8080 diff --git a/api/src/docker/openscad/Dockerfile b/api/src/docker/openscad/Dockerfile index e9b685e..27412cc 100644 --- a/api/src/docker/openscad/Dockerfile +++ b/api/src/docker/openscad/Dockerfile @@ -11,7 +11,7 @@ RUN apt-get install -y -qq openscad RUN apt-get install -y curl # install node14, see comment at the to of node14source_setup.sh -ADD node14source_setup.sh /nodesource_setup.sh +ADD common/node14source_setup.sh /nodesource_setup.sh RUN ["chmod", "+x", "/nodesource_setup.sh"] RUN bash nodesource_setup.sh RUN apt-get install -y nodejs @@ -29,16 +29,17 @@ RUN apt-get update && \ # Add the lambda emulator for local dev, (see entrypoint.sh for where it's used), # I have the file locally (gitignored) to speed up build times (as it downloads everytime), # but you can use the http version of the below ADD command or download it yourself from that url. -ADD aws-lambda-rie /usr/local/bin/aws-lambda-rie +ADD common/aws-lambda-rie /usr/local/bin/aws-lambda-rie # ADD https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/download/v1.0/aws-lambda-rie /usr/local/bin/aws-lambda-rie RUN ["chmod", "+x", "/usr/local/bin/aws-lambda-rie"] WORKDIR /var/task/ -COPY package*.json /var/task/ +COPY openscad/package*.json /var/task/ RUN npm install -COPY *.js /var/task/ -COPY entrypoint.sh /entrypoint.sh +COPY openscad/*.js /var/task/ +COPY common/*.js /var/common/ +COPY common/entrypoint.sh /entrypoint.sh RUN ["chmod", "+x", "/entrypoint.sh"] ENTRYPOINT ["sh", "/entrypoint.sh"] diff --git a/api/src/docker/openscad/entrypoint.sh b/api/src/docker/openscad/entrypoint.sh deleted file mode 100644 index 53643f2..0000000 --- a/api/src/docker/openscad/entrypoint.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then - /usr/local/bin/aws-lambda-rie /usr/bin/npx aws-lambda-ric $1 -else - /usr/bin/npx aws-lambda-ric $1 -fi diff --git a/api/src/docker/openscad/node14source_setup.sh b/api/src/docker/openscad/node14source_setup.sh deleted file mode 100644 index 16a777d..0000000 --- a/api/src/docker/openscad/node14source_setup.sh +++ /dev/null @@ -1,349 +0,0 @@ -#!/bin/bash - -# CADHUB COMMENT -# This was fetch on the fly in the dockerfile "RUN curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh" -# Because we rely on the bash script to install node 14 it make sense to have it in version control -# incase it disapears, plus will speed up build time a little. -# If we upgrade node versions for the lambdas we replace this file - -# Discussion, issues and change requests at: -# https://github.com/nodesource/distributions -# -# Script to install the NodeSource Node.js 14.x repo onto a -# Debian or Ubuntu system. -# -# Run as root or insert `sudo -E` before `bash`: -# -# curl -sL https://deb.nodesource.com/setup_14.x | bash - -# or -# wget -qO- https://deb.nodesource.com/setup_14.x | bash - -# -# CONTRIBUTIONS TO THIS SCRIPT -# -# This script is built from a template in -# https://github.com/nodesource/distributions/tree/master/deb/src -# please don't submit pull requests against the built scripts. -# - - -export DEBIAN_FRONTEND=noninteractive -SCRSUFFIX="_14.x" -NODENAME="Node.js 14.x" -NODEREPO="node_14.x" -NODEPKG="nodejs" - -print_status() { - echo - echo "## $1" - echo -} - -if test -t 1; then # if terminal - ncolors=$(which tput > /dev/null && tput colors) # supports color - if test -n "$ncolors" && test $ncolors -ge 8; then - termcols=$(tput cols) - bold="$(tput bold)" - underline="$(tput smul)" - standout="$(tput smso)" - normal="$(tput sgr0)" - black="$(tput setaf 0)" - red="$(tput setaf 1)" - green="$(tput setaf 2)" - yellow="$(tput setaf 3)" - blue="$(tput setaf 4)" - magenta="$(tput setaf 5)" - cyan="$(tput setaf 6)" - white="$(tput setaf 7)" - fi -fi - -print_bold() { - title="$1" - text="$2" - - echo - echo "${red}================================================================================${normal}" - echo "${red}================================================================================${normal}" - echo - echo -e " ${bold}${yellow}${title}${normal}" - echo - echo -en " ${text}" - echo - echo "${red}================================================================================${normal}" - echo "${red}================================================================================${normal}" -} - -bail() { - echo 'Error executing command, exiting' - exit 1 -} - -exec_cmd_nobail() { - echo "+ $1" - bash -c "$1" -} - -exec_cmd() { - exec_cmd_nobail "$1" || bail -} - -node_deprecation_warning() { - if [[ "X${NODENAME}" == "Xio.js 1.x" || - "X${NODENAME}" == "Xio.js 2.x" || - "X${NODENAME}" == "Xio.js 3.x" || - "X${NODENAME}" == "XNode.js 0.10" || - "X${NODENAME}" == "XNode.js 0.12" || - "X${NODENAME}" == "XNode.js 4.x LTS Argon" || - "X${NODENAME}" == "XNode.js 5.x" || - "X${NODENAME}" == "XNode.js 6.x LTS Boron" || - "X${NODENAME}" == "XNode.js 7.x" || - "X${NODENAME}" == "XNode.js 8.x LTS Carbon" || - "X${NODENAME}" == "XNode.js 9.x" || - "X${NODENAME}" == "XNode.js 11.x" || - "X${NODENAME}" == "XNode.js 13.x" ]]; then - - print_bold \ -" DEPRECATION WARNING " "\ -${bold}${NODENAME} is no longer actively supported!${normal} - - ${bold}You will not receive security or critical stability updates${normal} for this version. - - You should migrate to a supported version of Node.js as soon as possible. - Use the installation script that corresponds to the version of Node.js you - wish to install. e.g. - - * ${green}https://deb.nodesource.com/setup_10.x — Node.js 10 LTS \"Dubnium\"${normal} - * ${green}https://deb.nodesource.com/setup_12.x — Node.js 12 LTS \"Erbium\"${normal} (recommended) - * ${green}https://deb.nodesource.com/setup_14.x — Node.js 14 LTS \"Fermium\"${normal} - * ${green}https://deb.nodesource.com/setup_15.x — Node.js 15 \"Fifteen\"${normal} - - Please see ${bold}https://github.com/nodejs/Release${normal} for details about which - version may be appropriate for you. - - The ${bold}NodeSource${normal} Node.js distributions repository contains - information both about supported versions of Node.js and supported Linux - distributions. To learn more about usage, see the repository: - ${bold}https://github.com/nodesource/distributions${normal} -" - echo - echo "Continuing in 20 seconds ..." - echo - sleep 20 - fi -} - -script_deprecation_warning() { - if [ "X${SCRSUFFIX}" == "X" ]; then - print_bold \ -" SCRIPT DEPRECATION WARNING " "\ -This script, located at ${bold}https://deb.nodesource.com/setup${normal}, used to - install Node.js 0.10, is deprecated and will eventually be made inactive. - - You should use the script that corresponds to the version of Node.js you - wish to install. e.g. - - * ${green}https://deb.nodesource.com/setup_10.x — Node.js 10 LTS \"Dubnium\"${normal} - * ${green}https://deb.nodesource.com/setup_12.x — Node.js 12 LTS \"Erbium\"${normal} (recommended) - * ${green}https://deb.nodesource.com/setup_14.x — Node.js 14 LTS \"Fermium\"${normal} - * ${green}https://deb.nodesource.com/setup_15.x — Node.js 15 \"Fifteen\"${normal} - Please see ${bold}https://github.com/nodejs/Release${normal} for details about which - version may be appropriate for you. - - The ${bold}NodeSource${normal} Node.js Linux distributions GitHub repository contains - information about which versions of Node.js and which Linux distributions - are supported and how to use the install scripts. - ${bold}https://github.com/nodesource/distributions${normal} -" - - echo - echo "Continuing in 20 seconds (press Ctrl-C to abort) ..." - echo - sleep 20 - fi -} - -setup() { - -script_deprecation_warning -node_deprecation_warning - -print_status "Installing the NodeSource ${NODENAME} repo..." - -if $(uname -m | grep -Eq ^armv6); then - print_status "You appear to be running on ARMv6 hardware. Unfortunately this is not currently supported by the NodeSource Linux distributions. Please use the 'linux-armv6l' binary tarballs available directly from nodejs.org for Node.js 4 and later." - exit 1 -fi - -PRE_INSTALL_PKGS="" - -# Check that HTTPS transport is available to APT -# (Check snaked from: https://get.docker.io/ubuntu/) - -if [ ! -e /usr/lib/apt/methods/https ]; then - PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} apt-transport-https" -fi - -if [ ! -x /usr/bin/lsb_release ]; then - PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} lsb-release" -fi - -if [ ! -x /usr/bin/curl ] && [ ! -x /usr/bin/wget ]; then - PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} curl" -fi - -# Used by apt-key to add new keys - -if [ ! -x /usr/bin/gpg ]; then - PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} gnupg" -fi - -# Populating Cache -print_status "Populating apt-get cache..." -exec_cmd 'apt-get update' - -if [ "X${PRE_INSTALL_PKGS}" != "X" ]; then - print_status "Installing packages required for setup:${PRE_INSTALL_PKGS}..." - # This next command needs to be redirected to /dev/null or the script will bork - # in some environments - exec_cmd "apt-get install -y${PRE_INSTALL_PKGS} > /dev/null 2>&1" -fi - -IS_PRERELEASE=$(lsb_release -d | grep 'Ubuntu .*development' >& /dev/null; echo $?) -if [[ $IS_PRERELEASE -eq 0 ]]; then - print_status "Your distribution, identified as \"$(lsb_release -d -s)\", is a pre-release version of Ubuntu. NodeSource does not maintain official support for Ubuntu versions until they are formally released. You can try using the manual installation instructions available at https://github.com/nodesource/distributions and use the latest supported Ubuntu version name as the distribution identifier, although this is not guaranteed to work." - exit 1 -fi - -DISTRO=$(lsb_release -c -s) - -check_alt() { - if [ "X${DISTRO}" == "X${2}" ]; then - echo - echo "## You seem to be using ${1} version ${DISTRO}." - echo "## This maps to ${3} \"${4}\"... Adjusting for you..." - DISTRO="${4}" - fi -} - -check_alt "SolydXK" "solydxk-9" "Debian" "stretch" -check_alt "Kali" "sana" "Debian" "jessie" -check_alt "Kali" "kali-rolling" "Debian" "bullseye" -check_alt "Sparky Linux" "Tyche" "Debian" "stretch" -check_alt "Sparky Linux" "Nibiru" "Debian" "buster" -check_alt "MX Linux 17" "Horizon" "Debian" "stretch" -check_alt "MX Linux 18" "Continuum" "Debian" "stretch" -check_alt "MX Linux 19" "patito feo" "Debian" "buster" -check_alt "Linux Mint" "maya" "Ubuntu" "precise" -check_alt "Linux Mint" "qiana" "Ubuntu" "trusty" -check_alt "Linux Mint" "rafaela" "Ubuntu" "trusty" -check_alt "Linux Mint" "rebecca" "Ubuntu" "trusty" -check_alt "Linux Mint" "rosa" "Ubuntu" "trusty" -check_alt "Linux Mint" "sarah" "Ubuntu" "xenial" -check_alt "Linux Mint" "serena" "Ubuntu" "xenial" -check_alt "Linux Mint" "sonya" "Ubuntu" "xenial" -check_alt "Linux Mint" "sylvia" "Ubuntu" "xenial" -check_alt "Linux Mint" "tara" "Ubuntu" "bionic" -check_alt "Linux Mint" "tessa" "Ubuntu" "bionic" -check_alt "Linux Mint" "tina" "Ubuntu" "bionic" -check_alt "Linux Mint" "tricia" "Ubuntu" "bionic" -check_alt "Linux Mint" "ulyana" "Ubuntu" "focal" -check_alt "Linux Mint" "ulyssa" "Ubuntu" "focal" -check_alt "LMDE" "betsy" "Debian" "jessie" -check_alt "LMDE" "cindy" "Debian" "stretch" -check_alt "LMDE" "debbie" "Debian" "buster" -check_alt "elementaryOS" "luna" "Ubuntu" "precise" -check_alt "elementaryOS" "freya" "Ubuntu" "trusty" -check_alt "elementaryOS" "loki" "Ubuntu" "xenial" -check_alt "elementaryOS" "juno" "Ubuntu" "bionic" -check_alt "elementaryOS" "hera" "Ubuntu" "bionic" -check_alt "elementaryOS" "odin" "Ubuntu" "focal" -check_alt "Trisquel" "toutatis" "Ubuntu" "precise" -check_alt "Trisquel" "belenos" "Ubuntu" "trusty" -check_alt "Trisquel" "flidas" "Ubuntu" "xenial" -check_alt "Trisquel" "etiona" "Ubuntu" "bionic" -check_alt "Uruk GNU/Linux" "lugalbanda" "Ubuntu" "xenial" -check_alt "BOSS" "anokha" "Debian" "wheezy" -check_alt "BOSS" "anoop" "Debian" "jessie" -check_alt "BOSS" "drishti" "Debian" "stretch" -check_alt "BOSS" "unnati" "Debian" "buster" -check_alt "bunsenlabs" "bunsen-hydrogen" "Debian" "jessie" -check_alt "bunsenlabs" "helium" "Debian" "stretch" -check_alt "bunsenlabs" "lithium" "Debian" "buster" -check_alt "Tanglu" "chromodoris" "Debian" "jessie" -check_alt "PureOS" "green" "Debian" "sid" -check_alt "PureOS" "amber" "Debian" "buster" -check_alt "Devuan" "jessie" "Debian" "jessie" -check_alt "Devuan" "ascii" "Debian" "stretch" -check_alt "Devuan" "beowulf" "Debian" "buster" -check_alt "Devuan" "ceres" "Debian" "sid" -check_alt "Deepin" "panda" "Debian" "sid" -check_alt "Deepin" "unstable" "Debian" "sid" -check_alt "Deepin" "stable" "Debian" "buster" -check_alt "Pardus" "onyedi" "Debian" "stretch" -check_alt "Liquid Lemur" "lemur-3" "Debian" "stretch" -check_alt "Astra Linux" "orel" "Debian" "stretch" -check_alt "Ubilinux" "dolcetto" "Debian" "stretch" - -if [ "X${DISTRO}" == "Xdebian" ]; then - print_status "Unknown Debian-based distribution, checking /etc/debian_version..." - NEWDISTRO=$([ -e /etc/debian_version ] && cut -d/ -f1 < /etc/debian_version) - if [ "X${NEWDISTRO}" == "X" ]; then - print_status "Could not determine distribution from /etc/debian_version..." - else - DISTRO=$NEWDISTRO - print_status "Found \"${DISTRO}\" in /etc/debian_version..." - fi -fi - -print_status "Confirming \"${DISTRO}\" is supported..." - -if [ -x /usr/bin/curl ]; then - exec_cmd_nobail "curl -sLf -o /dev/null 'https://deb.nodesource.com/${NODEREPO}/dists/${DISTRO}/Release'" - RC=$? -else - exec_cmd_nobail "wget -qO /dev/null -o /dev/null 'https://deb.nodesource.com/${NODEREPO}/dists/${DISTRO}/Release'" - RC=$? -fi - -if [[ $RC != 0 ]]; then - print_status "Your distribution, identified as \"${DISTRO}\", is not currently supported, please contact NodeSource at https://github.com/nodesource/distributions/issues if you think this is incorrect or would like your distribution to be considered for support" - exit 1 -fi - -if [ -f "/etc/apt/sources.list.d/chris-lea-node_js-$DISTRO.list" ]; then - print_status 'Removing Launchpad PPA Repository for NodeJS...' - - exec_cmd_nobail 'add-apt-repository -y -r ppa:chris-lea/node.js' - exec_cmd "rm -f /etc/apt/sources.list.d/chris-lea-node_js-${DISTRO}.list" -fi - -print_status 'Adding the NodeSource signing key to your keyring...' - -if [ -x /usr/bin/curl ]; then - exec_cmd 'curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -' -else - exec_cmd 'wget -qO- https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -' -fi - -print_status "Creating apt sources list file for the NodeSource ${NODENAME} repo..." - -exec_cmd "echo 'deb https://deb.nodesource.com/${NODEREPO} ${DISTRO} main' > /etc/apt/sources.list.d/nodesource.list" -exec_cmd "echo 'deb-src https://deb.nodesource.com/${NODEREPO} ${DISTRO} main' >> /etc/apt/sources.list.d/nodesource.list" - -print_status 'Running `apt-get update` for you...' - -exec_cmd 'apt-get update' - -print_status """Run \`${bold}sudo apt-get install -y ${NODEPKG}${normal}\` to install ${NODENAME} and npm -## You may also need development tools to build native addons: - sudo apt-get install gcc g++ make -## To install the Yarn package manager, run: - curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - - echo \"deb https://dl.yarnpkg.com/debian/ stable main\" | sudo tee /etc/apt/sources.list.d/yarn.list - sudo apt-get update && sudo apt-get install yarn -""" - -} - -## Defer setup until we have the complete script -setup diff --git a/api/src/docker/openscad/runScad.js b/api/src/docker/openscad/runScad.js index b822723..b3a84f0 100644 --- a/api/src/docker/openscad/runScad.js +++ b/api/src/docker/openscad/runScad.js @@ -1,6 +1,4 @@ -const { exec } = require('child_process') -const { promises } = require('fs') -const { writeFile } = promises +const { makeFile, runCommand } = require('../common/utils') const { nanoid } = require('nanoid') module.exports.runScad = async ({ @@ -14,7 +12,7 @@ module.exports.runScad = async ({ } = {}, } = {}, // TODO add view settings } = {}) => { - const tempFile = await makeFile(file) + const tempFile = await makeFile(file, '.scad', nanoid) const { x: rx, y: ry, z: rz } = rotation const { x: px, y: py, z: pz } = position const cameraArg = `--camera=${px},${py},${pz},${rx},${ry},${rz},${dist}` @@ -30,7 +28,7 @@ module.exports.runScad = async ({ } module.exports.stlExport = async ({ file } = {}) => { - const tempFile = await makeFile(file) + const tempFile = await makeFile(file, '.scad', nanoid) try { const result = await runCommand( @@ -42,36 +40,3 @@ module.exports.stlExport = async ({ file } = {}) => { return { error, tempFile } } } - -async function makeFile(file) { - const tempFile = 'a' + nanoid() // 'a' ensure nothing funny happens if it start with a bad character like "-", maybe I should pick a safer id generator :shrug: - console.log(`file to write: ${file}`) - - await runCommand(`mkdir /tmp/${tempFile}`) - await writeFile(`/tmp/${tempFile}/main.scad`, file) - return tempFile -} - -async function runCommand(command, timeout = 5000) { - return new Promise((resolve, reject) => { - exec(command, (error, stdout, stderr) => { - if (error) { - console.log(`error: ${error.message}`) - console.log(`stderr: ${stderr}`) - console.log(`stdout: ${stdout}`) - reject(stdout || stderr) // it seems random if the message is in stdout or stderr, but not normally both - return - } - if (stderr) { - console.log(`stderr: ${stderr}`) - resolve(stderr) - return - } - console.log(`stdout: ${stdout}`) - resolve(stdout) - }) - setTimeout(() => { - reject('timeout') - }, timeout) - }) -} -- 2.39.5 From 4702bafc2711bed4828ef05ec4b8ad1b54537554 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Fri, 23 Apr 2021 16:32:22 +1000 Subject: [PATCH 07/14] Set up staging/preview cad base url --- api/src/docker/cadquery/package-lock.json | 944 ---------------------- api/src/docker/openscad/package-lock.json | 944 ---------------------- netlify.toml | 3 + redwood.toml | 2 +- web/src/helpers/cadPackages/common.js | 2 +- 5 files changed, 5 insertions(+), 1890 deletions(-) delete mode 100644 api/src/docker/cadquery/package-lock.json delete mode 100644 api/src/docker/openscad/package-lock.json diff --git a/api/src/docker/cadquery/package-lock.json b/api/src/docker/cadquery/package-lock.json deleted file mode 100644 index 776fa2d..0000000 --- a/api/src/docker/cadquery/package-lock.json +++ /dev/null @@ -1,944 +0,0 @@ -{ - "name": "openscad-endpoint", - "version": "0.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/aws-lambda": { - "version": "8.10.72", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.72.tgz", - "integrity": "sha512-jOrTwAhSiUtBIN/QsWNKlI4+4aDtpZ0sr2BRvKW6XQZdspgHUSHPcuzxbzCRiHUiDQ+0026u5TSE38VyIhNnfA==" - }, - "@types/http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-i18n": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-3.6.0.tgz", - "integrity": "sha512-F21DzmzYq9aVtY8CGGtlnQDy3rFMaFW2KRlMuCQp76KiPIkvqN+mpq5MI9EsgC0VFwj+jeLIsvVCvPOa1sobBQ==" - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-lambda-ric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/aws-lambda-ric/-/aws-lambda-ric-1.0.0.tgz", - "integrity": "sha512-1a7oCloj2uIui41RMMRRVlf/bIiRQt7UlmfY7+NpuEyal5bnpj4RMooErq3Q8jOBSmX4pqP6KeRScv7uV2Ep1w==", - "dev": true, - "requires": { - "node-addon-api": "3.0.2", - "node-gyp": "7.1.2" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "busboy": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", - "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", - "requires": { - "dicer": "0.3.0" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "dicer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", - "requires": { - "streamsearch": "0.1.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-mask": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/json-mask/-/json-mask-0.3.9.tgz", - "integrity": "sha512-RRu7bf7vzOohKMrU5pD9+fROMltTegWj2trZlPNr7hXekptFGkOZo4S63Jdx2X1GR7IK6rEVvXkQKY+2TPs0PA==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "middy": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/middy/-/middy-0.36.0.tgz", - "integrity": "sha512-IhIVEZQs8mxcvPHfzAQpwINj4R+aVgeCcUL9KS+OYE5Vy4hKhZtVl/1yfI8dSvDAfRBoRp6N/Gi04pxQM4vAzw==", - "requires": { - "@types/aws-lambda": "^8.10.45", - "@types/http-errors": "^1.6.3", - "ajv": "^6.9.1", - "ajv-i18n": "^3.4.0", - "ajv-keywords": "^3.4.1", - "busboy": "^0.3.1", - "content-type": "^1.0.4", - "http-errors": "^1.7.3", - "json-mask": "^0.3.8", - "negotiator": "^0.6.1", - "once": "^1.4.0", - "qs": "^6.6.0", - "querystring": "^0.2.0" - }, - "dependencies": { - "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" - } - } - }, - "mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", - "dev": true, - "requires": { - "mime-db": "1.46.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "node-addon-api": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz", - "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==", - "dev": true - }, - "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } -} diff --git a/api/src/docker/openscad/package-lock.json b/api/src/docker/openscad/package-lock.json deleted file mode 100644 index 776fa2d..0000000 --- a/api/src/docker/openscad/package-lock.json +++ /dev/null @@ -1,944 +0,0 @@ -{ - "name": "openscad-endpoint", - "version": "0.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/aws-lambda": { - "version": "8.10.72", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.72.tgz", - "integrity": "sha512-jOrTwAhSiUtBIN/QsWNKlI4+4aDtpZ0sr2BRvKW6XQZdspgHUSHPcuzxbzCRiHUiDQ+0026u5TSE38VyIhNnfA==" - }, - "@types/http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-i18n": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-3.6.0.tgz", - "integrity": "sha512-F21DzmzYq9aVtY8CGGtlnQDy3rFMaFW2KRlMuCQp76KiPIkvqN+mpq5MI9EsgC0VFwj+jeLIsvVCvPOa1sobBQ==" - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-lambda-ric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/aws-lambda-ric/-/aws-lambda-ric-1.0.0.tgz", - "integrity": "sha512-1a7oCloj2uIui41RMMRRVlf/bIiRQt7UlmfY7+NpuEyal5bnpj4RMooErq3Q8jOBSmX4pqP6KeRScv7uV2Ep1w==", - "dev": true, - "requires": { - "node-addon-api": "3.0.2", - "node-gyp": "7.1.2" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "busboy": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", - "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", - "requires": { - "dicer": "0.3.0" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "dicer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", - "requires": { - "streamsearch": "0.1.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-mask": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/json-mask/-/json-mask-0.3.9.tgz", - "integrity": "sha512-RRu7bf7vzOohKMrU5pD9+fROMltTegWj2trZlPNr7hXekptFGkOZo4S63Jdx2X1GR7IK6rEVvXkQKY+2TPs0PA==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "middy": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/middy/-/middy-0.36.0.tgz", - "integrity": "sha512-IhIVEZQs8mxcvPHfzAQpwINj4R+aVgeCcUL9KS+OYE5Vy4hKhZtVl/1yfI8dSvDAfRBoRp6N/Gi04pxQM4vAzw==", - "requires": { - "@types/aws-lambda": "^8.10.45", - "@types/http-errors": "^1.6.3", - "ajv": "^6.9.1", - "ajv-i18n": "^3.4.0", - "ajv-keywords": "^3.4.1", - "busboy": "^0.3.1", - "content-type": "^1.0.4", - "http-errors": "^1.7.3", - "json-mask": "^0.3.8", - "negotiator": "^0.6.1", - "once": "^1.4.0", - "qs": "^6.6.0", - "querystring": "^0.2.0" - }, - "dependencies": { - "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" - } - } - }, - "mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", - "dev": true, - "requires": { - "mime-db": "1.46.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "node-addon-api": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz", - "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==", - "dev": true - }, - "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } -} diff --git a/netlify.toml b/netlify.toml index d7baac8..6d9ea29 100644 --- a/netlify.toml +++ b/netlify.toml @@ -10,3 +10,6 @@ functions = "api/dist/functions" from = "/*" to = "/index.html" status = 200 + +[context.deploy-preview.environment] + CAD_LAMBDA_BASE_URL = "https://t7wdlz8ztf.execute-api.us-east-1.amazonaws.com/dev2" diff --git a/redwood.toml b/redwood.toml index c4fe771..6502c5d 100644 --- a/redwood.toml +++ b/redwood.toml @@ -8,7 +8,7 @@ [web] port = 8910 apiProxyPath = "/.netlify/functions" - includeEnvironmentVariables = ['GOOGLE_ANALYTICS_ID', 'CLOUDINARY_API_KEY', 'CLOUDINARY_API_SECRET'] + includeEnvironmentVariables = ['GOOGLE_ANALYTICS_ID', 'CLOUDINARY_API_KEY', 'CLOUDINARY_API_SECRET', 'CAD_LAMBDA_BASE_URL'] # experimentalFastRefresh = true # this seems to break cascadeStudio [api] port = 8911 diff --git a/web/src/helpers/cadPackages/common.js b/web/src/helpers/cadPackages/common.js index 7b14c0f..d52b0b8 100644 --- a/web/src/helpers/cadPackages/common.js +++ b/web/src/helpers/cadPackages/common.js @@ -1,3 +1,3 @@ export const lambdaBaseURL = process.env.CAD_LAMBDA_BASE_URL || - 'https://t7wdlz8ztf.execute-api.us-east-1.amazonaws.com/dev2' + 'https://t7wdlz8ztf.execute-api.us-east-1.amazonaws.com/dev' -- 2.39.5 From 76a570b0c38714c6731acd83cbd533da6781ad3e Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Mon, 26 Apr 2021 07:48:52 +1000 Subject: [PATCH 08/14] Init multiple types of cadPackages --- api/src/docker/aws-emulator.js | 31 ++++--- web/package.json | 1 + web/src/Routes.js | 2 +- web/src/components/IdeEditor/IdeEditor.js | 20 +---- .../components/IdeToolbarNew/IdeToolbarNew.js | 34 +++++--- .../NavPlusButton/NavPlusButton.tsx | 48 +++++++++++ .../helpers/cadPackages/openScadController.js | 3 + web/src/helpers/hooks/useIdeState.js | 83 ++++++++++++------- web/src/layouts/MainLayout/MainLayout.js | 5 +- web/src/pages/DevIdePage/DevIdePage.js | 11 ++- yarn.lock | 5 ++ 11 files changed, 159 insertions(+), 84 deletions(-) create mode 100644 web/src/components/NavPlusButton/NavPlusButton.tsx diff --git a/api/src/docker/aws-emulator.js b/api/src/docker/aws-emulator.js index 9885cc1..fae018d 100644 --- a/api/src/docker/aws-emulator.js +++ b/api/src/docker/aws-emulator.js @@ -1,6 +1,7 @@ const express = require('express') var cors = require('cors') const axios = require('axios') +const { restart } = require('nodemon') const app = express() const port = 8080 app.use(express.json()) @@ -10,19 +11,29 @@ const invocationURL = (port) => `http://localhost:${port}/2015-03-31/functions/function/invocations` app.post('/openscad/preview', async (req, res) => { - const { data } = await axios.post(invocationURL(5052), { - body: Buffer.from(JSON.stringify(req.body)).toString('base64'), - }) - res.status(data.statusCode) - res.send(data.body) + try { + const { data } = await axios.post(invocationURL(5052), { + body: Buffer.from(JSON.stringify(req.body)).toString('base64'), + }) + res.status(data.statusCode) + res.send(data.body) + } catch (e) { + res.status(500) + res.send() + } }) app.post('/cadquery/stl', async (req, res) => { console.log('making post request to 5060') - const { data } = await axios.post(invocationURL(5060), { - body: Buffer.from(JSON.stringify(req.body)).toString('base64'), - }) - res.status(data.statusCode) - res.send(data.body) + try { + const { data } = await axios.post(invocationURL(5060), { + body: Buffer.from(JSON.stringify(req.body)).toString('base64'), + }) + res.status(data.statusCode) + res.send(data.body) + } catch (e) { + res.status(500) + res.send() + } }) app.listen(port, () => { diff --git a/web/package.json b/web/package.json index 1c627c8..7aa3247 100644 --- a/web/package.json +++ b/web/package.json @@ -13,6 +13,7 @@ ] }, "dependencies": { + "@headlessui/react": "^1.0.0", "@material-ui/core": "^4.11.0", "@monaco-editor/react": "^4.0.11", "@redwoodjs/auth": "^0.30.1", diff --git a/web/src/Routes.js b/web/src/Routes.js index dd9d3dc..e7ec58d 100644 --- a/web/src/Routes.js +++ b/web/src/Routes.js @@ -35,7 +35,7 @@ const Routes = () => { ) return ( - + diff --git a/web/src/components/IdeEditor/IdeEditor.js b/web/src/components/IdeEditor/IdeEditor.js index bbc0edd..498ba9d 100644 --- a/web/src/components/IdeEditor/IdeEditor.js +++ b/web/src/components/IdeEditor/IdeEditor.js @@ -12,25 +12,6 @@ const IdeEditor = () => { openScad: 'cpp', } - const scriptKey = 'encoded_script' - useEffect(() => { - // load code from hash if it's there - let hash - if (isBrowser) { - hash = window.location.hash - } - const [key, scriptBase64] = hash.slice(1).split('=') - if (key === scriptKey) { - const script = atob(scriptBase64) - thunkDispatch({ type: 'updateCode', payload: script }) - } - }, []) - useEffect(() => { - if (isBrowser) { - window.location.hash = '' - } - }, [state.code]) - function handleCodeChange(value, _event) { thunkDispatch({ type: 'updateCode', payload: value }) } @@ -61,6 +42,7 @@ const IdeEditor = () => { . . . loading
}> { +const IdeToolbarNew = ({ cadPackage }) => { const [state, thunkDispatch] = useIdeState() - function setIdeType(ide) { - thunkDispatch({ type: 'setIdeType', payload: { message: ide } }) - } + const scriptKey = 'encoded_script' + useEffect(() => { + thunkDispatch({ + type: 'initIde', + payload: { cadPackage }, + }) + // load code from hash if it's there + let hash + if (isBrowser) { + hash = window.location.hash + } + const [key, scriptBase64] = hash.slice(1).split('=') + if (key === scriptKey) { + const script = atob(scriptBase64) + thunkDispatch({ type: 'updateCode', payload: script }) + } + window.location.hash = '' + setTimeout(() => handleRender()) // definitely a little hacky, timeout with no delay is just to push it into the next event loop. + }, [cadPackage]) function handleRender() { thunkDispatch((dispatch, getState) => { const state = getState() @@ -37,14 +53,6 @@ const IdeToolbarNew = () => {